理論的には、あなたが望むことをすることは可能です。その中にたくさんのバインド変数を持つクエリを考案するには、さまざまな方法があります。たとえば、3000のバインド変数を使用してall_objects
データ・ディクショナリ・ビューを問い合せるスクリプトを作成します。 3000個のバインド変数を持つSQL * Plusスクリプトを書くつもりはないので、代わりにこのSQL * Plusスクリプトを生成するPythonスクリプトを作成しました。ここでは、次のとおりです。
SQL> @genquery.sql
SELECT object_name FROM all_objects WHERE object_id IN (:X0000,:X0001,:X0002,:X0
003,:X0004,:X0005,:X0006,:X0007,:X0008,:X0009,:X0010,:X0011,:X0012,:X0013,:X0014
,:X0015,:X0016,:X0017,:X0018,:X0019,:X0020,:X0021,:X0022,:X0023,:X0024,:X0025,:X
0026,:X0027,:X0028,:X0029,:X0030,:X0031,:X0032,:X0033,:X0034,:X0035,:X0036,:X003
7,:X0038,:X0039,:X0040,:X0041,:X0042,:X0043,:X0044,:X0045,:X0046,:X0047,:X0048,:
X0049,:X0050,:X0051,:X0052,:X0053,:X0054,:X0055,:X0056,:X0057,:X0058,:X0059,:X00
60,:X0061,:X0062,:X0063,:X0064,:X0065,:X0066,:X0067,:X0068,:X0069,:X0070,:X0071,
:X0072,:X0073,:X0074,:X0075,:X0076,:X0077,:X0078,:X0079,:X0080,:X0081,:X0082,:X0
083,:X0084,:X0085,:X0086,:X0087,:X0088,:X0089,:X0090,:X0091,:X0092,:X0093,:X0094
,:X0095,:X0096,:X0097,:X0098,:X0099)
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 556
Session ID: 137 Serial number: 29
ORA-03113
エラーは、サーバー・プロセスがクラッシュしたことを示している:私は私のOracleインスタンス(XE 11gのベータ版)でそれを実行したときしかし、私は次の出力を得ました。
私はこの上でいくつかのバリエーションを試してみました:
がSELECT ... FROM all_objects WHERE object_id=:X0000 OR object_id=:X0001 OR ...
書き込みすなわち、IN
リストを使用していない(すなわち、直接に値を入れて)すべてのバインド変数を使用していない
- 、
はOMGポニーを使用してアプローチ、
- バインド変数を使用せずにOMG Poniesのアプローチを使用して、
all_objects
のデータをテーブルにコピーし、queryin代わりにそのg。
上記のすべてのアプローチによって、ORA-03113
エラーが発生しました。
もちろん、他のエディションのOracleでこれらのクラッシュが発生するかどうかはわかりませんが(私は他のエディションにはアクセスできませんが)、うまくいきません。
編集:あなたはSELECT JOB FROM EMP WHERE JOB IN (:JOB)
のようなものを達成できるかどうか尋ねます。その短い答えは「いいえ」です。次のようにVARIABLE
コマンドのためのSQL * Plusのの使用方法のメッセージは次のとおりです。
Usage: VAR[IABLE] [ [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | BLOB | BFILE
REFCURSOR | BINARY_FLOAT | BINARY_DOUBLE ] ]
上記のタイプのすべてがREFCURSOR
を除き、単一のデータ値、ですが、SQL * Plusはまだ単一の値としてそれを扱うように思われます。私はこの方法でREFCURSOR
に返されたデータをクエリする方法を見つけることができません。
要約すると、達成しようとしていることはほとんど不可能です。あなたの究極の目的がここにあるのかどうかはわかりませんが、SQL * Plusで単一のクエリを使用して実行できるとは思いません。
実稼働環境であるため、テーブルを作成することはできません。SELECT句に付与されています。 UNIX-SQL PLUS環境から同じクエリを実行したときに、どのくらい正確に実行されるかについての詳細が必要です。 BIND変数の値を入力するかどうかを尋ねるプロンプトが表示されますが、値が...を持つファイルを参照することはできますか:JOB1:= 'MANAGER':JOB2:= 'CLERK':JOB3:= 'ACCOUNTANT' – dilipece2001
@ dilipece2001 :派生テーブルの例は、アカウントにSELECT権限しかない場合に有効です。また、はい、BIND変数は1対1の関係であるため、それぞれの値を定義する必要があります。 –