85

複数の in および out パラメータを持つストアド プロシージャを実行しようとしています。この手順は、[他のユーザー] | [他のユーザー] に移動して、[接続] パネルでのみ表示できます。| | パッケージ | | |

を右クリックすると、メニュー項目は「Order Members By...」と「Create Unit Test」(灰色表示) になります。ユーザーがアクセスした場合、プロシージャを「実行」することはできないようです。

プロシージャを SQL ファイルとして実行できるように匿名ブロックを作成する方法の例を見つけようとしましたが、うまくいくものは見つかりませんでした。

SQL Developerからこの手順を実行する方法を知っている人はいますか? バージョン 2.1.1.64 を使用しています。

前もって感謝します!

編集1:

呼び出したいプロシージャには、次の署名があります。

user.package.procedure(
   p_1 IN  NUMBER,
   p_2 IN  NUMBER,
   p_3 OUT VARCHAR2,
   p_4 OUT VARCHAR2,
   p_5 OUT VARCHAR2,
   p_6 OUT NUMBER)

匿名ブロックを次のように書くと:

DECLARE
   out1 VARCHAR2(100);
   out2 VARCHAR2(100);
   out3 VARCHAR2(100);
   out4 NUMBER(100);
BEGIN
   EXECUTE user.package.procedure (33,89, :out1, :out2, :out3, :out4);
END;

エラーが発生します:

Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed

out* 変数を初期化してみました:

   out1 VARCHAR2(100) := '';

しかし、同じエラーが発生します:

編集2:

アレックスの答えに基づいて、私はパラメーターの前からコロンを削除して、これを取得しようとしました:

Error starting at line 1 in command:
DECLARE
   out1 VARCHAR2(100);
   out2 VARCHAR2(100);
   out3 VARCHAR2(100);
   out4 NUMBER(100);
BEGIN
   EXECUTE user.package.procedure (33,89, out1, out2, out3, out4);
END;
Error report:
ORA-06550: line 13, column 17:
PLS-00103: Encountered the symbol "USER" when expecting one of the following:

   := . ( @ % ; immediate
The symbol ":=" was substituted for "USER" to continue.
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
4

15 に答える 15

78

単純なパラメータ タイプ (つまり、refcursor などではない) を使用すると、次のようなことができます。

SET serveroutput on;
DECLARE
    InParam1 number;
    InParam2 number;
    OutParam1 varchar2(100);
    OutParam2 varchar2(100);
    OutParam3 varchar2(100);
    OutParam4 number;
BEGIN
    /* Assign values to IN parameters */
    InParam1 := 33;
    InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(InParam1, InParam2,
        OutParam1, OutParam2, OutParam3, OutParam4);

    /* Display OUT parameters */
    dbms_output.put_line('OutParam1: ' || OutParam1);
    dbms_output.put_line('OutParam2: ' || OutParam2);
    dbms_output.put_line('OutParam3: ' || OutParam3);
    dbms_output.put_line('OutParam4: ' || OutParam4);
END;
/


OPの仕様を使用するように編集:varし、バインド変数を利用する別のアプローチを使用します:

var InParam1 number;
var InParam2 number;
var OutParam1 varchar2(100);
var OutParam2 varchar2(100);
var OutParam3 varchar2(100);
var OutParam4 number;

BEGIN
    /* Assign values to IN parameters */
    :InParam1 := 33;
    :InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(:InParam1, :InParam2,
        :OutParam1, :OutParam2, :OutParam3, :OutParam4);
END;
/

-- Display OUT parameters
print :OutParam1;
print :OutParam2;
print :OutParam3;
print :OutParam4;
于 2010-10-21T21:45:19.527 に答える
30

簡単に実行します。結果を得るのが難しい場合があります。

私が尋ねたこの質問を見てくださいオラクルパッケージプロシージャから結果を取得するための最良の方法/ツール

そのあらすじはこうなります。

mypackage という名前のパッケージと getQuestions という名前のプロシージャがあると仮定します。refcursor を返し、文字列のユーザー名を受け取ります。

新しい SQL ファイル (file new) を作成するだけです。接続を設定し、以下に貼り付けて実行します。

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;
于 2010-10-21T20:48:09.547 に答える
14

SQL Developerでプロシージャを開き、そこから実行します。SQL Developerは、実行するSQLを表示します。

BEGIN
  PROCEEDURE_NAME_HERE();
END;
于 2012-01-05T20:42:25.500 に答える
7

使用する:

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

「PACKAGE_NAME」、「PROCEDURE_NAME」、および「parameter_value」を必要なものに置き換えます。OUT パラメータは、事前に宣言する必要があります。

于 2010-10-21T20:49:07.090 に答える
2

これらの他の答えはどれも私にとってはうまくいきませんでした。SQL Developer 3.2.20.10でプロシージャを実行するために私がしなければならなかったことは次のとおりです。

SET serveroutput on;
DECLARE
  testvar varchar(100);
BEGIN
  testvar := 'dude';
  schema.MY_PROC(testvar);
  dbms_output.enable;
  dbms_output.put_line(testvar);
END;

次に、渡された変数に対して proc が行うべきことをテーブルで確認する必要があります。出力は、変数が値を受け取ったことを確認するだけです (理論的には、それを proc に渡しました)。

(私のものと他のものとの違い):

  • :変数名の前に
  • スキーマ名とプロシージャ名の間に.package.orを入れないでください.packages.
  • &変数の値に an を入れる必要はありません。
  • printどこも使わない
  • var変数を宣言するために使用しない

これらの問題はすべて、私を長い間頭を悩ませ、これらの重大なエラーを含むこれらの回答を取り出し、タールを付けて羽毛で覆いました。

于 2016-08-30T21:12:18.250 に答える
1

信じられない、これは SQL Developer では実行されません:

var r refcursor;
exec PCK.SOME_SP(:r,
 '02619857');

print r;

しかし、これは:

var r refcursor;
exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, '02619857');

print r;

明らかに、すべてが1行にある必要があります..

于 2013-07-02T13:10:35.743 に答える
0

SQL Developer バージョン 4.0.2.15 ビルド 15.21 を使用すると、次のように動作します。

SET SERVEROUTPUT ON
var InParam1 varchar2(100)
var InParam2 varchar2(100)
var InParam3 varchar2(100)
var OutParam1 varchar2(100)

BEGIN
    /* Assign values to IN parameters */
    :InParam1 := 'one';
    :InParam2 := 'two';
    :InParam3 := 'three';

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(:InParam1, :InParam2, :InParam3, :OutParam1);
    dbms_output.enable;
    dbms_output.put_line('OutParam1: ' || :OutParam1);
END;
/
于 2014-07-25T20:04:01.737 に答える
-1

@Alex Poole の回答を機能させることができませんでした。しかし、試行錯誤の結果、次のような作品が見つかりました (SQL Developer バージョン 3.0.04 を使用)。他の人に役立つ場合に備えて、ここに投稿してください:

SET serveroutput on;

DECLARE
    var InParam1 number;
    var InParam2 number;
    var OutParam1 varchar2(100);
    var OutParam2 varchar2(100);
    var OutParam3 varchar2(100);
    var OutParam4 number;

BEGIN
    /* Assign values to IN parameters */
    InParam1 := 33;
    InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(InParam1, InParam2,
        OutParam1, OutParam2, OutParam3, OutParam4);

    /* Display OUT parameters */
    dbms_output.put_line('OutParam1: ' || OutParam1);
    dbms_output.put_line('OutParam2: ' || OutParam2);
    dbms_output.put_line('OutParam3: ' || OutParam3);
    dbms_output.put_line('OutParam4: ' || OutParam4);
END;
于 2013-09-21T19:01:43.703 に答える
-2

多くのパラメータを持つ多くのプロシージャがある場合、Pl/SQL ブロックを作成するのは大変です。あなたのためにそれを行うpythonで書かれたアプリケーションがあります。プロシージャ宣言を含むファイルを解析し、便利なプロシージャ呼び出し用の Web アプリを作成します。

于 2015-12-11T15:25:34.613 に答える
-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;
于 2012-09-05T19:29:46.913 に答える