2

SQLステートメントで変数を使用できるように、.sqlファイルで変数を定義しようとしています。しかし、私はこれらの変数がどのように定義されているかについて非常に混乱しており、これらすべてを明確に説明している優れたオンライン リソースを 1 つも見つけることができません。さまざまなソースの推奨事項に従っていますが、「Oracle SQL Developer」でコンパイル エラーが発生し続けます。ここに私の2つの問題があります:

問題 1:次の 2 つの方法で変数を定義できるようです。これら 2 つの方法の違いは何ですか? また、両方を使用できますか?

define first_name = Joe;
select * from customer where name = '&firstname';

また

variable first_name CHAR;
exec :first_name:= 'Joe';
select * from customer where name = :firstname;

問題 2: 最初の方法 (define コマンドを使用することを意味します) で、number 型の変数を定義できますか。

4

3 に答える 3

3

NUMBER変数を問題なく定義できます。

SQL> VARIABLE myNum NUMBER;
SQL> EXEC :myNum := 123.456;

PL/SQL procedure successfully completed.

SQL> print myNum;

     MYNUM                                        
----------                                        
   123.456                                        

他の多くのタイプも同様にサポートされています。USAGEVARIABLE コマンドのヘルプ テキストは次のとおりです。

Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
                VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
                NVARCHAR2 (n) | CLOB | NCLOB | BLOB | BFILE
                REFCURSOR | BINARY_FLOAT | BINARY_DOUBLE ] ]

他に何も入力せずにVARIABLE(または単に) を入力すると、SQL*Plus はすべての変数とその値を一覧表示します。VAR

補遺:元の質問の2つの変数割り当てスタイルを対比してください。

これをすると...

define first_name = Joe
select * from customer where name = '&first_name';

... #defineC/C++ の a に似ています。変数のように扱うことはできません。SQL*Plus が を検出するたびに貼り付けられるのは単なるテキストです&first_name

これをすると...

variable first_name CHAR;
exec :first_name:= 'Joe';
select * from customer where name = :first_name;

操作できる実際の変数を作成しています。

定義で (サイズなしで)を使用する場合CHAR、最初の代入によってそのサイズが決定され、それ以降は長くできないことに注意してください。定義すると、CHAR(50)常に 50 文字の長さになり、スペースが埋め込まれます。これは混乱を招く可能性がVARCHAR2あるため、ほとんどの場合、文字列をお勧めします。

于 2013-03-28T20:51:45.800 に答える
2

- 問題 1 への回答: 最初のタイプの変数は置換変数と呼ばれ、SQL*Plus および SQL Developer でのみ機能します。そのため、任意の SQL 文で使用可能な置換を指定すると、SQL*Plus は変数をその値に置き換えます。Oracle サーバーやパフォーマンスとは関係ありません。あなたが与えた例は、Oracleデータベースサーバーに送信する前に次のように変換されます。

select * from customer where name = 'Joe';

2 番目の部分はバインド変数と呼ばれ、SQL*Plus または SQL Developer に限定されません。たとえば、Oracle に接続する Java アプリケーション (または他の言語) で使用できます。バインド変数を使用すると、同じステートメントを何度も実行する場合に、常にステートメントをそのまま (書き換えずに) 送信するため、パフォーマンスが向上します。次に、変数はデータベース レベルで評価されます。たとえば、「first_name」の値を「Mark」に変更したとします。

exec :first_name:= 'Mark';

バインド変数を含む同じステートメントが Oracle データベース サーバーに送信されます。データベースはキャッシュ領域を使用して、同じステートメントが以前に実行されたことを検出し、それを再度使用します。次に、データベースは変数の値を使用します。これは、データベースが同じステートメントの最適な実行計画を再解析して再計算する必要がないことを意味します。しかし、これは最初のタイプ (置換変数) には当てはまりません。

- 問題 2 への回答: できません。上で述べたように、SQL*Plus または SQL Developer が行うことは、変数名をその値に置き換えてステートメントを書き直すだけだからです。それは自分のタイプについて何も知りません。ここでは、テキストの置換のみが行われます。

詳細については、 http ://www.oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables.php を参照して ください。

于 2013-03-28T21:25:21.587 に答える
0

Oracle では、次のように変数を定義できます。

CREATE OR REPLACE FUNCTION MyFunction()
AS

    my_number     NUMBER (20, 0);
    first_name    VARCHAR2(256);

BEGIN
    first_name := 'Joe';
    select * from customer where name = first_name;

END

それはあなたが探しているものですか?

于 2013-03-28T20:37:04.643 に答える