MCH5003,标量错误 - ILE RPG

时间:2017-05-19 19:30:11

标签: pointers memory-leaks ibm-midrange rpgle

被叫程序条目:

dcl-pi PGM1;
  choice uns(3) const;
  returnCode likeds(returnCodeTpl);
  parameterPtr pointer const options(*nopass);
  parameterPtr2 pointer const options(*nopass);
  parameterPtr3 pointer const options(*nopass);
end-pi;

来电计划:

document.field1 = 'EL';
document.field2 = 'T';
document.field3 = 2780;

PGM1(1:returnCode:%addr(document));

document定义( on called ):

dcl-ds document_ qualified based(parameterPtr);
  field1 char(2);
  field2 char(1);
  field3 packed(7:0);
end-ds;

document定义( on caller ):

dcl-ds document qualified inz;
  field1 char(2);
  field2 char(1);
  field3 packed(7:0);
end-ds;

被叫程序然后处理document DS,调用导出的过程:

select;
  ...
  when (1 = choice);
    myProc(document_);
  ...
endsl;

myProc定义:

dcl-proc myProc export;

  dcl-pi *n ind;
    document likeds(document_) const;
  end-pi;

  dcl-s i int(5) inz;

  exec sql                    <--- Error appears there
    select count(field1) into :i from myFile
    where
      field1 = :document.field1 and
      field2 = :document.field2 and
      field3 = :document.field3;

  ...

  return i > 0;

end-proc;

myFile个字段在document个字段中相等。

持续得到的错误是 MCH5003 - 标量错误。无效标量操作数的长度为128. 调试停止exec sql子句。

我真的无法弄清楚它是什么!

2 个答案:

答案 0 :(得分:1)

dcl-ds document_ qualified based(parameterPtr);与调用者的PI相关的位置是什么?

我怀疑你应该按值传递指针,而不是CONST引用......

dcl-pi PGM1;
  choice uns(3) const;
  returnCode likeds(returnCodeTpl);
  parameterPtr pointer VALUE options(*nopass);
  parameterPtr2 pointer VALUE options(*nopass);
  parameterPtr3 pointer VALUE options(*nopass);
end-pi;

但我仍然认为没有理由搞乱指针..

<强>更新
我认为您不需要3个参数...您可以使用相同的指针定义多个BASED(ptr)变量。

dcl-pi PGM1;
  choice uns(3) const;
  returnCode likeds(returnCodeTpl);
  parameterPtr pointer VALUE options(*nopass);
end-pi;

dcl-ds doc1 likeds(doc1_t) based(ptr);
dcl-ds doc2 likeds(doc3_t) based(ptr);
dcl-ds doc3 likeds(doc3_t) based(ptr);

  ptr = parameterPtr;
  //all three DS are overlaying the same memory at this point
  // you have to make sure you only access the DS that corresponds to
  // the actual memory layout being used... 
  select;
    when (1 = choice);
      myProc(doc1);
    when (2 = choice);
      myProc2(doc2);
    when (1 = choice);
      myProc3(doc3);
   endsl;

答案 1 :(得分:0)

最后,它是一个参数传递错误。
在调用PGM1之前,对PGM2的另一个调用是将八个参数中的第二个作为char(91)而不是char(500)传递。
我没有看到它,因为它被定义为likeds(),并且DS应该是500字节长。

非常感谢@Charles。