游標,動態,for迴圈

2021-06-05 22:53:37 字數 3090 閱讀 7414

--小測:輸出各部門員工的部門名稱和工號、姓名,工資。

要求:各部門工資最高的放在前面

在「dallas」地方的部門名稱後加上「*」。

·三種實現方式

1 通過顯式游標

2 通過for迴圈

3 通過動態sql方式

----------------------------------------顯示游標

declare

type emp_dept is record(

name dept.dname%type,

loc dept.loc%type,

empno emp.empno%type,

ename emp.ename%type,

sal emp.sal%type);

emp_table emp_dept;

cursor cur_emp is

select d.dname, d.loc, e.empno, e.ename, e.sal

from emp e, dept d

where d.deptno = e.deptno

order by e.deptno, e.sal desc;

begin

open cur_emp;

fetch cur_emp

into emp_table;

loop

if emp_table.loc = 'dallas' then

dbms_output.put_line(emp_table.loc || '*' || '-->' || emp_table.name ||

'-->' || emp_table.empno || '-->' ||

emp_table.sal);

else

dbms_output.put_line(emp_table.loc || '-->' || emp_table.name ||

'-->' || emp_table.empno || '-->' ||

emp_table.sal);

end if;

fetch cur_emp

into emp_table;

exit when cur_emp%notfound;

end loop;

close cur_emp;

end;

----不用if else

begin

for x in (select(case when d.loc='dallas'

then d.loc||'*' else d.loc

end),d.dname,e.empno,e.ename,e.sal from emp e,dept d where d.deptno=e.deptno order by e.deptno,e.sal desc)

loop

dbms_output.put_line(x.loc||'-->'||x.dname||'-->'||x.empno||'-->'||x.sal);

end loop;

end;

-------------------------------

for迴圈

begin

for x in (select d.dname,d.loc,e.empno,e.ename,e.sal from emp e,dept d where d.deptno=e.deptno order by e.deptno,e.sal desc)

loop

if x.loc='dallas' then

x.loc:=x.loc||'*';

end if;

dbms_output.put_line(x.loc||'-->'||x.dname||'-->'||x.empno||'-->'||x.sal);

end loop;

end;

-------------------------------動態sql

declare

cursor cur_emp is select d.dname, d.loc, e.empno, e.ename, e.sal

from emp e, dept d

where d.deptno = e.deptno

order by e.deptno, e.sal desc;

type emp_table_type is table of cur_emp%rowtype index by binary_integer;

emp_table emp_table_type;

str_sql varchar2(1000);

begin

str_sql := 'select d.dname, d.loc, e.empno, e.ename, e.sal

from emp e, dept d

where d.deptno = e.deptno

order by e.deptno, e.sal desc';

execute immediate str_sql bulk collect into emp_table;

for i in 1 .. emp_table.count

loop

if emp_table(i).loc = 'dallas' then

dbms_output.put_line(emp_table(i).loc || '*' || '-->' || emp_table(i).dname ||

'-->' || emp_table(i).empno || '-->' ||

emp_table(i).sal);

else

dbms_output.put_line(emp_table(i).loc || '-->' || emp_table(i).dname ||

'-->' || emp_table(i).empno || '-->' ||

emp_table(i).sal);

end if;

end loop;

end;

----還可以用記錄型別來做 如上 

游標,動態,for迴圈

小測 輸出各部門員工的部門名稱和工號 姓名,工資。要求 各部門工資最高的放在前面 在 dallas 地方的部門名稱後加上 三種實現方式 1 通過顯式游標 2 通過for迴圈 3 通過動態sql方式 顯示游標 declare type emp dept is record name dept.dnam...

Oracle動態游標實現動態SQL迴圈遍歷

動態游標可以遍歷動態的表,格式 type 游標型別 is ref cursor 定義乙個動態游標 游標名 游標型別 如果查詢的表的資料不同的,動態變化的,這時候可以用動態游標。需要注意的是,動態游標的定義,在普通儲存過程中 需要放在 is 後面的第一行。動態游標通過 open 游標 for 字串,形...

使用游標 游標FOR迴圈

游標for迴圈是在pl sql塊中使用游標最簡單的方式,它簡化了對游標的處理。當使用游標for迴圈時,oracle會隱含的開啟游標,提取游標資料並關閉游標。例子 顯示emp表所有雇員名及其工資 declare cursor emp cursor isselect ename,sal from emp...