--小測:輸出各部門員工的部門名稱和工號、姓名,工資。
要求:各部門工資最高的放在前面
在「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...