更新多于1行-Oracle SQL过程

时间:2019-07-15 23:17:12

标签: oracle procedure

我想知道是否可以用一个过程更新多于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-“精确提取返回的行数超过了请求的行数” *原因:精确提取中指定的数字小于返回的行。 *操作:重写查询或更改请求的行数

2 个答案:

答案 0 :(得分:0)

这行是您的问题:

select sysdate, DATE_FIN_ENC into V_CURRENT_DATE, V_DATE_ENCAN from TP2_ENCAN;

您正在选择DATE_FIN_ENC到可以容纳一个值的标量变量中。您可以在“ x”中选择“ 1”。您不能同时在“ x”中选择“ 1” “ 2”。因此,您会得到错误。

如果我正确理解了您的问题,则可能需要这样做,而没有初始选择:

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

答案 1 :(得分:0)

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

创建或替换过程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;