2

DML を含まない Oracle ストアド関数の戻り値を選択するには、関数を選択するだけです。

select function_name() from dual;

関数に DML が含まれている場合 (この場合、関数に渡された引数をログに記録するためのいくつかの挿入)、上記のクエリは許可されません。(ORA-14551)

この関数の戻り値を選択/表示するにはどうすればよいですか?

plsql 開発者で「テスト」を選択すると、plsqldev は次のようなものを生成します。

declare
  -- Non-scalar parameters require additional processing 
  result xmltype;
begin
  -- Call the function
  result := find_person(as_surname => :as_surname,
                       as_given => :as_given,
                       ad_birth_date_from => :ad_birth_date_from,
                       ad_birth_date_to => :ad_birth_date_to,
                       as_gender => :as_gender);
end;

「結果」変数の値を表示するにはどうすればよいですか?

select result from dual;

開始/終了ブロック内で生成されます

ORA-06550: PLS-00428: an INTO clause is expected in this SELECT statement
4

6 に答える 6

2

"result" を ":result" に変更し、変数グリッドの左上隅にある小さな矢印をクリックします。「結果」をバインド変数として追加する必要があり、そのタイプを指定できます。

あなたの場合、最良のオプションは clob または PL/SQL 文字列です。

スクリプトは次のようになります。

declare
  result xmltype;
begin
  result := find_person(as_surname => :as_surname,
                        as_given => :as_given,
                        ad_birth_date_from => :ad_birth_date_from,
                        ad_birth_date_to => :ad_birth_date_to,
                        as_gender => :as_gender);
  if result is null then
    :result := null;
  else
    :result := result.GetClobVal();
  end if;
end;

ご覧のとおり、これは基本的に PL/SQL 開発者が作成したものですが、PL/SQL 開発者が理解できる方法で xmltype を返す方法の処理が異なります。

結果セットを返したい場合は、カーソルを返すことができます:

begin
  ...
  open :someCursor for 
    select 1 from ...;
  ...

変数グリッドの「someCursor」のタイプを「cursor」に変更する必要があります。そうしないと、機能しません。

于 2009-12-14T10:59:54.887 に答える
1

xmltypeを使用したことはありませんが、ドキュメントには次のオプションがあります。

dbms_output.put_line(result.getStringVal());
于 2009-12-14T10:33:00.453 に答える
0

PLSQL 開発者のテスト画面には 2 つのセクションがあります。上部には、質問で示したコードが表示されます。テスト関数が生成したコードは、関数の変数をバインド変数 (:as_surname、:as_given など) に置き換えました。画面の下部で、これらのパラメーターの値を入力し、結果の値を表示できます。

于 2009-12-14T07:43:05.040 に答える
0

追加

pragma autonomous_transaction 

ブロック内の機能に応じて、declareデュアルから選択できます

select find_person(arguments) from dual;

関数内の DML は単に関数に渡された引数をログに記録するためのものであるため、autonomous_transaction の使用は許容されますが、それ以外の場合は避ける必要があります。

于 2009-12-13T01:54:34.100 に答える
0

SQL Developer は DBMS_OUTPUT とうまく連携します。スクリプト出力、結果などの横に別のタブがあります。小さな「出力を有効にする」ボタンをクリックDBMS_Output.Put_Line(result);してコードで使用するだけです。

于 2009-12-14T11:05:16.653 に答える