直接上代码create or replace procedure test_cursor(p_1 in number,out_cursor out SYS_REFCURSOR)
as
begin
open out_cursor for
select t.* from emp t;
end;
这样是可以返回数据集的 但问题是 数据库是从DB2转到oracle里来 以前的程序都是针对db2的 所以存储过程名 参数都定好了。 比如说以前的在DB2里的存储过程 test_cursor 是只有number这个参数的 但到oracle里必须要加个输出参数(游标)--out_cursor out SYS_REFCURSOR, 那这样的话就的改程序了。 所以请教下 能不能将上面的代码改写成 输出游标 不作为参数 。 当然前提是不要用包。例如:create procedure test_cursor(p_1 in number) as
/*declare cur cursor with return for
select Uid,UserId,SendNum from userfee where uid in (select Uid from userdata where ucase(loginid)=ucase(piLoginId) and ucase(UserId)<>ucase(piLoginId)) order by uid;
open cur;*/ 这是DB2的写法
as
begin
open out_cursor for
select t.* from emp t;
end;
这样是可以返回数据集的 但问题是 数据库是从DB2转到oracle里来 以前的程序都是针对db2的 所以存储过程名 参数都定好了。 比如说以前的在DB2里的存储过程 test_cursor 是只有number这个参数的 但到oracle里必须要加个输出参数(游标)--out_cursor out SYS_REFCURSOR, 那这样的话就的改程序了。 所以请教下 能不能将上面的代码改写成 输出游标 不作为参数 。 当然前提是不要用包。例如:create procedure test_cursor(p_1 in number) as
/*declare cur cursor with return for
select Uid,UserId,SendNum from userfee where uid in (select Uid from userdata where ucase(loginid)=ucase(piLoginId) and ucase(UserId)<>ucase(piLoginId)) order by uid;
open cur;*/ 这是DB2的写法
as
v1 emp.col1%type;
v2 emp.col2%type;
v3 emp.col3%type;
begin
open out_cursor for
select col1,col2,col3 from emp t where col=p_1;
loop
fetch out_cursor into v1,v2,v3;
exit when out_cursor%notfound;
dbms_output.put_line('col1的结果'||to_char(v1)||' '||'col2的结果'||to_char(v2)||' '||'col3的结果'||to_char(v3))
end loop;
end;
--忘记释放游标了
create or replace procedure test_cursor(p_1 in number,out_cursor out SYS_REFCURSOR)
as
v1 emp.col1%type;
v2 emp.col2%type;
v3 emp.col3%type;
begin
open out_cursor for
select col1,col2,col3 from emp t where col=p_1;
loop
fetch out_cursor into v1,v2,v3;
exit when out_cursor%notfound;
dbms_output.put_line('col1的结果'||to_char(v1)||' '||'col2的结果'||to_char(v2)||' '||'col3的结果'||to_char(v3))
end loop;
close out_cursor;
end;
CREATE OR REPLACE FUNCTION test_cursor(p_1 IN NUMBER) RETURN SYS_REFCURSOR IS
out_cursor SYS_REFCURSOR;
BEGIN
OPEN out_cursor FOR
SELECT t.* FROM emp t;
RETURN out_cursor;
END;
oracle貌似还没这么fashion
等高手吧
create or replace procedure test_cursor(p_1 in number,out_cursor out SYS_REFCURSOR)
as
v1 emp.col1%type;
v2 emp.col2%type;
v3 emp.col3%type;
begin
open out_cursor for
select col1,col2,col3 from emp t where col=p_1;
for out_cursor_rec in out_cursor
loop
v1:=out_cursor_rec.col1;
v2:=out_cursor_rec.col2;
v3:=out_cursor_rec.col3;
dbms_output.put_line('col1的结果'||to_char(v1)||' '||'col2的结果'||to_char(v2)||' '||'col3的结果'||to_char(v3));
end loop;
close out_cursor;
end;
is
type t_cursor is ref cursor;
procedure retcur(
P_CODE varchar2,
P_MESSAGE out varchar2,
P_SQLSTATUS out varchar2,
P_RES out t_cursor
);end PagePK;
/CREATE OR REPLACE package BODY PagePK
is
procedure retcur
(
P_CODE varchar2,
P_MESSAGE out varchar2,
P_SQLSTATUS out varchar2,
P_RES out t_cursor
)
is
P_SQLSTATUS:='0';
P_MESSAGE:='执行成功';begin
null;open P_RES for select *.....;Exception
WHEN OTHERS
Then
P_SQLSTATUS:='-1';
P_MESSAGE:=' (CCGC.GJDM)系统错误:SQLCODE=' || to_CHAR(SQLCODE)||' '; end retcur;end PagePK;
open P_RES for select *.....; 可以提高查询速度
("PIUID" IN NUMBER,
"PILASTDBREMAINED" IN NUMBER,
"PIREMAINED" IN NUMBER,
"PIPREPAYUSED" IN NUMBER,
"PIPOSTPAYUSED" IN NUMBER,
out_cursor out SYS_REFCURSOR
)
AS
BEGIN
OPEN out_cursor FOR
SELECT SENDNUM-piPrePayUsed as sendnum from userfee where uid=piUid;
end;
比如这样 也没用到包 这样可以不?