3 回答

TA貢獻1873條經驗 獲得超9個贊
Type p1_cursor is ref cursor;
是定義了一個動態游標類型叫p1_cursor ,如同number表示數字類型一樣。使用時要定義一個該類型的變量才可以,如:
varCur p1_cursor ;
然后再在程序體內部定義這個動態游標變量varCur是什么:
open varCur for 查詢語句。
這種定義 方式 通常用于查詢語句本身是個變量,比如根據不同的值確定從哪個表中來查時,表名是作為變量的,這時就必須使用動態游標了。在你這個簡單的應用中其實是不需要使用動態游標的。
你例中的游標是固定的查詢語句(select ename from emp),語句本身是固定的,即使加上查詢條件,也并不需要使用動態游標,這種情況下可以直接在程序頭declare段中定義即可:
cursor varCur(varName) is select ename from emp where ename=varname;
總結:1、動態游標需要先用定義type定義一個類型(如:Type p1_cursor is ref cursor),再使用這個類型定義一個游標變量(如:varCur p1_cursor);
2、動態游標一般用于查詢語句中有變量存在的情況,在程序體內部進行游標的查詢語句,如:
varSQL:='select ename from emp where ename=' || varName;
open varCur for varSQL;
3、直接使用cursor完全可以完成你例中的情況。這時是不需要用動態游標的。

TA貢獻1850條經驗 獲得超11個贊
--定義包頭
create or replace package p1 is
procedure pro_p1;
Type p1_cursor is ref cursor;
end p1;
--定義包體
create or replace package body p1 is
procedure pro_p1
is
s varchar2(100);
cur p1.p1_cursor;
begin
open cur for select ename from emp;
loop
fetch cur into s;
exit when cur%NOTFOUND;
dbms_output.put_line(s);
end loop;
exception
when no_data_found then
null;
end pro_p1;
end p1;
--調用存儲過程
begin
p1.pro_p1;
end;
--運行結果
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER

TA貢獻1799條經驗 獲得超9個贊
給你個例子,你看看吧,實在太多了
SQL> l
1 declare
2 cursor emp_cursor is
3 select ename from emp;
4 v_name emp.ename%type;
5 begin
6 open emp_cursor;
7 fetch emp_cursor into v_name;
8 while emp_cursor%found loop
9 dbms_output.put_line(v_name);
10 exit when emp_cursor%rowcount >= 5;
11 fetch emp_cursor into v_name;
12 end loop;
13 close emp_cursor;
14* end;
SQL> /
- 3 回答
- 0 關注
- 173 瀏覽
添加回答
舉報