小片段中的 ORA-06512 [重复]

Posted

技术标签:

【中文标题】小片段中的 ORA-06512 [重复]【英文标题】:ORA-06512 in small snippet [duplicate] 【发布时间】:2014-04-22 03:07:05 【问题描述】:

我在进行一项小型大学练习时遇到了麻烦。我应该捕获一个异常,具体来说是 ORA-02292,我确实做到了,但由于某种原因,sqldeveloper 在第 14 行给了我一个 ORA-06512,这是我提出应用程序错误的地方。代码如下:

Declare

  v_job_id job.job_id%TYPE := &Job_ID;
  v_error_constraint exception;
  PRAGMA EXCEPTION_INIT(v_error_constraint, -2292);

Begin

  Delete from job
    Where job_id = v_job_id;

Exception

  When v_error_constraint then
   raise_application_error(-20001, 'You are trying to delete a job associated to an employee.');

End;

正如我所说,sqldeveloepr 告诉我在第 14 行有一个 ORA-06512,我不明白这怎么可能。

第 14 行是:

raise_application_error(-20001, 'You are trying to delete a job associated to an employee.'); 

顺便说一句。

希望你们能帮助我。

谢谢!

【问题讨论】:

【参考方案1】:

开发程序员定义的异常

检查您的EXCEPTION 块。您遇到的错误:ORA-06512 警告代码中存在未处理的错误。我从你的 OP 重新排列了 PL/SQL 块,看看我能得到什么样的结果:

[SQL Fiddle][1]

**Oracle 11g R2 Schema Setup**:
-- Stack Overflow Exception Handling

create table job
   ( job_id number  primary key,
     job_name varchar2(200),
     create_date date  
   );

create table employee
   ( ename varchar2(40),
     depno number,
     job_assignment number,
     hire_date date,
        constraint fk_job
        foreign key (job_assignment)
        references job (job_id)
   );

-- Our server does not have DBMS_OUTPUT enabled.  This log table
-- will serve as our programs and their outputs for review.

create table log_table
   ( log_date date,
     message varchar2(2000)
);

-- This utility procedure is *highly* reusable.  I added this
--  to the solution as a substitute for DBMS_OUTPUT feedback
--  messages.  Be sure to query the "log_table" table each time
--  you run a test that calls this procedure.

CREATE PROCEDURE log_the_msg ( msg IN log_table.message%TYPE )
IS
   PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN
   INSERT INTO log_table( log_date, message )
   VALUES(sysdate, msg);
   COMMIT;

END;

insert into job( job_id, job_name, create_date )
 values( 100, 'NINJA', to_date('01/01/2014','MM/DD/YYYY'));

insert into job( job_id, job_name, create_date )
 values( 200, 'RESEARCHER', to_date('01/12/2014','MM/DD/YYYY'));

insert into job( job_id, job_name, create_date )
 values( 300, 'SECURITY', to_date('03/05/2014','MM/DD/YYYY'));

insert into job( job_id, job_name, create_date )
 values( 400, 'ADMINISTRATIVE', to_date('04/15/2014','MM/DD/YYYY'));

insert into job( job_id, job_name, create_date )
 values( 500, 'FACILITIES', to_date('04/21/2014','MM/DD/YYYY'));

commit;

insert into employee( ename, depno, job_assignment, hire_date )
   values('SPLINTER', 20, 100, to_date('03/15/2014','MM/DD/YYYY')); 

insert into employee( ename, depno, job_assignment, hire_date )
   values('MENDEL', 20, 100, to_date('03/16/2014','MM/DD/YYYY')); 

insert into employee( ename, depno, job_assignment, hire_date )
   values('RAFAEL', 10, 100, to_date('03/15/2014','MM/DD/YYYY')); 

insert into employee( ename, depno, job_assignment, hire_date )
   values('DONATELLO', 30, 200, to_date('03/17/2014','MM/DD/YYYY')); 

insert into employee( ename, depno, job_assignment, hire_date )
   values('MICHELANGELO', 20, 200, to_date('03/10/2014','MM/DD/YYYY')); 

commit;

最初发布的 PL/SQL 块(已编辑)

-- Originally Posted PL/SQL Block

Declare

  v_deleted_job_id   job.job_id%TYPE:= 100;
  v_error_constraint exception;
  pragma exception_init(v_error_constraint, -2292);

Begin

  DELETE FROM job
   WHERE job_id = v_deleted_job_id;
  COMMIT;

--Confirmation Checkpoint:
  log_the_msg('Ran PL/SQL Code Block to Completion.');

Exception

   When v_error_constraint then
      log_the_msg(SQLERRM);
      raise_application_error(-20001, 
         'You are trying to delete a job associated to an employee.');

End;

查询 1

SELECT * FROM log_table
   ORDER BY log_date desc

Results

|                     LOG_DATE |                                                                             MESSAGE |
|------------------------------|-------------------------------------------------------------------------------------|
| April, 22 2014 09:22:46+0000 | ORA-02292: integrity constraint (USER_4_AF378.FK_JOB) violated - child record found |
| April, 22 2014 09:22:20+0000 | ORA-02292: integrity constraint (USER_4_AF378.FK_JOB) violated - child record found |

如果您想先了解一些有关 Oracle 数据库异常处理的背景知识,请尝试 Oracle 文档中的以下参考资料:Handling PL/SQL Errors。

通常,如果您正在处理 Oracle 定义的异常,例如:

NO_DATA_FOUND DIVIDE_BY_ZERO TOO_MANY_ROWS DIVIDE_BY_ZERO

触发异常所需要做的就是对项目进行编程以提交错误。例如,在代码主体中,如果您想强制“除以零”异常,只需尝试将除零计算分配给代码中的变量:

v_example_test:= 1500 / 0;

Oracle 在尝试执行该指令时会失败,它会退出代码,进入代码底部定义的EXCEPTION PL/SQL 块。

有关使用命名programmer-defined exceptions 的一些额外提示,例如您的 pl/sql 代码块中的提示:

v_error_constraint

上面的链接建议使用以下格式来开发和测试自定义的、程序员定义的异常:

CREATE [OR REPLACE] PROCEDURE procedure_name
    [ (parameter [,parameter]) ]
    IS
    [declaration_section]

    exception_name EXCEPTION;

BEGIN
    executable_section
    RAISE exception_name;

EXCEPTION
    WHEN exception_name THEN
       [statements]
  
    WHEN OTHERS THEN
       [statements]

END [procedure_name];

【讨论】:

以上是关于小片段中的 ORA-06512 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06533: PL/SQL 中的下标超出计数 ORA-06512

触发器中 ORA-06512 中的未识别错​​误

ORA-01422:- ORA-06512:

ORA-01722:无效号码 ORA-06512:在“BWSTAGE.LOAD_CONTACT_PROCEDURE”,第 8 行 ORA-06512:在第 2 行

Ora-30036 Ora-06512 和 Ora-04088

ORA-04091:表正在变异,触发器/函数可能看不到它,ORA-06512:,ORA-06512:在“SYS.DBMS_SQL”,第 1721 行