Небольшой пример того как можно получить ORA-01866 при вызове удаленного модуля через database link.
Все действия производим под пользователем test(create session,create database link,create procedure).
Создадим тестовую процедуру с выходным параметром:
Далее создадим database link, для демонстрации, просто на самого себя:
И выполним небольшой блок для того что бы получить ошибку:
Конечно, мы специально не присваивали переменной vvv в теле процедуры никаких значений, что и повлекло подобную ошибку при обращении через dblink.
При этом, без dblink'а все работает хорошо:
Поправим процедуру:
И повторим эксперимент:
Ошибка больше не возникает.
Все действия производим под пользователем test(create session,create database link,create procedure).
Создадим тестовую процедуру с выходным параметром:
SQL> create or replace procedure test.testproc(vvv out timestamp) 2 as 3 begin 4 null; 5 return; 6 end; 7 / Procedure created. |
Далее создадим database link, для демонстрации, просто на самого себя:
SQL> create database link testlink using '(description=(address_list=(address=(protocol=tcp)(host=localhost)(port=1521)))(connect_data=(server=dedicated)(sid=orcl)))'; Database link created. |
И выполним небольшой блок для того что бы получить ошибку:
SQL> declare 2 myts timestamp; 3 begin 4 test.testproc@testlink(myts); 5 end; 6 / declare * ERROR at line 1: ORA-01866: the datetime class is invalid ORA-06512: at line 4 |
При этом, без dblink'а все работает хорошо:
SQL> declare 2 myts timestamp; 3 begin 4 test.testproc(myts); 5 end; 6 / PL/SQL procedure successfully completed. |
SQL> create or replace procedure test.testproc(vvv out timestamp) 2 as 3 begin 4 vvv:=null; 5 return; 6 end; 7 / Procedure created. |
SQL> declare 2 myts timestamp; 3 begin 4 test.testproc@testlink(myts); 5 end; 6 / PL/SQL procedure successfully completed. |