Oracle
 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преброяване не. на записи от множество таблици; Oracle DB

  2. Разбор на JSON данни от CLOB поле с помощта на PL/SQL

  3. EXTRACT (datetime) Функция в Oracle

  4. Няма oci8 модул в phpinfo()

  5. 11 начина за намиране на дублиращи се редове, които имат първичен ключ в Oracle