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

時間値を保持した動的PL/SQL日付パラメータ

    バインド変数を使用する

    SQL> create or replace procedure proc( p_dt in date )
      2  as
      3  begin
      4    dbms_output.put_line( to_char( p_dt, 'yyyy-mm-dd hh24:mi:ss' ));
      5  end;
      6  /
    
    Procedure created.
    
    SQL> declare
      2    l_sql varchar2(1000);
      3  begin
      4    l_sql := 'begin proc(:dt); end;';
      5    execute immediate l_sql using sysdate;
      6  end;
      7  /
    2013-08-26 22:14:26
    
    PL/SQL procedure successfully completed.
    

    コードの問題は、文字列を作成するために、OracleがDATEを変換する必要があることです。 VARCHAR2に 。それはあなたのセッションのNLS_DATE_FORMATを使用してそれを行います 。ただし、セッションのNLS_DATE_FORMAT おそらく時間コンポーネントが含まれていないため、プロシージャが実際に呼び出されたときに時間が失われます。バインド変数を使用するということは、そのような暗黙の変換を処理する必要がないことを意味します(また、より効率的で安全です)。

    バインド変数の使用を本当に避けたい場合は、sysdateを明示的にキャストできます。 to_charを使用して文字列に変換します 次に、to_dateを配置します 動的プロシージャ呼び出しで。しかし、それは多くの余分なコードと多くの不要な変換です。

    SQL> ed
    Wrote file afiedt.buf
    
      1  declare
      2    l_sql varchar2(1000);
      3  begin
      4    l_sql := q'{begin proc(to_date('}' ||
      5               to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') ||
      6               q'{', 'yyyy-mm-dd hh24:mi:ss')); end;}';
      7    execute immediate l_sql;
      8* end;
    SQL> /
    2013-08-26 22:19:52
    
    PL/SQL procedure successfully completed.
    



    1. mysqlインデックスが完全にメモリに収まるかどうかを判断する方法

    2. plv8関数内から別のスキーマの関数を呼び出すことは可能ですか?

    3. 初心者向けのSQL以下(=)演算子

    4. ネストされたトランザクションはMySQLで許可されていますか?