PL SQL中使用DML 游標 動態SQL

2021-08-23 15:31:39 字數 3011 閱讀 3960

先申明我不是牛x,所有有錯的地方,希望廣大讀友能提醒俺一下!

1.兩個常用異常處理

declare

v_empno emp.empno%type;

v_ename emp.ename%type;

begin

v_empno:=&請輸入工號

select ename into v_ename

from emp e where e.empno!=v_empno;

dbms_output.put_line(v_ename);

exception

when no_data_found then

dbms_output.put_line('沒有資料!');

when too_many_rows then

dbms_output.put_line('行太多!'); 

end;

2.return使用,隱式游標。自動,用於返回單行結果集

注意:經俺親手測試,boolean不能列印輸出!

3.獲取指定員工資訊(是通過先做判斷資料是否存在,後在查詢)

declare

v_empno emp.empno%type;

v_row emp%rowtype;

v_count number(1);

begin

v_empno:=&請輸入工號;

select count(*) into v_count

from emp where empno=v_empno;

if(v_count=1)then           --先判斷

select * into v_row from emp e

where e.empno=v_empno;

dbms_output.put_line(v_row.ename||','||v_row.sal);

else

null;

end if;

end;

4.游標for迴圈(重點)需要對查詢中的每條記錄逐一處理時

例子:輸出員工不為7566的資訊

begin

for s in (select * from emp where empno!=7566)

loop

dbms_output.put_line(s.empno||','||s.ename||','||s.sal);

end loop;

end;

5.顯示游標,使用cursor游標物件

技巧:dofw [declare-open-fetch-while] (重點)

1)使用cursor游標物件步驟:

①定義游標      declare cursor游標物件名 is (sql); •

②定義行變數    行變數游標物件名%rowtype;

③開啟游標      open游標物件名;

④迴圈游標      fetch 游標物件名 into 行變數;

while(游標物件名%found)

loop...end loop;

⑤關閉游標  close;

2)示例:列印各部門資訊

declare

cursor my_cur is (select * from dept);

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.deptno||','||my_row.dname);

fetch my_cur into my_row;

end loop;

close my_cur;

end;

6.在pl/sql裡執行字串操作

1)execute語句    execute immediate'ddl語句'/ 'select語句'into變數

示例:建立一張表t_53

declare

v_sql varchar2(4000);  --在pl/sql操作列時,數值的長度<=4000byte

begin

v_sql:='create table t_53 (t_id number(2))';

execute immediate v_sql;

end;

2)執行多行查詢(open..for)

①游標變數(游標變數也是變數)

②變數需要定義型別

③型別需要自定義

示例:查詢工資大於3000的所有員工編號與名字

declare

type my_cur_type is ref cursor;                --型別需要自定義,這裡的型別是引用游標

my_cur_var my_cur_type;                                   --變數需要型別

my_row emp%rowtype;

begin

open my_cur_var for 'select * from emp where sal>=3000';  --游標變數也是變數

fetch my_cur_var into my_row;                             --後面與顯示游標相同

while(my_cur_var%found)

loop

dbms_output.put_line(my_row.empno||','||my_row.ename);

fetch my_cur_var into my_row;

end loop;

close my_cur_var;

end;

PL SQL 動態SQL 游標

1.使用動態sql可以在依賴物件不存在時建立子程式 2.動態sql主要利用execute immediate語句執行dml ddl dcl等語句操作 3.如果使用了繫結變數,則必須在execute immediate中使用using字句設定所需要的繫結變數 4.使用returning或return語...

PL SQL 游標使用

set serveroutput on declare 定義游標,預設輸入引數值為4000 cursor cur emp var sal in varchar2 4000 is select empno,ename,job from emp where sal var sal 定義record變數,...

避免在 PL SQL 中使用巢狀游標查詢

考慮下面的 pl sql 這段 生成乙個 xml 格式的矩陣樣式的報表 declare l count integer begin dbms output.put line generate matrix of parts by country forpart in select id,descri...