先說說動態SQL是什麼,看這句熟悉的:
select * from a_table where a_variable=a_declarevalue;
再寫句動態:
select * from a_table where a_variable=:a_dynamicvalue;
兩句的區別很明顯,後者多一個預留位置,這個以冒號開始的變數可以靈活地執行不同條件的where語句。
這是動態SQL語句的優勢,接下來的功能就是它的獨門功夫了--執行DDL,DCL語句。
例子,處理單行查詢:
DECLARE
sql_stat VARCHAR2(100);
emp_record tbl%ROWTYPE;
BEGIN
sql-stat:='SELECT * FROM tbl WHERE tblno=:no';
EXECUTE IMMEDIATE sql_stat INTO emp_record USING &1;
dbms_output.put_line(emp_record.ename||emp_record.sal);
END;
/
2 使用OPEN-FOR,FETCH 和 CLOSE 語句處理多行查詢
動態處理SELECT語句步驟:定義遊標->開啟遊標->迴圈提取資料->關閉遊標
定義:
TYPE cursortype IS REF CURSOR;
cursor_variable cursortype;
開啟:
OPEN cursor_variable FOR dynamic_string
[USING bind_argument[,bing_argument]...];
提取:
FETCH cursor_variable INTO {var1[,var2]...| recor_var};
關閉:
CLOSE cursor_variable;
顯示特定部門僱員姓名和工資
DECLARE
TYPE empcurtype IS REF CURSOR;
emp_cs empcurtype;
emp_record emptable%ROWTYPE;
sql_stat VARCHAR2(100);
BEGIN
sql_stat:='select * from emptable where deptno=:dno';
OPEN emp_cs FOR sql_stat USING &dno;
LOOP
FETCH emp_cs INTO emp_record;
EXIT WHEN emp_cs%NOTFOUND;
dbms_output.put_line(emp_record.ename||emp_record.sal);
END LOOP;
CLOSE emp_cs;
END;
/
3 使用批量動態SQL(9i)
BULK子句可以加快批量資料的處理速度。有三種語句支援BULK子句的方法。
1 使用EXECUTE IMMEDIATE,文法為:
EXECUTE IMMEDIATE dynamic_string
[BULK COLLECT INTO define_variable[,define_variable …]]
[USING [IN | OUT | IN OUT] bind_argument[,[IN | OUT \ IN OUT] bind_argumnet]…]
[{RETURNING | RETURN}
BULK COLLECT INTO return_variable[,return_variable…]];
用於DML處理多行子句,例子:為某部門所有員工增加%比的工資
DECLARE ……
BEGIN
sql_stat:='UPDATE emptbl SET sal=sal*(1+:percent/100)' ||
'WHERE deptno=:dno' ||
'RETURNING ename,sal INTO :name,:salary';
EXECUTE IMMEDIATE sql_stat USING &percent,&dno
RETURNING BULK COLLECT INTO ename_table,sal_table;
FOR i IN 1.ename_table.COUNT LOOP
dbms_output.put_line( ename_table(i) ||sal_table(i) );
END LOOP;
END;
/
2 FETCH語句,文法為
FETCH dynamic_cursor
BULK COLLECT INTO define_variable[,dyfine_variable ...];
3 FORALL語句。適用於DML,不適用於動態SELECT語句。FORALL語句要與E I 結合使用。文法為