CL:路径名包含嵌入的空值(CPD018A)

时间:2016-12-21 21:54:20

标签: ibm-midrange control-language

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

  

原因。 。 。 。 。 :路径名称/ SQL / TRIGGERS / PCUSTOMERS_INSERT
    ?????????????????????????????????????????????????? ?????????????????????。SQL
    为SRCSTMF指定包含一个或多个嵌入的空值(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之前处理预编译选项来改进此工作流程,但是我无法使用我发送给过程的参数运行CL(或者当我从命令行调用它时{} 1}}

我目前远离我原来的目标......任何建议都非常受欢迎。如果它有助于了解,我是一个尝试在iSeries 7.2系统上创建它的PHP / SQL类型的人。

感谢您的阅读。

2 个答案:

答案 0 :(得分:2)

由于命令行解释器和文字值的特殊性,调用无法正常工作。

  • 参数始终通过引用传递,这意味着内存地址放在堆栈上。
  • 为字符串文字分配内存,就好像它是一个char(32);并用空白填充。除非文字更长,否则将为字符串的长度分配内存。
  • 将内存分配给数字参数DEC(15,5)。

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

三种解决方案

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

(像这样)

CALL CCSQL PARM('TRIGGERS/PCUSTOMERS_INSERT                                                                          x')

答案 1 :(得分:2)

以下是为调试而创建的示例过程。

void callExposeAPi (string id)
{
    ExposeClient exposeClient = GameObject.Find("ExposeClient").GetComponent<ExposeClient>();
    exposeClient.loadExpose(id);
}