【问题标题】:Using sequences as primary key使用序列作为主键
【发布时间】:2013-04-12 21:15:55
【问题描述】:

我有一个名为INTER 的表,我想使用一个过程将一些数据从INTER 传输到FINAL(一个已创建且为空的新表)。

我必须使用序列作为FINAL 表的主键。 INTER 是父表,它的所有列都存在于 FINAL 中。

我创建了一个序列M_SQ。这是我尝试过的:

create or replace 
PROCEDURE STAGING_TO_CUSTOMER
    AS
     BEGIN
         INSERT INTO FINAL (C_ID,C_NAME,C_PHONE,C_ADDRESS)
         SELECT M_SQ.NEXTVAL,C_NAME,C_PHONE,C_ADDRESS FROM INTER;
         COMMIT;
         EXCEPTION
         WHEN OTHERS THEN
         ROLLBACK;
     END;   

此过程已编译,但没有记录传输到 FINAL

有人可以帮忙吗?我正在使用 sqldeveloper 11g。

【问题讨论】:

  • 去掉“其他情况下的例外”。这只是用来掩盖任何错误。删除后,重新运行该过程。然后你可能会看到一个错误。

标签: plsql oracle11g oracle-sqldeveloper plsqldeveloper


【解决方案1】:

您实际上必须运行该程序才能执行其中的操作:

BEGIN
    STAGING_TO_CUSTOMER;
END;

此外,您的程序可能看起来像:

CREATE OR REPLACE PROCEDURE STAGING_TO_CUSTOMER AS
BEGIN
     INSERT INTO FINAL (C_ID,C_NAME,C_PHONE,C_ADDRESS)
     SELECT M_SQ.NEXTVAL,C_NAME,C_PHONE,C_ADDRESS FROM INTER;
     COMMIT;
     EXCEPTION
     WHEN OTHERS THEN
         ROLLBACK;
         RAISE;
END;

所以你知道是否发生了什么。

【讨论】:

  • 我知道..我尝试运行该程序。正如我所说,该过程已编译并成功运行,但是;当我检查 FINAL 表时,它仍然是空的
  • 我收到以下错误:- 错误报告:ORA-01722:无效号码 ORA-06512:在“SYSTEM.STAGING_TO_CUSTOMER”,第 11 行 ORA-06512:在第 2 行 01722.00000 -“无效number" *原因:*行动:这是什么意思?
  • 哦,FINAL表中有NUMBER类型的列吗? (id栏除外)
  • 是的。 C_PHONE 列是 NUMBER
  • 好的,所以值01722. 00000 不是数字,可能无法插入其中。检查原始表 (INTER) 以查看 C_PHONE 字段的列类型。
【解决方案2】:

您不需要存储过程 - 您可以按原样运行命令:

INSERT INTO FINAL (C_ID,C_NAME,C_PHONE,C_ADDRESS) SELECT M_SQ.NEXTVAL,C_NAME,C_PHONE,C_ADDRESS FROM INTER; 
COMMIT;

【讨论】:

  • 我知道我可以运行该命令,但它是要求的一部分,因此我必须使用程序。它被编译并在我调用它时成功运行。但是,表格 FINAL 仍然是空的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2020-09-22
  • 2016-05-05
相关资源
最近更新 更多