ORA-01422:- ORA-06512:

Posted

技术标签:

【中文标题】ORA-01422:- ORA-06512:【英文标题】:ORA-01422: - ORA-06512: 【发布时间】:2018-07-03 13:09:53 【问题描述】:

我的代码有这个错误:

插入 Giocatore(ID_giocatore,username) 值('4','pluto') 报告错误 - ORA-01422: 精确提取返回的行数多于请求的行数 ORA-06512:在“MONOPOLY3.INSERISCI_LOG”,第 6 行 ORA-06512:在“MONOPOLY3.T2”,第 2 行 ORA-04088: 执行触发器 'MONOPOLY3.T2' 期间出错

我们希望将插入到选项卡 Giocatore(ID_giocatore) 上的值保存到 变量“a”用于在 log_giocatore 的 id_giocatore 列中的选项卡 log_giocatore 中查看该值。 这是程序:

create or replace PROCEDURE  inserisci_log
AS
a integer ;
BEGIN
SELECT ID_giocatore 
INTO a
FROM (select ID_giocatore from Giocatore order by ID_GIOCATORE desc)
where rownum <2;
INSERT INTO Log_giocatore ( ID_mossa , ID_partita , ID_giocatore , ID_patrimonio ,ID_proprietà , ID_turno)
VALUES ('1' , '1' , a , '1' ,'1','1');
END inserisci_log;

这是调用过程的触发器:

create or replace TRIGGER  t2
AFTER INSERT OR UPDATE ON Giocatore
begin
inserisci_log;
end;

【问题讨论】:

请从相关标签中删除sql server,因为您似乎在oracle中 ORA-01422: select ID_giocatore from Giocatore order by ID_GIOCATORE desc 返回多于一行 我知道但我无法解决它你能帮我吗?在 giocatore 选项卡中,我们有这些列(ID_giocatore,用户名),它们有更多实例。用户名是表 utente(用户名,密码)的外键。 @Indrakumara 与 where rownum 【参考方案1】:

我建议您可能需要重写您的过程以接受 ID_GIOCATORE 值作为参数,如下所示:

create or replace PROCEDURE inserisci_log(pin_ID_GIOCATORE IN INTEGER)
  AS
  BEGIN
    INSERT INTO Log_giocatore
      ( ID_mossa , ID_partita , ID_giocatore , ID_patrimonio ,ID_proprietà , ID_turno)
    VALUES
      ('1' , '1' , pin_ID_GIOCATORE , '1' ,'1','1');
  END inserisci_log;

然后您可以更改触发器以从新行传递 ID_GIOCATORE 值:

create or replace TRIGGER  t2
  AFTER INSERT OR UPDATE ON Giocatore
  FOR EACH ROW
begin
  inserisci_log(:NEW.ID_GIOCATORE);
end t2;

祝你好运。

【讨论】:

以上是关于ORA-01422:- ORA-06512:的主要内容,如果未能解决你的问题,请参考以下文章

我在编程中不断遇到此问题

比较两个字段并在另一个表中返回不匹配的存储过程

SELECT INTO 语句中的 ora-01422 错误

返回多于 1 行的 SELECT INTO - ORA-01422

Ora-30036 Ora-06512 和 Ora-04088

ORA-01422 包/触发器的重新编译/重新验证(不执行)错误