首页 > 解决方案 > 如何从存储过程中调用程序?

问题描述

我已经按照堆栈交换的其他示例从存储过程中调用内置程序,但继续出现错误。

处理这个例子(寻找一个包装在外部 SQL 存储过程中的任何 OS/400 API 的工作示例,包装在用户定义的 SQL 函数中)我构建了以下内容以尝试创建一个包装器命令以允许我更改对象安全性(我的问题是我创建的对象(无论库如何)在我的某些功能中并不总是可供其他人访问,我必须手动设置为一个公共安全组。

CREATE OR REPLACE PROCEDURE XX.TST( IN XOBJ CHAR(32), IN XOBJTYPE CHAR(10), IN XNEWOWN CHAR(10))

LANGUAGE CL

SPECIFIC XX.TST

NOT DETERMINISTIC

NO SQL

CALLED ON NULL INPUT

EXTERNAL NAME 'QSYS/CHGOBJOWN'

PARAMETER STYLE GENERAL;

CALL XX . TST('XX/TBL1','*FILE','GRPFRIENDS');

我收到以下错误:

未找到 QSYS 中的外部程序 CHGOBJOWN

但是已经确认转到终端仿真器的 CL 并键入 QSYS/CHGOBJOWN 会将我带入参数输入屏幕

标签: db2db2-400

解决方案


您正在尝试将命令定义为程序,但这是行不通的。命令对象 (*CMD) 和程序对象 (*PGM) 是两个不同的东西,不能以相同的方式调用。一切都没有丢失。有一个允许您执行命令的 DB2 服务。您只需要构建正确的命令字符串。

您可以像这样调用现有的 DB2 服务,而不是定义存储过程:

call qsys2.qcmdexec('CHGOBJOWN OBJ(XX/TBL1) OBJTYPE(*FILE) NEWOWN(GRPFRIENDS)');

有一个完整的服务列表。文档可以在这里找到。


推荐阅读