sql >> データベース >  >> RDS >> Oracle

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

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

    Oracle PL / SQLおよびSQLには、2つの別個のエンジンを備えた2つの別個の言語があります。 PL /SQL内にSQLDMLを埋め込むことができ、それによって変数が取得されます。次の匿名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からクエリの結果(匿名ブロック、ストアドプロシージャ、またはストアド関数のいずれか)を渡すには、カーソルを宣言して開き、呼び出し元のプログラムに戻す必要があります。 (この質問に答える範囲を超えています。編集: 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開発者などでは機能しない可能性があります(おそらく機能しない可能性があります)。variableおよびexecで始まる行はSQLです。 プラスコマンド。これらはSQLまたはPL/SQLコマンドではありません。テーブルが空であるため、行が選択されていません。



    1. OracleはNumberデータ型の末尾のゼロを格納しますか?

    2. PostgreSQLのチェック制約を理解する

    3. SQLServerのすべてのサーバートリガーのリストを返す

    4. MySQL LN()関数–数値の自然対数を返します