【问题标题】:Updating more than 1 row - Oracle SQL Procedure更新超过 1 行 - Oracle SQL 过程
【发布时间】:2019-11-24 15:43:48
【问题描述】:

我想知道是否可以使用一个程序更新超过 1 行,我不确定为什么这个程序不起作用。仅当我的表中只有 1 行时它才有效。但如果有超过 1 行,我会收到通常的错误消息:

ORA-01422:精确提取返回的行数超过了请求的行数

老实说,我不确定为什么这不起作用。是否有可能一个程序一次不能更新超过 1 行?

create or replace procedure TP3_SP_ARCHIVER_ENCAN
is

    V_CURRENT_DATE date;
    V_DATE_ENCAN date;

begin
    select sysdate, DATE_FIN_ENC into V_CURRENT_DATE, V_DATE_ENCAN 
from 
TP2_ENCAN;

    update TP2_ENCAN
    set EST_ARCHIVEE_ENC = 1,
    STATUT_ENC = 'Archivé'
    where V_CURRENT_DATE - V_DATE_ENCAN > 60;


end TP3_SP_ARCHIVER_ENCAN;
/

我将存档已关闭 60 多天的每个 ENCAN 除外。每次我运行这个程序时,我只想更新那些。

完整的错误信息:

错误报告 - ORA-01422: 精确提取返回的行数多于请求的行数 ORA-06512:在“C##JALAC144.TP3_SP_ARCHIVER_ENCAN”,第 8 行 ORA-06512: 在第 1 行 01422. 00000 - “精确提取返回的行数超过了请求的行数” *原因:exact fetch 中指定的数字小于返回的行数。 *操作:重写查询或更改请求的行数

【问题讨论】:

标签: oracle procedure


【解决方案1】:

这一行是你的问题:

select sysdate, DATE_FIN_ENC into V_CURRENT_DATE, V_DATE_ENCAN from TP2_ENCAN;

您正在将DATE_FIN_ENC 选择到一个只能保存一个值的标量变量中。您可以在“x”中选择“1”。您不能同时选择“1”“2”进入“x”。所以你得到你得到的错误。

如果我正确理解您的问题,您可能想要这个,没有初始选择:

update TP2_ENCAN
   set EST_ARCHIVEE_ENC = 1,
       STATUT_ENC = 'Archivé'
 where SYSDATE - DATE_FIN_ENC > 60;

【讨论】:

  • 啊,我明白了,出于某种原因,我认为必须在过程中使用 select into 语句,谢谢
【解决方案2】:

通过您的代码,您只想根据当前日期更新记录。因此,您不需要使用参数。使用更新脚本就足够了。

创建或替换过程TP3_SP_ARCHIVER_ENCAN是:

begin
    update TP2_ENCAN
    set EST_ARCHIVEE_ENC = 1,
    STATUT_ENC = 'Archivé'
    where sysdate - DATE_FIN_ENC > 60;

end 
TP3_SP_ARCHIVER_ENCAN;

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多