在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;