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