1

多数の「このアクションリストに何が起こったのか」タイプの呼び出しを支援するスクリプトを作成しようとしていますが、最も単純な操作のいくつかを行うレンガの壁に直面しています。

変数を宣言し、それをクエリの where 句で使用しようとしています。このコア機能を機能させるために、クエリから無関係なものをすべて削除しました。

ID は通常 18 桁の数字ですが、英数字が含まれることがあるため、varchar になっています。比較しようとしている列は、18 バイトの varchar フィールドです。

declare
  id_to_check VARCHAR(18);  

begin
  id_to_check := '549576015500000109';

select 
  txn_timestamp, exception_type
from cut.event
where irn_id = id_to_check;

end;

エラーをスローするたびに:「この選択ステートメントには INTO 句が必要です」。INTO がどのように機能するか、つまり、select の結果を変数に割り当てたい場合は理解していますが、クエリの結果を変数に割り当てていないため、このインスタンスでそれがどのように適用されるかわかりません。

もう 1 つの苛立たしいことは、実際には docs.oracle.com のドキュメントに従っていることです。

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/overview.htm#LNPLS001 .

さまざまなGoogleの結果も見ましたが、最初に何かを選択せず​​に変数と比較する方法がわかりませんが、ご覧のとおり、必要なのは変数だけであるため選択できません比較理由?

敬具、イアン

4

3 に答える 3

3

PL/SQLで何かをしている場合、Raphaël Althausの答えが当てはまりますが、それが実際にあなたが望むものかどうかはわかりません。単純な SQL クエリが必要なように聞こえますが、値を渡すことができるようにしたいですか? これを SQL*Plus または SQL Developer で実行していると仮定すると、固定値を宣言して使用する方法がいくつかあります。(同様の方法が他のクライアントでも利用できるようになります。PL/SQL 開発者は、少なくともコマンド ウィンドウではこれらの両方を気に入っているようですが、Toad などについては確信が持てません)。

1)置換変数の使用:

define id_to_check = 549576015500000109

select txn_timestamp, exception_type
from cut.event
where irn_id = '&id_to_check';

2)バインド変数の使用:

variable id_to_check varchar2(18)

exec :id_to_check := '549576015500000109';

select txn_timestamp, exception_type
from cut.event
where irn_id = :id_to_check;

は小さな無名 PL/SQL ブロックのexec省略形ですが、値を変数に代入するステップを除けば、プレーン SQL であるため、クエリを でラップする必要はbegin ... endなく、心配する必要もありません。into変数の選択。

どちらの場合でも、ID 値を引数として渡すか、スクリプトの実行時にスクリプトの一部として要求することができます。たとえば、次のquery.sqlスクリプトを作成できます。

define id_to_check = &1

select txn_timestamp, exception_type
from cut.event
where irn_id = '&id_to_check';

...そしてそれを実行します:

sqlplus -l -s <user>/<password> @query 549576015500000109

... または次のように:

accept id_to_check prompt 'Enter the ID to check: '

select txn_timestamp, exception_type
from cut.event
where irn_id = '&id_to_check';

... 実行時にユーザーに ID の入力を求めるプロンプトを表示します。

于 2013-01-18T15:47:10.143 に答える
1

問題は「結果を変数に入れたいですか」ではありません。

Oracleプロシージャの「本体」では、句SELECTなしでaを使用することはできません。INTO

(実際には持つことができますが、カーソルの中にあります)。

それで

declare
  id_to_check VARCHAR(18);
  event_timestamp cut.event.txn_timestamp%TYPE;
  event_exception cut.event.exception_type%TYPE;

begin
  id_to_check := '549576015500000109';

select 
  txn_timestamp, exception_type
  INTO event_timestamp, event_exception
from cut.event
where irn_id = id_to_check;

end;

注意:結果が見つからない場合、NO_DATA_FOUND例外が発生します。

あなたはそれを管理することができます

begin
  id_to_check := '549576015500000109';

  BEGIN
  select 
    txn_timestamp, exception_type
    INTO event_timestamp, event_exception
    from cut.event
    where irn_id = id_to_check;

   EXCEPTION WHEN NO_DATA_FOUND THEN 
   --...something
  END

end
于 2013-01-18T15:16:01.797 に答える
0

あなたの本当の問題は、変数を使用することではありません(あなたはそれを正しく理解しています)が、PL/SQLブロックからカーソルを返すことです。

プロシージャの最後にある裸の select は、何らかの方法で結果を返すか、少なくともそれらを表示する必要があると信じているようです。一部のデータベースはそのように機能しますが、Oracle はそうではありません。任意の種類のブロック (関数やプロシージャなど) からデータを残す場合は、それらを明示的に渡す必要があります。通常、これはカーソル参照型の in パラメータを使用して行われます。

ご覧のとおり、into を使用しない select は、Oracle では意味がありません。うまく機能させてデータを選択できたとしても、結果にアクセスすることはできません。

于 2013-01-19T00:49:05.327 に答える