19

* 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 開発者はこれを非常に難しい/不可能にしていますか?. ユーティリティがコマンドライン ベースかどうかは気にしません。すぐに実行して表示できるようにしたいだけです。エラーもうまくキャプチャできればいいのですが。一度にすべてを指定するだけでなく、徐々に(対話的に)ログインできると便利です(典型的なftp / sftp cmdベースのクライアントの動作に似ています)。

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

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

編集 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列目と表示されているのはなぜですか? そこまで線が伸びていない...

4

5 に答える 5

36

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

私はこの署名を持つ手順を持っています: get_maxsal_by_dept( dno number, maxsal out number).

SQL*Developer オブジェクト・ナビゲータでそれを強調表示し、右クリック・メニューを呼び出して、[実行] を選択します。( ctrl+を使用できますF11。) これにより、テスト ハーネスを含むポップアップ ウィンドウが生成されます。(注:ストアド プロシージャがパッケージ内にある場合は、プロシージャの名前を含むパッケージの下のアイコンではなく、パッケージを右クリックする必要があります。テスト時にパッケージの「ターゲット」リストから 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] を押します。[実行中 - ログ]ペイン (閉じたり、移動したり、非表示にしたりしていない限り、右下隅) に次の出力が表示されます。

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 Developer ワークシートで古い SQL PLUS コマンドを使用することもできます。

var rc refcursor 
exec :rc := get_emps_by_dept(30) 
print rc

その場合、出力は[スクリプト出力] ペインに表示されます (デフォルトの場所は [結果] タブの右側のタブです)。

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


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

ワークシートが SQL Plus コマンドを解釈する方法に、機能 (またはバグ) があります。SQL Plus コマンドがスクリプトの一部であることを前提としています。したがって、SQL*Plus の行を入力してvar rc refcursorクリックExecute Statement(または) すると、ワークシートF9ORA-900をスローします。SQL*Plus の 1 行であっても、 クリック(または) するだけです。Run ScriptF5


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

プログラムは、5 つの必須パラメーターの署名を持つプロシージャーです。関数として呼び出しているため、エラーが発生しています。パラメーターは 1 つだけです。

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 パラメータにマップされたいくつかの変数の値を表示します。

于 2010-06-29T04:38:21.143 に答える
4

返される実際の行/レコードを確認する方法がわかりません。

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

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

var rc refcursor
exec proc_name(:rc)

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

print rc
于 2010-06-28T23:09:04.710 に答える
3

私のおすすめはTORAです。

于 2010-06-29T04:55:15.820 に答える
2

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

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

于 2010-06-28T19:14:36.773 に答える
0

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

TOAD フリーウェアのダウンロードはこちら: http://www.toadworld.com/Downloads/FreewareandTrials/ToadforOracleFreeware/tabid/558/Default.aspx

SQL Navigator (試用版): http://www.quest.com/sql-navigator/software-downloads.aspx

于 2010-07-03T22:28:03.147 に答える