web-dev-qa-db-ja.com

PL SQLプロシージャから戻り値を取得して変数に割り当てる方法は?

コード:

   execute x.procedurename(row.accc_no, row.bill_no, 0, null, row.total_balance, 'A',assgn_scen_site_cv, :assgn_scen_site_cv);

その私の手順。

このプロシージャから戻り値を取得して変数に割り当てる方法は?

3
Serdar

次のように作成できます。

CREATE OR REPLACE PROCEDURE procedurename(param1 NUMBER, param2 varchar(20), returnvalue OUT NUMBER);
IS
BEGIN
    ... your code
END;

そして、次のように使用します。

returnvalue NUMBER;
procedurename(0, 'xxx', returnvalue);
dbms_output.putline(returnvalue);

Oracle Webサイトの CREATE PROCEDURE のドキュメントをご覧ください。

3

私が正しく理解している場合、戻り値を持つ既存のプロシージャを使用しようとしています。これは別のプロシージャ、パッケージ、または関数で実行できますが、最も簡単な方法はブロックを使用することです。宣言セクションでは、値を受け取る変数を定義し、プロシージャの呼び出しでそれらを使用します。

DECLARE
   vAccc_no              Number(10);
   vBill_no              Number(10);
   vTotal_Balance        Number(10,2);
   vAssgn_scen_site_cv   Varchar(80);   
   vAssgn_scen_site_cv_i Varchar(80);
BEGIN   
   vAssgn_scen_site_cv_i := 'Pass To Procedure';
   x.procedurename(vAccc_no, vBill_no, 0, null, vTotal_Balance, 'A', vAssgn_scen_site_cv
      , vAssgn_scen_site_cv_i);
   DBMS_Output.Put_Line('New value of Total_Balance: ' || vTotalBalance);
END;
/

私はデータ型と入力/出力が何であるかを推測しています。

1
Leigh Riffel

もしあなたがその手続きを書いているなら、代わりにそれを関数にしたいと思うかもしれません。 「プロシージャ」と「関数」は同義語としてよく使用されますが、PL/SQLではまったく異なり、それに応じて使用する必要があります。

何かを変更するプログラム(コンテンツの削除、新しい構造の作成など)が必要な場合は、それが手順になります。ただし、主な目的が戻り値の取得(データの選択、計算のための結果の取得など)である場合は、関数でなければなりません。

関数はSQLで非常に簡単に使用できます(to_char()、length()、instr()などの統合関数の呼び出しに似ています)。

select my_function('foo') from dual;

デュアルの使用は単なる例であり、任意のSQLステートメントで使用できます。

コード例:

CREATE OR REPLACE FUNCTION my_function (i_input IN varchar2) RETURN varchar2
IS
BEGIN
    RETURN 'input: ' || i_input;
END;

上記の呼び出しは「input:foo」を返します。

1
makrom

SQLを匿名ブロックにラップします。例:

_declare
    result VARCHAR2(4000);
    A_STRING VARCHAR2(4000) := '';
    A_START_POS NUMBER := 0;
    A_END_POS NUMBER := 0;
begin
    result := BETWNSTR(
        A_STRING => A_STRING,
        A_START_POS => A_START_POS,
        A_END_POS => A_END_POS
    );
    -- optional value select
    open ? for select result as result from dual;
end;
_

_result := ..._は、select BETWNSTR(...) into result from dual;と比較する場合、PLとSQLエンジン間のコンテキスト切り替えを回避することに注意してください。

0
Vasilii Chernov