Oracle學習筆記第十三天
阿新 • • 發佈:2019-01-05
Oracle學習筆記第十三天
靜態SQL和動態SQL
- 靜態SQL
- 需要在編寫PL/SQL程式時就確定的SQL語句
- 動態SQL
- 動態 SQL 是指在PL/SQL程式執行時生成的 SQL 語句
- DDL 語句命令和會話控制語句不能在PL/SQL 中直接使用,但是可以通過動態 SQL 來執行
- 編譯程式對動態 SQL 不做處理,而是在程式執行時動態構造語句、對語句進行語法分析並執行
注意:DDL和DCL語句不能直接用在靜態SQL,如果要用,可以用在動態SQL。
動態SQL實現方法:
方法1:
-
本地動態SQL:EXECUTE IMMEDIATE 語句執行
可以執行單行SQL,不能執行多行。
-
通過遊標實現
可以執行多行SQL
方法2:DBMS_SQL程式包
方法詳解:
-
EXECUTE IMMEDIATE 語句
-- 語法 EXECUTE IMMEDIATE dynamic_sql_string [INTO define_variable_list] [USING bind_argument_list];
解釋: dynamic_sql_string 是動態SQL 語句字串 INTO 子句用於接受SELECT語句選擇的記錄值 USING 子句用於繫結輸入引數變數
-- 舉例 -- 方式一 set serveroutput on; declare v_sql varchar2(200) := 'drop table emp2'; begin execute immediate v_sql; end; / -- 方式二 set serveroutput on; declare begin execute immediate 'drop table emp2'; end; /
set serveroutput on; declare v_sql varchar2(200) := 'select sal from emp where empno = :empno'
注意點:在定義這個變數SQL時,: 表示佔位符,後面跟自己定義的變數名,格式甚至可以是:‘ :1 ’ ,執行語句中into是儲存執行後的結果。
-
通過遊標實現動態SQL
-- 語法 TYPE type_cursor IS REF CURSOR [RETURN return_type]; cursor_name type_cursor; OPEN cursor_name FOR dynamic_sql_string [USING bind_argument_list];
解釋: dynamic_sql_string 是動態SQL 語句字串 USING 子句用於繫結輸入引數變數
-- 舉例 set serveroutput on; declare --定義引用遊標型別 type c_emp_type is ref cursor; --定義遊標變數 c_emp c_emp_type; --定義變數儲存查詢sql v_sql varchar(200); --定義變數儲存使用者輸入的部門編號 v_deptno number(4) := &部門編號; --定義變數儲存查詢結果 v_emp emp%rowtype; begin --確定查詢sql v_sql := 'select * from emp where deptno = :deptno'; --開啟遊標 open c_emp for v_sql using v_deptno; loop fetch c_emp into v_emp; exit when c_emp%notfound; dbms_output.put_line('工號:'||v_emp.empno|| '姓名:'||v_emp.ename|| '工資:'||v_emp.sal|| '部門編號:'||v_emp.deptno); end loop; --關閉遊標 close c_emp; end; /
-
通過DBMS_SQL程式包
實現步驟: 1. 將要執行的SQL 語句或一個語句塊放到一個字串變數中 2. 開啟游標(遊標) 3. 使用DBMS_SQL包的parse 過程來分析該字串 4. 使用DBMS_SQL包的bind_variable 過程來繫結變數 5. 使用DBMS_SQL包的execute 函式來執行語句 6. 關閉游標(遊標)
這個用的少,而且沒有上面的方法直接,所以暫不介紹。