SQL插入SQLRPLE后无法更新文件

SQL插入SQLRPLE后无法更新文件,sql,db2,ibm-midrange,rpgle,Sql,Db2,Ibm Midrange,Rpgle,大家好 我正在编写一个程序来构建一个报告,其中我构建了SQL语句来将选定的记录插入到一个文件中,在插入之后,我想对该文件进行一个简单的更新,以更改某些记录中的选定字段 问题是,在运行insert之后,每当我尝试更新文件时,都会出现记录或文件正在使用错误 我尝试过用sqlrpgle和I/O read和set函数以编程方式更新它,甚至在运行程序后尝试过用STRSQL更新文件,结果都出现了相同的错误 我怀疑我没有正确地关闭某些东西,但我不确定是什么 代码如下 // Assign SQL Query

大家好

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

问题是,在运行insert之后,每当我尝试更新文件时,都会出现记录或文件正在使用错误

我尝试过用sqlrpgle和I/O read和set函数以编程方式更新它,甚至在运行程序后尝试过用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' 
//分配SQL查询
sqlstmt='插入jallib/orhsrpt('+
'oacctd、oacmp、oaord、oacust、o8type,'+
“O8文本、O8日期、O8时间)”+
'选择oacctd、oacmp、oaord、oacust,'+
'o8type,o8text,o8date,o8time'+
'来自r50files.vcohead'+
'加入r50files.vcopkct'+
'在oacmp=o8cmp和oaord=o8ord上'+
'其中oacmp=1'+
'和O8类型不在('+
‘C’、‘a’、‘H’、‘E’、‘F’、’+
“A”、“1”、“N”、“M”)”+
'和oacctd='+curdate+
“Oord命令,O8时间”;
//准备多个sql语句
执行sql
设置选项Commit=*NONE;
//在执行SQL之前清除输出文件
执行sql
从jallib/orhsrpt中删除;
如果sqlcode<*零;
errmsg='删除文件失败';
endif;
//执行SQL Insert语句
exec-sql-prepare-sqlsel-from:sqlstmt;
execsql执行sqlsel;
如果sqlcode<*零;
errmsg='插入文件失败';
endif;
//更新文件数据
执行sql
设置选项clossqlcrs=*ENDMOD;
执行sql
更新jallib/orhsrpt
设置o8text='订单发票'
其中o8type='I'
来自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' 
正在使用JALLIB type*文件中的行或对象ORHSRPT


快速回答是插入未关闭,因为您的模块尚未根据指定的
Set选项结束。但是,这里的正确答案是,您根本没有理由使用动态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' 
exec-sql
设置选项commit=*NONE;
//在执行SQL之前清除输出文件
执行sql
从jallib/orhsrpt中删除;
如果sqlstate*为零;
errmsg='删除文件失败';
endif;
执行sql
插入jallib/orhsrpt(
oacctd、oacmp、oaord、oacust、,
O8类型、O8文本、O8日期、O8时间)
选择oacctd、oacmp、oaord、oacust、o8type、,
O8文本、O8日期、O8时间
从r50files.vcohead加入r50files.vcopkct
在oacmp=o8cmp和oaord=o8ord上
其中oacmp=1,O8类型不在(
‘C’、‘a’、‘H’、‘E’、‘F’、‘a’、‘1’、‘N’、‘M’)和
oacctd=:curdate
oaord订购,O8次;
执行sql
更新jallib/orhsrpt
设置o8text='订单发票'
其中o8type='I'

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

快速回答是插入未关闭,因为您的模块未根据指定的
设置选项结束。但是,这里的正确答案是,您根本没有理由使用动态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' 
exec-sql
设置选项commit=*NONE;
//在执行SQL之前清除输出文件
执行sql
从jallib/orhsrpt中删除;
如果sqlstate*为零;
errmsg='删除文件失败';
endif;
执行sql
插入jallib/orhsrpt(
oacctd、oacmp、oaord、oacust、,
O8类型、O8文本、O8日期、O8时间)
选择oacctd、oacmp、oaord、oacust、o8type、,
O8文本、O8日期、O8时间
从r50files.vcohead加入r50files.vcopkct
在oacmp=o8cmp和oaord=o8ord上
其中oacmp=1,O8类型不在(
‘C’、‘a’、‘H’、‘E’、‘F’、‘a’、‘1’、‘N’、‘M’)和
oacctd=:curdate
oaord订购,O8次;
执行sql
更新jallib/orhsrpt
设置o8text='订单发票'
其中o8type='I'

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

您在插入后使用显式提交语句进行了尝试吗?您在插入后使用显式提交语句进行了尝试吗?太好了!谢谢,这很有效。我最初动态地预测用户修改请求。但是我将使用后续的更新语句作为一些额外的输入,如果它们可能在不同的字段上进行过滤,我通常使用如下内容:
where(:curdate='0001-01-01'或oacctd=:curdate)和…
。这是一个很好的非动态方式来过滤不同的可能选择。太好了!谢谢,这很有效。我最初动态地预测用户修改请求。但是我将使用后续的更新语句作为一些额外的输入,如果它们可能在不同的字段上进行过滤,我通常使用如下内容:
where(:curdate='0001-01-01'或oacctd=:curdate)和…
。这是一种很好的非动态方式来过滤不同的可能选择。