4

SQL Developerを使用して関数に移動でき、すべて正常にコンパイルされるため、関数は明らかにそこにありますが、「呼び出し」の有無にかかわらず関数を使用しようとすると、次のようにスローされます。

エラー(36,24):PLS-00222:このスコープに「x」という名前の関数が存在しません

関数は次のようになります。

create or replace function testfunction
  (
    somevalue in varchar2 
  )
  return varchar2
  AS
  cursor testcursor IS 
  select column1, column2 from table1 t
  where t.column1 = somevalue; 
  testcursorrec testcursor %rowtype;
  messaget VARCHAR2(500);
  begin
       open testcursor ; 
       fetch testcursor into testcursorrec ; 
       close testcursor ; 
       messaget := testcursor.column1;
      return messaget ;
  end;

これは私がそれを呼んでいる方法です:

messaget := testfunction(somevalue); 

ここで、messageTとsomevalueの両方がvarchar2タイプとして宣言されています。

関数内などでカーソルを使用することはできませんか?

4

1 に答える 1

1

エラーはmessaget := testcursor.column1;、カーソルがそれまでに閉じられているためです(testcursorrec.column2.

あなたのコードは行がないか、行が重複しているかどうかをチェックしていません。これを単純化できます

create or replace function testfunction
  (
    somevalue in table1.column1%type
  )
  return table1.column2%type
  AS
  messaget table1.column2%type; -- use %type where possible.
  begin
    select t.column2
      into messaget
      from table1 t
     where t.column1 = somevalue
       and rownum = 1;--only if you dont care if theres 2+ rows. 
    return messaget;
  exception 
    when no_data_found
    then 
      return null; -- if you want to ignore no rows.
  end;
于 2012-11-27T12:58:33.047 に答える