Хранимая процедура Java не работает в DB2 / 400 V6R1 - используется для работы в V5R4 - PullRequest
1 голос
/ 21 марта 2011

Определение хранимой процедуры:

CREATE PROCEDURE MYSCHEMA.LOAD_ETL ( ) 
    LANGUAGE JAVA 
    SPECIFIC MYSCHEMA.LOAD_ETL
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    CALLED ON NULL INPUT 
    EXTERNAL NAME 'ETL!loadETL' 
    PARAMETER STYLE JAVA ;

В System i Navigator мне предоставлены разрешения на чтение и выполнение. Файл класса Java копируется и компилируется в de AS / 400 в / QIBM / UserData / OS400 / SQLLib / Function / ETL.CLASS .

Когда я пытаюсь выполнить хранимую процедуру с помощью call MYSCHEMA.LOAD_ETL(), я получаю сообщение об ошибке:

[SQL4303] Хранимая процедура Java или имя пользовательской функции, конкретное имя spec-name не может быть идентифицировано из строки внешнего имени.

Объяснение: В операторе CREATE PROCEDURE или CREATE FUNCTION, который объявил эту хранимую процедуру или пользовательскую функцию, было неправильно отформатированное предложение EXTERNAL NAME. Внешнее имя должно быть отформатировано следующим образом: "package.subpackage.class! Method".

Итак, я изменил класс на com.mycompany.ETL. И скопировал и перекомпилировал его внутри AS / 400 в / QIBM / UserData / OS400 / SQLLib / Function / com / mycompany / ETL.class .

И я воссоздаю хранимую процедуру:

CREATE PROCEDURE MYSCHEMA.LOAD_ETL ( ) 
    LANGUAGE JAVA 
    SPECIFIC MYSCHEMA.LOAD_ETL
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    CALLED ON NULL INPUT 
    EXTERNAL NAME 'com.mycompany.ETL!loadETL' 
    PARAMETER STYLE JAVA ;

Однако это все еще не работает.

Теперь ошибка:

SQL0551. ID авторизации не имеет привилегии для выполнения операции над именем объекта.

В System i Navigator я предоставил разрешения на чтение и выполнение файла класса Java в / QIBM / UserData / OS400 / SQLLib / Function / ETL.CLASS .

Я получаю

CPFA0A9 (объект не найден): /QIBM/UserData/OS400/SQLLib/Function/com.mycompany.ETL.class

Итак, я упаковал его в файл jar и скопировал в / QIBM / UserData / OS400 / SQLLib / Function / etl.jar .

Я заново создал хранимую процедуру, но она все равно не работает.

Затем я воссоздаю хранимую процедуру снова:

CREATE PROCEDURE MYSCHEMA.LOAD_ETL ( ) 
    LANGUAGE JAVA 
    SPECIFIC MYSCHEMA.LOAD_ETL
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    CALLED ON NULL INPUT 
    EXTERNAL NAME 'com/mycompany/ETL!loadETL' 
    PARAMETER STYLE JAVA ;

Еще раз, это все еще не работает.

Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 26 марта 2015

Вот что я сделал, чтобы заставить его работать:

  • Метод должен быть открытым и статичным.
  • Обратите внимание на имена классов и методов и регистр.
  • Создайте SP следующим образом:

     CREATE PROCEDURE LIBNAME/PROCNAME()
     PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 
     'MyClassName.methodName'
    

(я использую "system" naming, используйте "." Вместо "/", если это не вашcase).

Обратите внимание, что этот пример связан с (почти) пустым методом, в реальной жизни вам понадобятся параметры IN (и, возможно, OUT).

  • Построить Jarfile
  • Откройте его и получите файл .class
  • Извлеките его в "/ QIBM / UserData / OS400 / SQLLib / Function"
  • Там вы (должны) перейти; -)
0 голосов
/ 05 марта 2012

Это сработало для меня: не указывайте пакет для файла Java, поместите его .class в папку Function и в процедуре установите это EXTERNAL NAME: 'ETL.loadETL'.

...