web-dev-qa-db-ja.com

Selectステートメントでの変数の宣言と設定

私はいくつかの変数を宣言し、それらをOracleのselectステートメントで使用する単純なクエリを作成しようとしています。 SQL Serverで次のようにこれを行うことができました。

DECLARE @date1   DATETIME
SET @date1 = '03-AUG-2010'

SELECT U.VisualID
FROM Usage u WITH(NOLOCK)
WHERE U.UseTime > @Date1

私が行った検索から、Selectステートメントでこのような変数を宣言および設定することはできないようです。これは正しいのですか、それともmssingですか?

20

私が行った検索から、Selectステートメントでこのような変数を宣言および設定することはできないようです。これは正しいですか、何か不足していますか?

Oracle PL/SQLおよびSQL内には、2つの別個のエンジンを備えた2つの別個の言語があります。 PL/SQL内にSQL DMLを埋め込むと、変数を取得できます。次の匿名PL/SQLブロックなど。末尾の/はPL/SQLの一部ではありませんが、SQL * Plusに前のブロックを送信するように指示します。

declare 
    v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
    v_Count number;
begin
    select count(*) into v_Count
    from Usage
    where UseTime > v_Date1;
    dbms_output.put_line(v_Count);
end;
/

問題は、T-SQLコードと同等のブロックが機能しないことです。

SQL> declare 
  2      v_Date1 date := to_date('03-AUG-2010', 'DD-Mon-YYYY');
  3  begin
  4      select VisualId
  5      from Usage
  6      where UseTime > v_Date1;
  7  end;
  8  /
    select VisualId
    *
ERROR at line 4:
ORA-06550: line 4, column 5:
PLS-00428: an INTO clause is expected in this SELECT statement

匿名ブロック、ストアドプロシージャ、ストアドファンクションのいずれかのPL/SQLからクエリの結果を渡すには、カーソルを宣言して開き、呼び出し元プログラムに返す必要があります。 (この質問に回答する範囲を超えています。EDIT:Oracleストアドプロシージャから結果セットを取得する

データベースに接続するクライアントツールには、独自のバインド変数がある場合があります。 SQL * Plusの場合:

SQL> -- SQL*Plus does not all date type in this context
SQL> -- So using varchar2 to hold text
SQL> variable v_Date1 varchar2(20)
SQL>
SQL> -- use PL/SQL to set the value of the bind variable
SQL> exec :v_Date1 := '02-Aug-2010';

PL/SQL procedure successfully completed.

SQL> -- Converting to a date, since the variable is not yet a date.
SQL> -- Note the use of colon, this tells SQL*Plus that v_Date1
SQL> -- is a bind variable.
SQL> select VisualId
  2  from Usage
  3  where UseTime > to_char(:v_Date1, 'DD-Mon-YYYY');

no rows selected

上記はSQLPlusにあり、Toad PL/SQL開発者などでは動作しない(おそらく動作しない)ことに注意してください。変数とexecで始まる行はSQLPlusコマンドです。これらはSQLまたはPL/SQLコマンドではありません。テーブルが空のため、行が選択されていません。

15

私はこれを試してみましたが、うまくいきました:

define PROPp_START_DT = TO_DATE('01-SEP-1999')

select * from proposal where prop_start_dt = &PROPp_START_DT

3
SVK

SETコマンドはTSQL固有のものです。投稿したものと同等のPLSQLは次のとおりです。

v_date1 DATE := TO_DATE('03-AUG-2010', 'DD-MON-YYYY');

SELECT u.visualid
  FROM USAGE u 
 WHERE u.usetime > v_date1;

また、変数の前に「@」を付ける必要もありません。変数と列などを区別するために、変数の前に「v_」を付ける傾向があります。

NOLOCKに相当するOracleに関するこのスレッド ...を参照してください。

1
OMG Ponies

to_date 関数を試してください。

0
buckbova