1. 程式人生 > >在PLSQL塊中執行SQL語句

在PLSQL塊中執行SQL語句

PLSQL塊中執行SQL語句

A.   資料定義DDL

create,drop,truncate,不能直接執行,truncate執行時只做資料刪除,不寫日起,不維護索引

在PLSQL塊中執行字串SQL語句

注意:在PL/SQL塊中可以直接執行,通常沒有必要,除非表名和欄位名是動態的。

Execute immediate “DDL語句”

Execute immediate “select 語句” into 變數名

DECLARE

       my_sql VARCHAR2(200);

       my_row emp%ROWTYPE;

BEGIN

     my_sql :='select * from emp where empno = 7788';

     EXECUTE IMMEDIATE my_sql INTO my_row;

     dbms_output.put_line(my_row.ename);

END;

Open cursor變數 for “select語句”

DECLARE

       TYPE cur_type IS REF CURSOR;

       my_sql VARCHAR2(200);

       my_cur cur_type;

       my_row emp%ROWTYPE;

BEGIN

     my_sql :='SELECT * FROM emp WHERE sal >= 3000';

     OPEN my_cur FOR my_sql;

     FETCH my_cur INTO my_row;

     WHILE(my_cur%FOUND)

     LOOP

         dbms_output.put_line(my_row.ename);

         FETCH my_cur INTO my_row;

     END LOOP;

     CLOSE my_cur;

END;

B.   資料修改DML

insert,delete,update,可直接執行,通過SQL物件返回影響行數

SQL物件:儲存增刪改語句執丟後的狀態

SQL%ROWCOUNT

影響行數

SQL%FOUND 有資料

C.   資料查詢:

查詢單行:使用select into語句,返回一行記錄正常執行,0行或多行需要捕捉異常

捕捉異常

DECLARE

       my_row emp%ROWTYPE;

BEGIN

     SELECT *

     INTO my_row

     FROM EMP

     WHERE empno = 7788;

     dbms_output.put_line(my_row.EMPNO||'   '||my_row.ENAME);

     EXCEPTION

     WHEN no_data_found THEN

          dbms_output.put_line('沒有該工號!');

     WHEN too_many_rows THEN

          dbms_output.put_line('多個員工使用一個工號!');

     WHEN OTHERS THEN

          dbms_output.put_line(Sqlcode||'  '||SQLERRM);    

END;

實際應用時通過影響行數來判斷

Declare I number begin select count(*) into I form emp where empno = 7788 if(I=1) then…

查詢多行:使用顯示遊標,迴圈取出每條資料(for迴圈和cursor)

需要對查詢中每條記錄進行逐條處理時使用

遊標:物件或查詢資料所在的記憶體地址

----用FOR迴圈

BEGIN

     FOR temp IN(SELECT ename FROM emp WHERE sal >= 3000)

     LOOP

         dbms_output.put_line(temp.ename);

     END LOOP;

END;

----用cursor

DECLARE

       CURSOR my_cur IS SELECT ename FROM emp WHERE sal >= 3000;

       my_row my_cur%ROWTYPE;

BEGIN

     OPEN my_cur;

     FETCH my_cur INTO my_row;

     WHILE(my_cur%FOUND)

     LOOP

         dbms_output.put_line(my_row.ename);

         FETCH my_cur INTO my_row;

     END LOOP;

     CLOSE my_cur;

END;