如果你用的是 Oracle 8i 及以上的版本,那簡單,在過程中用 execute immediate sql_str 就行, sql_str 是一個拼湊的 SQL 語句,
如果你用的是 Oracle 8i 及以上的版本,那簡單,在過程中用 execute immediate sql_str 就行, sql_str 是一個拼湊的 SQL 語句,但這個動態語句中帶參數,或 Select 的結果要 into 到變量中時就要稍加留心一下了。而在 8i 以前的版本(誰還用這么古老的玩藝,總有些不得已的地方,老系統考慮升級成本遺留下來的,應用軟件所伴隨著的等),都沒法用 execute immediate,,就得使用 DBMS_SQL 包來實現了
何謂動態 SQL 和 DDL 語句呢?通常在過程中要操作的表名、字段名都必須是明確的,否則編譯過程時就要報錯,但如果這兩者也用變量名來表示就是動態的。DDL 就是數據庫對象定義的操作,如 CREATE TABLE/VIEW/INDEX/SYN/CLUSTER……,及這些對象的刪除、修改操作等等。
比如在 Oracle 中有執行下面過程塊的意圖時,就要使用到 execute immediate 或是 DBMS_SQL 包了。當然下面的語句塊是通不過的。
declare
col_name varchar2(30) := 'name'; --假定表user存在name字段
col_val varchar2(30);
begin
select col_name into col_val --按照慣常思維,可能就會這么寫
from user where age between 18 and 25; --編譯時會提示列名不存在的
drop table t2; --不能直接執行 DDL 語句,后面查詢 t2 編譯器就無能為力了
end;
現在我們提出對上面問題的解,針對第一個 Select 語句來說明,并假設查詢中還帶有參數。塊中的 DDL 也是類似的解法。例子因力圖涵蓋更多內容,所以稍顯復雜,如果不需要 into (如 update/delete 語句),或者不帶參數,會簡單多了,應不難簡化。有兩種處理方法,以 8i 為分水嶺。
1. Oracle 8i 及以上版本的過程中處理動態 SQL 語句的辦法
declare
v_col_name varchar2(30) := 'name'; --字段名 name 用變量來表示
v_user_name varchar2(30); --用戶名稱
v_user_age integer; --用戶年齡
v_sql_str varchar2(500); --動態 SQL 語句
begin
v_sql_str := 'select '||v_col_name||',age from users --字段名后面不能緊隨 into 到變量了
where age between :start_age and :end_age and rownum=1'; --兩個命名參數
--用 execute immediate 動態執行 SQL 語句
--注意其后的 into 字段值到變量的寫法,還有 using 來代入參數
execute immediate v_sql_str into v_user_name,v_user_age using 18,25;
dbms_output.put_line('第一個符合條件的用戶:'||v_user_name||',年齡:'||v_user_age);
end;
除此之外,在 Oracle 8i 及以上版本中,還能用 DBMS_UTILITY.EXEC_DDL_STATEMENT(ddl_sql_str) 執行 DDL 語句。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com