программа вызова в интерактивном sql as400

#db2 #ibm-midrange #db2-400

Вопрос:

Есть ли способ вызвать программу из db2 interactive SQL в as400 (strsql)? эта программа получает аргумент по ссылке и изменяет его содержимое. В CL вы просто называете это так:

 call myprogram 12345
 

Мне нужно иметь возможность вызывать его в интерактивном SQL, есть ли какой-либо способ или обходной путь для этого? например, запустить команду операционной системы? например, в C вы выполняете system(«ваша системная команда»). Я не смог найти ничего, связанного с этим.

Комментарии:

1. ibm.com/docs/en/i/7.4?topic=statements-call

Ответ №1:

STRSQL поддерживает CALL инструкцию SQL.

Лучший вариант-определить программу как внешнюю хранимую процедуру SQL

 --note 
----- numeric-->zoned decimal
----- decimal-->packed decimal
CREATE PROCEDURE MYLIB.MYPROGRAM_SP 
  (IN number numeric(5,0))  
LANGUAGE RPGLE
EXTERNAL NAME 'MYLIB/MYPROGRAM'
PARAMETER STYLE GENERAL;
 

Тогда вы сможете
CALL MYLIB.MYPROGRAM_SP(12345)

Технически каждый объект *PGM в IBM i является хранимой процедурой. Вы можете вызвать его без явного определения, как показано выше. Но в этом случае делаются предположения о пармах. Гораздо лучше предоставить БД определение интерфейса.

Обратите внимание, что STRSQL-это инструмент 20-летней давности, он имеет различные ограничения, в том числе не поддерживает параметры OUT или INOUT хранимых процедур.

Гораздо лучшим выбором является использование компонента «Запуск сценариев SQL» клиентских решений IBM Access (ACS).

Комментарии:

1. Я смог позвонить ему… Параметр INOUT аналогичен передаче параметра по ссылке? Другими словами, невозможно ли отправить переменную из STRSQL, чтобы программа изменила ее содержимое?

2. вы можете отправить его, но STRSQL не покажет вам измененное значение. ACS может и будет.

3. Я начал использовать ACS и создал SP. Один аргумент на самом деле представляет собой массив символов. Если я объявлю его как ЕСТЬ, ничто не приведет к ошибке, но это не отразит изменения. Если я объявлю его как INOUT varchar(30), при вызове он покажет мне ошибку переполнения. Программа, которую я вызываю, записывает только первые 20 байтов. Может быть, вы знаете, что может быть причиной этого? Я называю это так: СОЗДАЙТЕ ПЕРЕМЕННУЮ MYVAR varchar(30) ; установите MYVAR=’1234567890123456789_’; вызовите MYLIB.MYPROG_SP(MYVAR);

4. Я заменил varchar СИМВОЛОМ(30), и это сработало. Ваш пост был очень полезен. Большое спасибо.

5. Парма, которую вы определяете в сохраненном процессе, должна соответствовать ожиданиям программы.