【问题标题】:Oracle DB get wierd errorsOracle DB 出现奇怪的错误
【发布时间】:2016-04-20 02:02:25
【问题描述】:

我有下一个存储过程:

create or replace procedure generate_tables_for_project
as
begin
execute immediate 'create table farmers (email nvarchar2(30) PRIMARY KEY, fname nvarchar2(30), lname nvarchar2(30), password nvarchar2(30),  farmname nvarchar2(30), region nvarchar2(30), address nvarchar2(30) )';
execute immediate 'create table ISRAELLOCATIONS (region nvarchar2(30), regionID number(2) PRIMARY KEY )';
execute immediate 'create table product (name nvarchar2(30), productID number(2) PRIMARY KEY )';
execute immediate 'create table sub_product (name nvarchar2(30), sub_productID number(3) PRIMARY KEY , product_id number(2) REFERENCES product( productID))'; EXCEPTION
WHEN OTHERS THEN IF SQLCODE = -955
THEN
raise_application_error(-20001, 'Tables Exist!!!');--DBMS_OUTPUT.PUT_LINE( 'Data already exist!!!');
END IF;
end  generate_tables_for_project;

现在,当我在 SQLdeveloper 中激活该过程时,它就可以创建表了。 但是我再次激活我想只得到-955表存在错误。 但我也得到了错误:

ORA-20001: Tables Exist!!!
ORA-06512: at "HR.GENERATE_TABLES_FOR_PROJECT", line 11
ORA-06512: at line 2

ORA-20001 错误是我为 0955 引发的错误,所以这很好, 但是另外两个是什么?!

谢谢!

【问题讨论】:

  • 另外两个不是错误。 ORA 06512 只是错误堆栈中与顶级异常相关的消息的标识符。您只需要处理堆栈顶部的实际错误。

标签: php ajax oracle xampp oracle10g


【解决方案1】:

另外两个错误是因为HR.GENERATE_TABLES_FOR_PROJECT 过程中有错误,错误在第 2 行。

【讨论】:

  • 这是程序,create语句中的错误是什么?
  • 您的创建语句没有错误。但是由于表存在,在该语句上创建的表失败。这些实际上是一个错误堆栈,可以引导您找到错误的确切点。
  • @Shariar Imtiaz 如果因为表存在而出现错误,所以假设只有 955 错误,那么我如何处理添加错误 6512?
  • 这并不是真正的附加错误——ORA-06512 只是在不同级别的 Oracle 中针对堆栈顶部的实际错误发出的一系列相关消息的标识符。您只需要处理顶级异常。
【解决方案2】:

它显示错误堆栈,并不意味着您有更多错误;例如:

    SQL> CREATE OR REPLACE PROCEDURE test_error IS
  2  BEGIN
  3      raise_application_error(-20001, 'Error 1');
  4  EXCEPTION
  5      WHEN OTHERS THEN
  6          raise_application_error(-20002, 'Error 2');
  7  END;
  8  /

Procedure created.

SQL> exec test_error
BEGIN test_error; END;

*
ERROR at line 1:  
ORA-20002: Error 2
ORA-06512: at "SIUCONTAB.TEST_ERROR", line 6
ORA-06512: at line 1

【讨论】:

  • 好的,豪尼可以处理这个异常吗?
  • 我不认为你可以; here 是关于这个的旧讨论。您不能通过使用 dbms_output 或任何其他日志记录方式来避免 raise_application_error 吗?
  • 它很好,但如果与dbms_output.put_line( sqlerrm );一起工作,我无法捕捉到955异常@Aleksej
猜你喜欢
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2017-09-14
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多