2

我正在尝试编写一个简单的 CL 程序来获取文件名参数并使用 COMMIT(*CHG) 和 DBGVIEW(*SOURCE) 在文件中运行 SQL。我收到 CPD018A:路径名包含嵌入的空值:

原因 。. . . . : 路径名 /SQL/TRIGGERS/PCUSTOMERS_INSERT
?????????????????????????????????????????? ??????????????????????????????.
为 SRCSTMF 指定的 SQL 包含一个或多个嵌入的空值 (X'00')。路径名中不允许有空值。

这是我的程序:

PGM        PARM(&FILE)                                  
DCL        VAR(&FILE) TYPE(*CHAR) LEN(100)              
RUNSQLSTM  SRCSTMF('/SQL/' || %TRIM(&FILE) || '.SQL') + 
         DBGVIEW(*SOURCE)                           
ENDPGM                                                  

我正在调用该程序:CALL CCSQL PARM('TRIGGERS/PCUSTOMERS_INSERT').

这可能只是解决真正问题的可怕解决方法:我想SET OPTION在触发器中添加语句:

CREATE OR REPLACE TRIGGER QS36F.PCUSTOMERS_INSERT
INSTEAD OF INSERT ON QS36F.PCUSTOMERS
REFERENCING NEW AS N
FOR EACH ROW
MODE DB2SQL
SET OPTION DBGVIEW =*SOURCE -- this causes a failure when run through JDBC
BEGIN
...

我无法弄清楚如何让 SET OPTION 语句通过 JDBC,所以我每次都必须将这些语句复制到 iSeries Navigator 中。我认为我可以通过调用此 CL 程序的外部过程来改进此工作流程,以在调用流文件中的 SQL 之前处理预编译选项,但我无法使用我发送给过程的参数(或当我从命令行调用它)CALL MYLIB.CCSQL('TRIGGERS/PCUSTOMER_INSERT');

在这一点上,我离我最初的目标还很远......任何建议都非常受欢迎。如果它有助于了解,我是一个试图在 iSeries 7.2 系统上实现它的 PHP/SQL 类型的人。

感谢您的阅读。

4

2 回答 2

2

这是为调试创建的示例过程。

CREATE PROCEDURE myschema.ship_it(IN ordnum INTEGER, IN ordtype CHAR(1),
 IN ordweight dec(3,2))
LANGUAGE SQL
SET OPTION DBGVIEW =*SOURCE
sp: BEGIN
DECLARE ratecalc DECIMAL(5,2);

/* Check for international order */
IF ordtype='I' THEN
 SET ratecalc = ordweight * 5.50;
 INSERT INTO wwshipments VALUES(ordnum,ordweight,ratecalc);
ELSE
 SET ratecalc = ordweight * 1.75;
 INSERT INTO shipments values(ordnum,ordweight,ratecalc);
END IF;
END
于 2016-12-22T22:13:05.337 回答
2

由于命令行解释器和文字值的特殊性,该调用不起作用。

  • 参数总是通过引用传递,这意味着内存地址被放置在堆栈上。
  • 为字符串文字分配内存,就好像它是 char(32);并用空白填充。除非文字更长,在这种情况下为字符串的长度分配内存。
  • 内存分配给作为 DEC(15,5) 的数字参数。

所以你看,正在分配 32 个字节,但你的程序正在查看 100 个字节。因此臭名昭著的“为什么我的 CL 程序参数中有垃圾”

三种解决方案

  • 构建一个命令(*CMD 对象)前端,这将允许命令行解释器准确地知道你的参数有多长。
  • 将参数更改为 char(32)
  • 传递 101 个字节,第 101 个非空白

(像这样)

CALL CCSQL PARM('TRIGGERS/PCUSTOMERS_INSERT                                                                          x')
于 2016-12-21T22:38:09.440 回答