Когда я бегу (фрагменты здесь):
t_cmd := 'begin :1 := other_package.some_function(:0,:1,:2); end;';
l_tmstmp timestamp_unconstrained := to_timestamp('1999-07-07 07:07:07.000000000',
'YYYY-MM-DD HH24:MI:SS.FF9');
DBMS_SQL.PARSE(curid, t_cmd, DBMS_SQL.NATIVE);
-- binding here other attributes
DBMS_SQL.BIND_VARIABLE(curid, ':2', l_tmstmp);
ret := DBMS_SQL.EXECUTE(curid);
Я всегда получаю сообщение об ошибке, даже когда пытаюсь связать простую метку времени, метку времени из varchar2 (TO_TIMESTAMP('timestamp_in_proper_format'), 'YYYY-MM-DD HH24:MI:SS.FF9')) :
ORA-01841 :(full) year must be between -4713 and +9999, and not be 0
ORA-06512: przy linia 1
ORA-06512: przy "SYS.DBMS_SQL", line 1825
ORA-06512: przy "MY_PACKAGE", line where is :
ret := DBMS_SQL.EXECUTE(curid);
Что интересно, проблема не возникает при отладке пакета. Я попытался скомпилировать свой пакет:
ALTER PACKAGE my_package COMPILE DEBUG PACKAGE;
но проблема все еще возникает, кроме того, в производственной среде она будет скомпилирована с уровнем оптимизации, поэтому я не могу сделать это таким образом. Кроме того, я не могу использовать EXECUTE IMMEDIATE, потому что имя функции, типы и количество параметров известны во время выполнения.
Есть идеи?
other_package.some_function
? Я мог бы представить, что вы получите это, если бы вы поменяли местами метку времени (или дату) и аргументы varchar2, если бы значение varchar2 и NLS_DATE_FORMAT были подходящими значениями. Таким образом, другие значения, которые вы связываете, также могут быть информативными. - person Alex Poole   schedule 02.04.2014