【问题标题】:Unable to Update file After SQL insert SQLRPGLESQL插入SQLRPGLE后无法更新文件
【发布时间】:2018-10-25 06:43:09
【问题描述】:

大家好,

我正在编写一个程序来构建一个报告,我在其中构建 SQL 语句以将选定的记录插入到文件中,然后插入之后我想对文件进行简单的更新以更改某些记录中的选择字段。

问题是在插入运行后,每当我尝试更新文件时,我都会收到记录或文件正在使用错误。

我尝试使用 sqlrpgle 以及 I/O 读取和设置函数以编程方式更新它,我什至尝试在运行程序后更新 STRSQL 中的文件,但我都遇到了同样的错误。

我怀疑我没有正确关闭某些东西,但我不确定是什么。

代码如下

// Assign SQL Query

    sqlstmt = 'insert into jallib/orhsrpt ('+
              'oacctd, oacmp, oaord, oacust, o8type, ' +
              'o8text, o8date, o8time ) ' +
              'select oacctd, oacmp, oaord, oacust, ' +
              'o8type, o8text, o8date, o8time ' +
              'from r50files.vcohead ' +
              'join r50files.vcopkct ' +
              'on oacmp = o8cmp and oaord = o8ord ' +
              'where oacmp = 1 ' +
              'and o8type not in (' +
              '''C'',''a'',''H'',''E'',''F'', '+
              '''A'',''1'',''N'',''M'') ' +
              'and oacctd = ' + curdate +
              ' order by oaord, o8time ';

    // Prepare for multiple sql statements 

    exec sql
        Set Option Commit = *NONE; 

    // Clear output file before executing SQL

    exec sql
        Delete from jallib/orhsrpt;

    if sqlcode < *zeros; 
        errmsg = 'Delete of file failed'; 
    endif; 

    // Execute SQL Insert statement

    exec sql prepare sqlsel from :sqlstmt;
    exec sql execute sqlsel;

    if sqlcode < *zeros; 
        errmsg = 'Insert of file failed'; 
    endif;

    // Update file data

    exec sql
        Set Option clossqlcsr = *ENDMOD; 

    exec sql  
        Update jallib/orhsrpt 
        set o8text = 'Order Invoiced' 
        where o8type = 'I' 

STRSQL报错如下

JALLIB 类型 *FILE 中的行或对象 ORHSRPT 正在使用中。

【问题讨论】:

  • 您是否在插入后使用显式提交语句尝试过这个?

标签: sql db2 ibm-midrange rpgle


【解决方案1】:

快速回答是插入未关闭,因为您的模块尚未根据您指定的Set Option 结束。但是,这里的正确答案是您根本没有理由使用动态 SQL 语句。一般来说,它们速度较慢且更容易出错,您会遇到类似这样的问题。您应该改为使用常规的嵌入式 SQL 语句,如下所示:

exec sql
    set option commit = *NONE; 

// Clear output file before executing SQL

exec sql
    delete from jallib/orhsrpt;

if sqlstate <> *zeros; 
    errmsg = 'Delete of file failed'; 
endif; 

exec sql
    insert into jallib/orhsrpt (
        oacctd, oacmp, oaord, oacust,
        o8type, o8text, o8date, o8time )
    select oacctd, oacmp, oaord, oacust, o8type,
           o8text, o8date, o8time
    from r50files.vcohead join r50files.vcopkct
        on oacmp = o8cmp and oaord = o8ord
    where oacmp = 1 and o8type not in (
              'C','a','H','E','F', 'A','1','N','M') and
          oacctd = :curdate
    order by oaord, o8time;

exec sql  
    update jallib/orhsrpt 
    set o8text = 'Order Invoiced' 
    where o8type = 'I' 

这是更好的做法,应该可以解决您的问题。

【讨论】:

  • 太棒了!谢谢这个作品。我最初是动态地预测用户修改的请求。但我会用后续的更新语句来解决它
  • 作为一些额外的输入,如果它们可能在不同的字段上进行过滤,我经常使用如下内容:where (:curdate = '0001-01-01' or oacctd = :curdate) and ...。这是一种很好的非动态方式来过滤不同的可能选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2012-05-27
  • 2023-03-27
  • 2012-03-31
相关资源
最近更新 更多