1. ホーム
  2. oracle

[解決済み] SQL Developerでストアドプロシージャを実行しますか?

2023-05-25 15:05:15

質問

複数の入出力パラメータを持つストアドプロシージャを実行しようとしています。このプロシージャは、Connections パネルで Other Users | | Packages | | をナビゲートすることによってのみ表示することができます。

右クリックすると、メニュー項目は "Order Members By..." と "Create Unit Test" (グレー表示) になります。ユーザーによってアクセスされた場合、プロシージャを実行する機能はないようです。

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

どなたか、SQL Developer からこのプロシージャを実行する方法をご存知でしょうか。私はバージョン 2.1.1.64 を使用しています。

事前にありがとうございます。

EDIT 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) := '';

を実行しても、同じエラーが発生します。

EDIT 2:

Alexの回答に基づいて、paramsの前のコロンを削除してみたところ、このようになりました。

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:

どのように解決するのですか?

単純なパラメータ型(つまり、リフカーサーなどではない)を使えば、以下のようなことができます。

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;