Если в рассмотренном ранее примере RunThis изменить спецификацию вызова следующим образом:
tkyte@TKYTE816> create or replace 2 function RUN_CMD(p_cmd in varchar2) return number 3 as 4 language java 5 name 'Util.RunThis(String[]) return integer'; 7 /
Function created.
будет выдано сообщение об ошибке ORA-29531. Обратите внимание, что в списке параметров функции Util.RunThis, я указал тип данных String, а не java.lang.String.
tkyte@TKYTE816> exec rc('c:\winnt\system32\cmd.exe /c dir') java.lang.NullPointerException at oracle.aurora.util.JRIExtensions.getMaximallySpecificMethod(JRIExtensions.java) at oracle.aurora.util.JRIExtensions.getMaximallySpecificMethod(JRIExtensions.java) BEGIN RC('c:\winnt\system32\cmd.exe /c dir'); END;
* ERROR at line 1: ORA-29531: no method RunThis in class Util ORA-06512: at "TKYTE.RUN_CMD", line 0 ORA-06512: at "TKYTE.RC", line 5 ORA-06512: at line 1
Дело в том, что для успешного сопоставления типов данных должны указываться полные (fully qualified) имена типов. Хотя класс java.lang неявно импортируется в Java-программах, он не импортируется на уровне языка SQL. Получив это сообщение об ошибке, необходимо проверить сопоставление типов данных и убедиться, что используются полные имена типов данных Java и что они в точности совпадают с именами имеющихся типов данных. Соответствующий Java-метод определяется по сигнатуре, а сигнатура создается на основе используемых типов данных. Минимальное различие в типах входных данных, результатов или регистре символов в имени приведет к несовпадению сигнатур, и сервер Oracle не найдет соответствующий код.