1. 程式人生 > >Oracle學習筆記第十三天

Oracle學習筆記第十三天

Oracle學習筆記第十三天

靜態SQL和動態SQL

  1. 靜態SQL
    • 需要在編寫PL/SQL程式時就確定的SQL語句
  2. 動態SQL
    • 動態 SQL 是指在PL/SQL程式執行時生成的 SQL 語句
    • DDL 語句命令和會話控制語句不能在PL/SQL 中直接使用,但是可以通過動態 SQL 來執行
    • 編譯程式對動態 SQL 不做處理,而是在程式執行時動態構造語句、對語句進行語法分析並執行

注意:DDL和DCL語句不能直接用在靜態SQL,如果要用,可以用在動態SQL。

動態SQL實現方法:

方法1:

  • 本地動態SQL:EXECUTE IMMEDIATE 語句執行

    可以執行單行SQL,不能執行多行。

  • 通過遊標實現

    可以執行多行SQL

方法2:DBMS_SQL程式包

方法詳解:

  1. 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'
    ; v_sal emp.sal%type; --儲存查詢結果 begin --into指定用來儲存查詢結果的變數 --using用來給繫結變數賦值 execute immediate v_sql into v_sal using &工號; dbms_output.put_line('查詢到的工資為:'||v_sal); end; /

    注意點:在定義這個變數SQL時,: 表示佔位符,後面跟自己定義的變數名,格式甚至可以是:‘ :1 ’ ,執行語句中into是儲存執行後的結果。

  2. 通過遊標實現動態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;
    /
    
  3. 通過DBMS_SQL程式包

    實現步驟:
    1. 將要執行的SQL 語句或一個語句塊放到一個字串變數中
    2. 開啟游標(遊標)
    3. 使用DBMS_SQL包的parse 過程來分析該字串
    4. 使用DBMS_SQL包的bind_variable 過程來繫結變數
    5. 使用DBMS_SQL包的execute 函式來執行語句
    6. 關閉游標(遊標)
    

    這個用的少,而且沒有上面的方法直接,所以暫不介紹。