sql >> Databáze >  >> RDS >> Oracle

Dynamický parametr data PL/SQL se zachováním hodnoty času

Použijte proměnné vazby

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.

Problém s vaším kódem je v tom, že pro vytvoření vašeho řetězce musí Oracle převést DATE na VARCHAR2 . Dělá to pomocí NLS_DATE_FORMAT vaší relace . Ale vaše relace je NLS_DATE_FORMAT pravděpodobně nezahrnuje časovou složku, takže při skutečném volání vaší procedury je čas ztracen. Použití proměnných vazby znamená, že se nemusíte zabývat tímto druhem implicitní konverze (je také efektivnější a bezpečnější).

Pokud jste se opravdu chtěli vyhnout použití vazebných proměnných, můžete explicitně přetypovat sysdate na řetězec pomocí to_char a poté vložte to_date ve volání dynamické procedury. To je ale spousta kódu navíc a řada zbytečných konverzí.

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 drahokam pro Ruby On Rails

  2. Názvy a aliasy sloupců MySQL

  3. Zdá se, že DictCursor nefunguje pod psycopg2

  4. Hledejte v MySQL pomocí Spaces