web-dev-qa-db-ja.com

Oracle SQL開発者を使用してストアドプロシージャを実行するにはどうすればよいですか?

* EDIT6:*これは私のために働いた結果です(受け入れられた答えから):

var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor
exec :tran_cnt := 0
exec :msg_cnt := 123
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => :rc)
print :tran_cnt
print :msg_cnt
print :rc

SQL Developerは、これを非常に困難/不可能にしますか?ユーティリティがコマンドラインベースかどうかは気にしません。すぐに実行して表示できるようにしたいだけです。エラーもうまくキャプチャできたらいいですね。徐々に(インタラクティブに)ログインできるようになり、同時にすべてを指定できるようになります(典型的なftp/sftp cmdベースのクライアントの動作と同様)。

私のプラットフォームはWindows Server 2008 + Cygwinです。

EDIT:おそらくPythonを使用してこれをスクリプト化する方法を知っているでしょうか?

EDIT 2: MSFT SQLサーバーでは、これを簡単に入力できます:

get_user 1;

それを強調表示してF5を押すと、次のようになります。

login   name    
NULL    Somename

出力ウィンドウに印刷されます。 Oracle SQL開発者はこれをまったく助けません。 1を渡す方法がわからない、戻ってくる実際の行/レコードを見る方法がわからない。

EDIT3:ちょうどvar rc refcursor;そしてそれを選択して実行すると、このエラーが表示されます(GUI):

An error was encountered performing the requested operation:

ORA-00900: invalid SQL statement
00900.00000 - "invalid SQL statement"
* Cause:
* Action:
Vendor code 900Error at Line: 2

EDIT4:

定義が次のように始まるプロシージャを実行しようとしています。

create or replace procedure get_account
(
    Vret_val out number,
    Vtran_count in out number,
    Vmessage_count in out number,
    Vaccount_id     IN NUMBER
    , rc1 in out sys_refcursor
)as
begin
...

エラーが発生します:

Error starting at line 2 in command:
exec :rc := get_account(1) 
Error report:
ORA-06550: line 1, column 24:
PLS-00306: wrong number or types of arguments in call to 'GET_ACCOUNT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
rc
------

私はとても近い...助けてください。

*編集5:*

私が実行しているスクリプト(機能的に同じ)、エラーは常に同じでした:

var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor
exec :tran_cnt := 0
exec :msg_cnt := 123
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)

スクリプト出力(F5で)(複数の実行からの複数のメッセージである可能性があります。):

Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
anonymous block completed
anonymous block completed

Error starting at line 7 in command:
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)
Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
anonymous block completed
anonymous block completed

Error starting at line 7 in command:
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)
Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

なぜ行1、列134と表示されるのですか?そこまで伸びる線はありませんが......

19
Hamish Grubijan

これを行う方法があるだけでなく、これを行う方法は複数あります(私はあまりPython的ではないと考えていますが、SQL * DeveloperはJava)で記述されています)。

このシグネチャを持つプロシージャがあります:get_maxsal_by_dept( dno number, maxsal out number)

SQL * Developer Object Navigatorで強調表示し、右クリックメニューを呼び出して、Runを選択しました。 (私は使用できました ctrl+F11。)これにより、テストハーネスを含むポップアップウィンドウが表示されます。 (注:ストアドプロシージャがパッケージ内に存在する場合は、パッケージを右クリックする必要があります notプロシージャ名を含むパッケージの下のアイコン。テストハーネスが表示されたら、パッケージの「ターゲット」リストからsprocを選択します。)この例では、テストハーネスは以下:

_DECLARE
  DNO NUMBER;
  MAXSAL NUMBER;
BEGIN
  DNO := NULL;

  GET_MAXSAL_BY_DEPT(
    DNO => DNO,
    MAXSAL => MAXSAL
  );
  DBMS_OUTPUT.PUT_LINE('MAXSAL = ' || MAXSAL);
END;
_

変数DNOを50に設定し、OKを押します。 Running-Logペイン(閉じた/移動した/隠れていない限り、右下隅)で次の出力を確認できます。

_Connecting to the database apc.
MAXSAL = 4500
Process exited.
Disconnecting from the database apc. 
_

公平を期すために、ランナーは、次のようなRef Cursorを返す関数に対して友好的ではありません:get_emps_by_dept (dno number) return sys_refcursor

_DECLARE
  DNO NUMBER;
  v_Return sys_refcursor;
BEGIN
  DNO := 50;

  v_Return := GET_EMPS_BY_DEPT(
    DNO => DNO
  );
  -- Modify the code to output the variable
  -- DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return);
END;
_

ただし、少なくともファイルへの変更を保存する機会が提供されるため、ハーネスの調整への投資を維持できます...

_DECLARE
  DNO NUMBER;
  v_Return sys_refcursor;
  v_rec emp%rowtype;
BEGIN
  DNO := 50;

  v_Return := GET_EMPS_BY_DEPT(
    DNO => DNO
  );

  loop
    fetch v_Return into v_rec;
    exit when v_Return%notfound;
    DBMS_OUTPUT.PUT_LINE('name = ' || v_rec.ename);
  end loop;
END;
_

同じ場所からの出力:

_Connecting to the database apc.
name = TRICHLER
name = VERREYNNE
name = FEUERSTEIN
name = PODER
Process exited.
Disconnecting from the database apc. 
_

または、古いSQLを使用できますSQLのPLusコマンド Developerワークシート:

_var rc refcursor 
exec :rc := get_emps_by_dept(30) 
print rc
_

その場合、出力はScript Outputペインに表示されます(デフォルトの場所はResultsタブの右側のタブです)。

IDEの最も初期のバージョンは、SQL * Plusの方法ではあまりサポートしていませんでした。ただし、1.2.1以降、上記のコマンドはすべてサポートされています。 オンラインドキュメントのマトリックス 詳細.


「_var rc refcursor;_と入力して選択して実行すると、次のエラーが表示されます(GUI):」

ワークシートがSQLを解釈する方法には、機能またはバグがありますPlusコマンド。 SQL Plusコマンドはスクリプトの一部であると想定しています。したがって、SQL * Plusの行を入力する場合は、_var rc refcursor_と言い、_Execute Statement_をクリックします(または F9 )ワークシートはORA-900を投げます実行可能ステートメントではないためつまりSQLではありません。行う必要があるのは、_Run Script_(または F5 )、SQL * Plusの1行であっても。


「私はとても近い...助けてください。」

あなたのプログラムは、5つの必須パラメーターの署名を持つprocedureです。あなたはそれを関数として、そしてたった一つのパラメータで呼び出しているので、あなたはエラーを得ています:

_exec :rc := get_account(1)
_

必要なのは次のようなものです。わかりやすくするために、名前表記を使用しました。

_var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor

exec :tran_cnt := 0
exec :msg_cnt := 123

exec get_account (Vret_val => :ret1, 
                  Vtran_count => :tran_cnt, 
                  Vmessage_count => :msg_cnt, 
                  Vaccount_id   => 1,
                  rc1 => :rc )

print tran_count 
print rc
_

つまり、各OUTまたはIN OUTパラメータに変数が必要です。 INパラメーターはリテラルとして渡すことができます。最初の2つのEXECステートメントは、いくつかのIN OUTパラメーターに値を割り当てます。 3番目のEXECはプロシージャを呼び出します。プロシージャは(関数とは異なり)値を返さないため、代入構文を使用しません。最後に、このスクリプトは、OUTパラメーターにマップされたいくつかの変数の値を表示します。

35
APC

戻ってくる実際の行/レコードの見方がわかりません。

ストアドプロシージャはレコードを返しません。これらは、selectパラメータへのポインタである出力パラメータとしてカーソルを持っている場合があります。ただし、そのカーソルから行を実際に戻すには追加のアクションが必要です。

SQL Developerでは、次のようにrefカーソルを返すプロシージャを実行できます。

var rc refcursor
exec proc_name(:rc)

その後、次を実行すると、カーソルからの結果が表示されます。

print rc
4
Gary Myers
3
Sujee

「SQuirreL SQL Client」について聞いたことがありますか?

http://squirrel-sql.sourceforge.net/

2
redcayuga

Quest Software、TOADおよびSQL Navigatorの2つの可能性があります。

TOADフリーウェアのダウンロードは次のとおりです。 http://www.toadworld.com/Downloads/FreewareandTrials/ToadforOracleFreeware/tabid/558/Default.aspx

SQLナビゲーター(試用版): http://www.quest.com/sql-navigator/software-downloads.aspx

0
Matthew Farwell