0

関数からカーソルを返したいのですが、使用できることを読みました:

return sys_refcursor

その後

open curs for select* from mytable;
return curs;

curs.att := 'something' を試しましたが、エラーが発生します

また、私は自分のタイプを行うことができます:

 TYPE type IS REF CURSOR RETURN mytable%ROWTYPE;

それで

CURSOR cur IS
    SELECT* FROM mytable;
var cur%ROWTYPE;

BEGIN
OPEN cur;
FETCH cur INTO var;
var.att = 'something';
RETURN var;

今回はassignではなくreturn文でエラーになりました。

var 型を自分の型に変更すると、値を取得できませんでした。

カーソルは編集したくありませんが、テーブルは編集したくありません。どうすればよいですか?

4

1 に答える 1

1

カーソルは読み取り専用の構造です。カーソルからフェッチするデータを変更する唯一の方法は、カーソルを開くために使用する SQL ステートメントを変更するか、基になるテーブルのデータを変更することです。

PL/SQLブロック間でカーソルを戻すことは可能ですが、適切なアーキテクチャになることはめったにありません。ASYS_REFCURSORは通常、カーソルの使用方法を認識しているクライアント アプリケーションに結果を返す場合に適しています。

しかし、本当にカーソルを返したいですか? それとも、レコード タイプを返しますか? あなたが投稿した 2 番目のコード スニペットは、レコードを返そうとしているようです。これは確かに可能ですが、関数がカーソルではなくレコードを返すことを宣言する必要があります。つまりRETURN、宣言内のステートメントはRETURN mytable%ROWTYPEではなく である必要がありRETURN typeます。たとえば、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;
于 2012-04-26T01:41:20.683 に答える