oracle自定义函数(里面用了游标),大家帮看下哪里错了

wangyang1983 2008-10-14 01:44:00
CREATE OR REPLACE FUNCTION GetChildPlace
(@pid in number
) RETURN @child TABLE(nid int)
AS
BEGIN
INSERT INTO @child(nid) values (@pid);
DECLARE @id number;
DECLARE
CURSOR cur IS SELECT id FROM tblPlace WHERE upid = @pid;
OPEN cur;
LOOP

FETCH cur INTO @id;
EXIT WHEN cur%NOTFOUND;
BEGIN
INSERT INTO @child (nid) SELECT nid FROM GetChildPlace(@id);
FETCH cur INTO @id;
END
END LOOP;
CLOSE cur;
RETURN
END GetChildPlace;
...全文
572 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyang1983 2008-10-15
  • 打赏
  • 举报
回复
但是fetch中有多个值,能fetch到变量中吗?
范佩西_11 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wangyang1983 的回复:]
我现在定义了一个函数:
create or replace function GetChildPlace(nid number)
return sys_refcursor
as
get_cur sys_refcursor;
begin
open get_cur for select id from tblplace
start with id=nid
connect by upid=prior id;
return get_cur;
end;
/

我现在想要实现的给一个ID,怎么判断这个ID是不是我这个函数读出的表里面的。请问怎么实现?
SQL> select * from tbltest where placeid in (select GetChild…
[/Quote]函数没错是你调用错误,函数返回值是游标类型,必须fetch cursor into 变量中 再调用。
wangyang1983 2008-10-15
  • 打赏
  • 举报
回复
我现在定义了一个函数:
create or replace function GetChildPlace(nid number)
return sys_refcursor
as
get_cur sys_refcursor;
begin
open get_cur for select id from tblplace
start with id=nid
connect by upid=prior id;
return get_cur;
end;
/

我现在想要实现的给一个ID,怎么判断这个ID是不是我这个函数读出的表里面的。请问怎么实现?
SQL> select * from tbltest where placeid in (select GetChildPlace(1) from dual);
select * from tbltest where placeid in (select GetChildPlace(1) from dual)
*
第 1 行出现错误:
ORA-00932: 数据类型不一致: 应为 -, 但却获得 CURSER

hyrongg ,我这个函数哪里错了?
wangyang1983 2008-10-14
  • 打赏
  • 举报
回复
hyrongg 这我还得好好研究研究,研究好了就结帖子,能加我吗?QQ:122741112
以后有问题的话还可以找你请教
wangyang1983 2008-10-14
  • 打赏
  • 举报
回复
这是创建一个包吗?
hyrongg 2008-10-14
  • 打赏
  • 举报
回复
给你一个游标返回结果集的例子:


create or replace package pkg_test
as
type myCursor is ref cursor;
function get(p_id number) return myCursor;
end pkg_test;

create or replace package body pkg_test
as
--输入ID 返回记录集的函数
function get(p_id number) return myCursor is
rc myCursor;
strsql varchar2(200);
begin
if p_id=0 then
open rc for select a.user_name from fnd_user a ;
else
strsql:='select a.user_name from fnd_user a where a.user_id=:p_id';
open rc for strsql using p_id;
end if;
return rc;
end get;
end pkg_test;
--上面是一个返回结果集的函数,下面调用.
create or replace procedure pro_test as
v_out pkg_test%myCursor;
v_name varchar2(100);
begin
v_out:=pkg_test.get(0); --得到结果集
loop
fetch v_out into v_name;
exit when v_out%notfound;
--这里进行处理,想要处理哪一行或进行什么处理在这里进行
end loop;
......
end;
hyrongg 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wangyang1983 的回复:]
但是我要实现的功能就是返回一个表,hyrongg 请问该怎么实现,我是在从SQL转入ORACLE。ORACLE的语法还不是太了解
[/Quote]

在oracle里面返回结果集,建议用游标比较合适
wangyang1983 2008-10-14
  • 打赏
  • 举报
回复
但是我要实现的功能就是返回一个表,hyrongg 请问该怎么实现,我是在从SQL转入ORACLE。ORACLE的语法还不是太了解
hyrongg 2008-10-14
  • 打赏
  • 举报
回复
Oracle 里面返回表不建议使用,要么先创建一个临时表,要么字定一type,然后返回type
rexyudl 2008-10-14
  • 打赏
  • 举报
回复
返回游标必须要通过包来实现!
wangyang1983 2008-10-14
  • 打赏
  • 举报
回复
CREATE function GetChildPlace(@pid int)
RETURNS @child TABLE(nid int)
AS
BEGIN
INSERT INTO @child(nid) values (@pid);
DECLARE @id int;
DECLARE cur CURSOR FOR SELECT id FROM tblPlace WHERE upid = @pid;
OPEN cur;

FETCH NEXT FROM cur INTO @id;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @child (nid) SELECT nid FROM GetChildPlace(@id);
FETCH NEXT FROM cur INTO @id;
END
CLOSE cur;
RETURN
END

这是我在SQL里写的函数,请问怎么转到Oracle里
wiler 2008-10-14
  • 打赏
  • 举报
回复
错误好多,用别的数据库的语法来创建oracle的函数是不可能对的
先把@去掉吧
wangyang1983 2008-10-14
  • 打赏
  • 举报
回复
FUNCTION GETCHILDPLACE 出现错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
2/2 PLS-00103: 出现符号 "@"在需要下列之一时:
<an identifier>
<a double-quoted delimited-identifier> current
符号 "@" 被忽略。

3/10 PLS-00103: 出现符号 "@"在需要下列之一时:
<an identifier>
<a double-quoted delimited-identifier> SELF_ LONG_ double ref
char time timestamp interval date binary national character
nchar
cosio 2008-10-14
  • 打赏
  • 举报
回复
提示什么错误了?

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧