如何在plsql上编辑return语句的游标属性?

如何在plsql上编辑return语句的游标属性?,sql,database,oracle,plsql,Sql,Database,Oracle,Plsql,我想从函数返回一个游标,我读到可以使用: return sys_refcursor 然后 open curs for select* from mytable; return curs; 我尝试了curs.att:=“某物”,但我得到了一个错误 同时阅读“我可以做我自己的类型”: TYPE type IS REF CURSOR RETURN mytable%ROWTYPE; 然后 这一次,我没有在assign中得到错误,而是在return语句中得到错误 如果将变量类型更改为我的类型,则无

我想从函数返回一个游标,我读到可以使用:

return sys_refcursor
然后

open curs for select* from mytable;
return curs;
我尝试了curs.att:=“某物”,但我得到了一个错误

同时阅读“我可以做我自己的类型”:

 TYPE type IS REF CURSOR RETURN mytable%ROWTYPE;
然后

这一次,我没有在assign中得到错误,而是在return语句中得到错误

如果将变量类型更改为我的类型,则无法获取值


我不想编辑光标,但不想编辑表格,我该怎么做?

光标是只读结构。更改要从游标获取的数据的唯一方法是更改用于打开游标的SQL语句或更改基础表中的数据

虽然可以将游标从一个PL/SQL块返回到另一个PL/SQL块,但它很少是合适的体系结构。当您希望将结果返回给知道如何使用游标的客户端应用程序时,
SYS\u REFCURSOR
通常是合适的

但是,是否确实要返回光标?还是要返回记录类型?您发布的第二个代码段似乎试图返回一条记录——这当然是可能的,但您需要声明函数返回的是一条记录而不是游标。也就是说,声明中的
RETURN
语句需要是
returnmytable%ROWTYPE
而不是
returntype
。例如,如果要基于
EMP
表返回记录

create or replace function get_emp( p_empno in emp.empno%type )
  return emp%rowtype
is
  l_rec emp%rowtype;
begin
  select *
    into l_rec
    from emp
   where empno = p_empno;
  l_rec.sal := l_rec.sal + 100;
  return l_rec;
end;

是的,我只使用了一条记录,但当我添加返回mytable%ROWTYPE时,我得到了以下错误:编译失败,第1行(20:24:56)PLS-00320:此表达式的类型声明不完整或编译格式错误failed@Warner-我使用
EMP
表发布了一个示例。如果您仍然遇到错误,请发布您正在使用的代码。不过,我只是将模式添加到了schem.mytable中,这很奇怪。这样做是有效的,关于记录的版本,我认为我误导了程序的功能,我将在应用程序代码中使用它。Thanksah,但是我可以更改隐式游标,我仍然不确定是应该在数据库还是在应用程序中这样做。这是一个mp3商店,如果用户点击一首歌曲,它将播放歌曲的一部分,但如果用户购买,它将播放整首歌曲。在返回的记录中,我想把整首歌隐藏给那些没有购买它的人。@Warer-你不能更改游标中的数据,无论它是显式游标还是隐式游标。您可以更改记录中的数据,无论该记录是通过显式游标、隐式游标还是手动填充的。
create or replace function get_emp( p_empno in emp.empno%type )
  return emp%rowtype
is
  l_rec emp%rowtype;
begin
  select *
    into l_rec
    from emp
   where empno = p_empno;
  l_rec.sal := l_rec.sal + 100;
  return l_rec;
end;