Вопрос

Я пытаюсь создать внешнюю хранимую процедуру на IBM i (V5R4), но при попытке ее запуска получаю сообщение об ошибке.

Все, что я хочу сделать, это вызвать программу RPG, не передавая никаких параметров и не беспокоясь о возврате каких-либо данных.Извините, я не программист ролевых игр и не эксперт по IBM i, поэтому могу упустить что-то очень простое.

SQL для создания процедуры:

CREATE PROCEDURE SOMELIB.SOMEPROC ( ) 

    LANGUAGE RPGLE 

    NOT DETERMINISTIC 

    NO SQL
    EXTERNAL NAME 'OTHERLIB/SOMERG' 

    PARAMETER STYLE GENERAL; 

Ошибка, которую я получаю при выполнении CALL SOMELIB.SOMEPROC():

Состояние SQL:38501
Артикул:-443
Сообщение:[CEE9901] Ошибка приложения.RNX1216 не контролируется BB1002RG в операторе 2100000001, инструкция X'0000'.Причина .....:Приложение завершилось аварийно, поскольку произошло исключение, которое не было обработано.Имя программы, в которую отправляется необработанное исключение, — SOMERG SOMERG.Программа была остановлена ​​по номеру(ам) оператора языка высокого уровня на момент отправки сообщения.Если показано более одного номера оператора, программа является оптимизированной программой ILE.Оптимизация не позволяет определить ни одного номера оператора.Если в качестве значения отображается *N, это означает, что реальное значение недоступно.Восстановление ...:См. ранее перечисленные сообщения низкого уровня, чтобы определить причину исключения.Исправьте все ошибки и повторите запрос.

Это было полезно?

Решение

Ваша процедура вызывает программу RPG без набора списка библиотек.Вы можете сделать одно из двух:

1) Измените F-спецификацию в программе RPG, чтобы указать библиотеку, используя ключевое слово EXTFILE.

2) Вызовите программу CL из хранимой процедуры, которая добавляет соответствующую библиотеку в список библиотек, при этом учитывается тот факт, что библиотека уже могла находиться там из предыдущего вызова.Затем попросите программу CL вызвать программу RPG.

Другие советы

(немного более грубое решение). Определите пользователя, который запускает хранимую процедуру.Измените описание вакансии этого пользователя, чтобы у него был правильный список библиотек.

Но, по моему опыту, программа CL также является наиболее прагматичным решением.

Предполагая, что файл находится в той же библиотеке, что и программа, добавьте EXTFILE(variablename) и USROPN к F-спец.Возьмите имя библиотеки из PSDS и создайте variablename ценность перед тобой OPEN файл.

Если файл и программа находятся в разных библиотеках, вы можете создать область данных в библиотеке программы, чтобы хранить имя библиотеки данных.Получите область данных (с использованием PSDS) вместо использования PSDS (для библиотеки файлов).Если программа и файл не хранятся вместе, может быть хорошей идеей сохранить имя библиотеки данных во внешнем объекте, который можно изменить, а не перекомпилировать.

(На самом деле, последние десять лет я редко использовал области данных.Вместо этого я создаю пользовательский индекс.Каждая запись в *USRIDX заменяет область данных.Записи имеют ключевое значение, которое раньше было именем области данных.Один объект заменяет множество других, и одна процедура может управлять всеми записями.Один объект, которым можно владеть и авторизоваться, снижает некоторые накладные расходы системы.)

Совет по избавлению от этой неприятности:сделать профиль пользователя JOBD содержащим все библиотеки, необходимые хранимой процедуре.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top