Хранимая процедура iSeries - как получить ручку вывода файла спула? - PullRequest
0 голосов
/ 02 апреля 2009

У нас есть хранимая процедура, написанная с использованием комбинации программ CL и RPG. При локальном вызове на iSeries все в порядке. При внешнем вызове (например, из внешнего интерфейса SQL) программа RPG не может получить хэдл в файле спула, который она создает, поскольку файл спула появляется под другим (произвольным?) Номером задания и пользователем. Задания выполняются как QUSER в подсистеме QUSRWRK, но файл спула получает идентификатор пользователя, с которым было установлено внешнее соединение в пуле соединений (то есть USERA).

Есть ли способ надежно получить дескриптор правильного файла sppol во время выполнения задания (вместо того, чтобы полагаться на выбор последнего поля буферизации из этой очереди и т. Д.).

Ответы [ 5 ]

1 голос
/ 21 марта 2014

Задание сервера (например, экземпляр сервера базы данных для ODBC / JDBC) выполняется под системным профилем пользователя. Для сохраненных процедур пользователь системы обычно будет QUSER. Объекты, созданные в задании, обычно принадлежат пользователю задания.

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

В частности, для буферизованного вывода, это проблема, потому что подсистема спулинга работала дольше, чем у нас был «Интернет» и до того, как у нас было значительное количество пользователей, подключающихся к удаленным базам данных. Поведение перехода от пользователя к пользователю просто не является частью структуры подсистемы спулинга, и поставщик, такой как IBM, не может определить, когда буферный файл должен принадлежать конкретному пользователю задания или пользователю соединения. (И спулинг не является основным элементом соединений с базой данных.)

IBM адаптировала способ связывания вывода с пользователями, установив по умолчанию вывод «переключенных пользователей» для сбора в задания с именем QPRTJOB , но оно не совсем соответствует тому, как вы Я хочу, чтобы более поздняя RPG-программа обрабатывала вывод.

Однако, если вы создаете сохраненный процесс, который генерирует буферный вывод, он может выбрать, кому принадлежит выход, и тем самым решить оставить его в рамках той же работы. Рассмотрим эти примеры CALL, которые можно вставить в навигатор iSeries «Выполнить сценарии SQL»:

call qsys2.qcmdexc ('OVRPRTF FILE(*PRTF) SPLFOWN(*JOB) OVRSCOPE(*JOB)' , 48);
call qsys2.qcmdexc ('DSPMSGD RANGE(CPF9899) MSGF(QCPFMSG) OUTPUT(*PRINT)' , 51);
call qsys2.qcmdexc ('DLTOVR FILE(*PRTF) LVL(*JOB)' , 28);

Если вы запустите их как набор, они создадут буферные выходные данные, показывающие атрибуты описания сообщения для CPF9899. Если вы проверите впоследствии, вы увидите, что QUSER теперь владеет буферным файлом с именем QPMSGD и находится в задании QZDASOINIT, которое обрабатывает ваши запросы к удаленной базе данных. Программа RPG в этом задании может легко найти буферный файл "* LAST" в этом случае. Кроме того, если вы удалите первый и последний CALL и теперь запустите только средний, вы обнаружите, что у вас есть следующий буферный файл.

(QUSER является IBM по умолчанию. Если ваша система использует другой профиль пользователя, замените этого пользователя на «QUSER».)

Рекомендация:

Измените ваш SP для выдачи соответствующей команды OVRPRTF перед буферизацией вывода, который вам нужно захватить в задании, и для выдачи DLTOVR после генерации вывода.

Вы можете использовать команды, подобные приведенным здесь, для создания процедуры тестирования. Поэкспериментируйте с другими настройками OVRSCOPE () и с FILE (* PRTF) или со специально названными файлами. Кроме того, создайте выходные данные до и после команд переопределения, чтобы увидеть, как они ведут себя по-разному.

Имейте в виду, что задание сервера может обрабатывать другого пользователя после завершения вашего SP (или другой SP может быть вызван позже в работе), поэтому вы должны быть уверены, что DLTOVR выполняется. (Это одна из причин держать его близко к OVRPRTF.)

1 голос
/ 05 июня 2009

Если вы выполняете хранимую процедуру (выполняется в задании QZDASOINIT), вы не сможете получить доступ к буферному выводу через структуру данных состояния программы. Эти буферные файлы находятся в задании с именем user / QPRTJOB, где user - это «текущий пользователь», выполняющий хранимую процедуру. Чтобы получить доступ к буферным файлам, запустите api QSPRILSP, чтобы получить структуру, которая указывает на буферный файл.

Как поведение, так и API хорошо документированы в информационном центре IBM.

0 голосов
/ 08 апреля 2009

Если вы можете изменить программу RPG, вы можете получить информацию о задании из Структура данных о состоянии программы , тогда как Структура данных с информацией о файле имеет номер файла спула из открытой области обратной связи. Однако я не уверен, что информация о работе будет относиться к работе QUSER (не то, что вам нужно) или к работе USERA (что вам нужно). Номер файла спула может быть достаточен для обработки последующих вызовов API API .

0 голосов
/ 28 апреля 2009

Само задание знает или может выяснить (см. Предыдущие ответы), поэтому, если ничего не помогает, измените программу, чтобы поместить сообщение в очередь, которая предоставляет необходимую информацию. Читайте на досуге.

.

0 голосов
/ 02 апреля 2009

Мне нужно немного больше информации, но я сделаю некоторые предположения. Пожалуйста, уточните, если я ошибся.

QUSER в поведении QUSRWRK является правильным. Теперь вы работаете через сервер SQL (или аналогичный сервер). Все соединения выполняются с этими настройками.

Есть пара подходов.

1) Предполагается, что все это выполняется за одно задание. Использование «*» для информации о работе должно работать.

2) Другой вариант - использовать RTVJOBA CURUSER (& ME). Текущий пользователь - это лицо, вошедшее в систему. В этом случае ПОЛЬЗОВАТЕЛЬ не будет работать.

...