* 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と表示されるのですか?そこまで伸びる線はありませんが......
これを行う方法があるだけでなく、これを行う方法は複数あります(私はあまり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パラメーターにマップされたいくつかの変数の値を表示します。
戻ってくる実際の行/レコードの見方がわかりません。
ストアドプロシージャはレコードを返しません。これらは、selectパラメータへのポインタである出力パラメータとしてカーソルを持っている場合があります。ただし、そのカーソルから行を実際に戻すには追加のアクションが必要です。
SQL Developerでは、次のようにrefカーソルを返すプロシージャを実行できます。
var rc refcursor
exec proc_name(:rc)
その後、次を実行すると、カーソルからの結果が表示されます。
print rc
私の推奨は [〜#〜] tora [〜#〜]
「SQuirreL SQL Client」について聞いたことがありますか?
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