精华内容
下载资源
问答
  • Oracle触发器抛出自定义异常 现有学生表 student(sno int,sname varchar2(20)) 成绩表 score(sno int,cno varchar2(10),degree number) 给student编写一个触发器,当删除一个学生信息时将触发该触发器,判断该学生...

    Oracle触发器抛出自定义异常

    现有学生表

    student(sno int,sname varchar2(20))

    成绩表

    score(sno int,cno varchar2(10),degree number)

    给student编写一个触发器,当删除一个学生信息时将触发该触发器,判断该学生是否已经选课,如果该学生已经选课。将激发一个异常,把无法删除的信息返回给用户。

    create or replace trigger tri_delete_student
    before delete on student
    for each row
    declare
    num int;
    myexp exception;
    begin
    select count(*) into num from score where sno=:old.sno;
    if num>0 then
    raise myexp;
    end if;
    exception
    when myexp then raise_application_error(’-20002’, ‘该学生已选课,无法删除’);

    end;

    在Oracle中,遇到的系统异常都有对应的异常码,在应用系统开发中,用户自定义的异常也可以指定一个异常码和异常信息,Oracle系统为用户预留了自定义异常码,其范围介于-20000到-20999之间的负整数。引发应用程序异常的语法是:

    RAISE_APPLICATION_ERROR(异常码,异常信息)

    展开全文
  • 触发器异常处理

    千次阅读 2014-03-31 16:45:27
    上上周,帮别人调试存储过程,触发器中的异常处理没有进行处理。把代码贴出来。[code="java"]create or replace trigger TRG_test before insert or delete or update on user for each row DECLARE ...
    上上周,帮别人调试存储过程,触发器中的异常处理没有进行处理。把代码贴出来。
    
    create or replace trigger TRG_test
    before insert or delete or update on user
    for each row
    DECLARE
    Table_name varchar(255);
    begin
    select TABLE_NAME into Table_name from user_triggers where TRIGGER_NAME='TRG_test';
    begin
    update nc set deletetime = to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')
    where id=Table_name;
    exception
    when others then
    DBMS_OUTPUT.PUT_LINE('delete');
    end;
    end if;
    if UPDATING then
    begin
    update nc set updatetime = to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')
    where id=Table_name;
    exception
    when others then
    DBMS_OUTPUT.PUT_LINE('update');
    end;
    end if;
    exception
    when others then
    DBMS_OUTPUT.PUT_LINE('EXCEPTION');
    end;
    delete或update的时,出现异常时,并没有打印‘delete’或‘update’,不知道为什么,于是加一个参数判断是否存在这条记录,如果不存在再插入,简略的实现
     select count(*) into countN from nc where id = Table_name;
    if countN >1 then
    update……
    end if;

    另外触发器一般不能用commit和rollback语句,除非声明事务,加上
    pragma   autonomous_transaction;
    展开全文
  • 5.1异常处理概念 5.1.1预定义的异常处理 5.1.2非预定义的异常处理 5.1.3用户自定义的异常处理 5.1.4用户定义的异常处理 5.2异常错误传播 5.2.1在执行部分引发异常错误 5.2.2在声明部分引发异常错误 5.3异常...

    本篇主要内容如下:

    5.1 异常处理概念

    5.1.1 预定义的异常处理

    5.1.2 非预定义的异常处理

    5.1.3 用户自定义的异常处理

    5.1.4  用户定义的异常处理

    5.2 异常错误传播

    5.2.1 在执行部分引发异常错误

    5.2.2 在声明部分引发异常错误

    5.3 异常错误处理编程

    5.4  在 PL/SQL 中使用 SQLCODE, SQLERRM异常处理函数

    即使是写得最好的PL/SQL程序也会遇到错误或未预料到的事件。一个优秀的程序都应该能够正确处理各种出错情况,并尽可能从错误中恢复。任何ORACLE错误(报告为ORA-xxxxx形式的Oracle错误号)、PL/SQL运行错误或用户定义条件(不一写是错误),都可以。当然了,PL/SQL编译错误不能通过PL/SQL异常处理来处理,因为这些错误发生在PL/SQL程序执行之前。

    ORACLE 提供异常情况(EXCEPTION)和异常处理(EXCEPTION HANDLER)来实现错误处理。

     

    5.1 异常处理概念

    异常情况处理(EXCEPTION)是用来处理正常执行过程中未预料的事件,程序块的异常处理预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行.

     

    有三种类型的异常错误:

        1. 预定义 ( Predefined )错误

      ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。

        2. 非预定义 ( Predefined )错误

       即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。

        3. 用户定义(User_define) 错误

     程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。

     

    异常处理部分一般放在 PL/SQL 程序体的后半部,结构为:

     

     

    EXCEPTION
       WHEN first_exception THEN  <code to handle first exception >
       WHEN second_exception THEN  <code to handle second exception >
       WHEN OTHERS THEN  <code to handle others exception >
    END;

     

    异常处理可以按任意次序排列,但 OTHERS 必须放在最后.

     

    5.1.1 预定义的异常处理

     

       预定义说明的部分 ORACLE 异常错误

    错误号

    异常错误信息名称

    说明

    ORA-0001

    Dup_val_on_index

    违反了唯一性限制

    ORA-0051

    Timeout-on-resource

    在等待资源时发生超时

    ORA-0061

    Transaction-backed-out

    由于发生死锁事务被撤消

    ORA-1001

    Invalid-CURSOR

    试图使用一个无效的游标

    ORA-1012

    Not-logged-on

    没有连接到ORACLE

    ORA-1017

    Login-denied

    无效的用户名/口令

    ORA-1403

    No_data_found

    SELECT INTO没有找到数据

    ORA-1422

    Too_many_rows

    SELECT INTO 返回多行

    ORA-1476

    Zero-divide

    试图被零除

    ORA-1722

    Invalid-NUMBER

    转换一个数字失败

    ORA-6500

    Storage-error

    内存不够引发的内部错误

    ORA-6501

    Program-error

    内部错误

    ORA-6502

    Value-error

    转换或截断错误

    ORA-6504

    Rowtype-mismatch

    宿主游标变量与 PL/SQL变量有不兼容行类型

    ORA-6511

    CURSOR-already-OPEN

    试图打开一个已处于打开状态的游标

    ORA-6530

    Access-INTO-null

    试图为null 对象的属性赋值

    ORA-6531

    Collection-is-null

    试图将Exists 以外的集合( collection)方法应用于一个null pl/sql 表上或varray上

    ORA-6532

    Subscript-outside-limit

    对嵌套或varray索引得引用超出声明范围以外

    ORA-6533

    Subscript-beyond-count

    对嵌套或varray 索引得引用大于集合中元素的个数.

        

    对这种异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。

     

    例1:更新指定员工工资,如工资小于1500,则加100;

    DECLARE
       v_empno employees.employee_id%TYPE := &empno;
       v_sal   employees.salary%TYPE;
    BEGIN
       SELECT salary INTO v_sal FROM employees WHERE employee_id = v_empno;
       IF v_sal<=1500 THEN 
            UPDATE employees SET salary = salary + 100 WHERE employee_id=v_empno; 
            DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已更新!');     
       ELSE
            DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已经超过规定值!');
       END IF;
    EXCEPTION
       WHEN NO_DATA_FOUND THEN  
          DBMS_OUTPUT.PUT_LINE('数据库中没有编码为'||v_empno||'的员工');
       WHEN TOO_MANY_ROWS THEN
          DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
    END; 

     5.1.2 非预定义的异常处理

     

    对于这类异常情况的处理,首先必须对非定义的ORACLE错误进行定义。步骤如下:

    1. 在PL/SQL 块的定义部分定义异常情况:

    <异常情况>  EXCEPTION;

    2. 将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句:

    PRAGMA EXCEPTION_INIT(<异常情况>, <错误代码>);

    3. 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

     

     

    例2:删除指定部门的记录信息,以确保该部门没有员工。

    INSERT INTO departments VALUES(50, 'FINANCE', 'CHICAGO');
    
    DECLARE
       v_deptno departments.department_id%TYPE := &deptno;
       deptno_remaining EXCEPTION;
       PRAGMA EXCEPTION_INIT(deptno_remaining, -2292);
       /* -2292 是违反一致性约束的错误代码 */
    BEGIN
       DELETE FROM departments WHERE department_id = v_deptno;
    EXCEPTION
       WHEN deptno_remaining THEN 
          DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
    END;

    5.1.3 用户自定义的异常处理

    当与一个异常错误相关的错误出现时,就会隐含触发该异常错误。用户定义的异常错误是通过显式使用 RAISE 语句来触发。当引发一个异常错误时,控制就转向到 EXCEPTION块异常错误部分,执行错误处理代码。

     

    对于这类异常情况的处理,步骤如下:

    1. 在PL/SQL 块的定义部分定义异常情况:

    <异常情况>  EXCEPTION;

    2. RAISE <异常情况>;

     

     

    3. 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。

     

     

    例3:更新指定员工工资,增加100;

     

    DECLARE
       v_empno employees.employee_id%TYPE :=&empno;
       no_result  EXCEPTION;
    BEGIN
       UPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;
       IF SQL%NOTFOUND THEN
          RAISE no_result;
       END IF;
    EXCEPTION
       WHEN no_result THEN 
          DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
    END;

    5.1.4  用户定义的异常处理

     

    调用DBMS_STANDARD(ORACLE提供的包)包所定义的RAISE_APPLICATION_ERROR过程,可以重新定义异常错误消息,它为应用程序提供了一种与ORACLE交互的方法。

     

    RAISE_APPLICATION_ERROR 的语法如下:

     RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors] );

     这里的error_number 是从 –20,000 到 –20,999 之间的参数,

        error_message 是相应的提示信息(< 2048 字节),

      keep_errors 为可选,如果keep_errors =TRUE ,则新错误将被添加到已经引发的错误列表中。如果keep_errors=FALSE(缺省),则新错误将替换当前的错误列表。

     

    例4:创建一个函数get_salary, 该函数检索指定部门的工资总和,其中定义了-20991和-20992号错误,分别处理参数为空和非法部门代码两种错误:

    CREATE TABLE errlog(
      Errcode NUMBER,
      Errtext CHAR(40));
    
    CREATE OR REPLACE FUNCTION get_salary(p_deptno NUMBER)
    RETURN NUMBER 
    AS
      v_sal NUMBER;
    BEGIN
      IF p_deptno IS NULL THEN
        RAISE_APPLICATION_ERROR(-20991, ’部门代码为空’);
      ELSIF p_deptno<0 THEN
        RAISE_APPLICATION_ERROR(-20992, ’无效的部门代码’);
      ELSE
        SELECT SUM(employees.salary) INTO v_sal FROM employees 
        WHERE employees.department_id=p_deptno;
        RETURN v_sal;
      END IF;
    END;
    
    DECLARE 
      V_salary NUMBER(7,2);
      V_sqlcode NUMBER;
      V_sqlerr VARCHAR2(512);
      Null_deptno EXCEPTION;
      Invalid_deptno EXCEPTION;
      PRAGMA EXCEPTION_INIT(null_deptno,-20991);
      PRAGMA EXCEPTION_INIT(invalid_deptno, -20992);
    BEGIN
      V_salary :=get_salary(10);
      DBMS_OUTPUT.PUT_LINE('10号部门工资:' || TO_CHAR(V_salary));
    
      BEGIN
        V_salary :=get_salary(-10);
      EXCEPTION
        WHEN invalid_deptno THEN
          V_sqlcode :=SQLCODE;
          V_sqlerr  :=SQLERRM;
          INSERT INTO errlog(errcode, errtext) 
          VALUES(v_sqlcode, v_sqlerr);
          COMMIT;
      END inner1;
    
      V_salary :=get_salary(20);
      DBMS_OUTPUT.PUT_LINE('部门号为20的工资为:'||TO_CHAR(V_salary));
    
      BEGIN
        V_salary :=get_salary(NULL);
      END inner2;
    
      V_salary := get_salary(30);
      DBMS_OUTPUT.PUT_LINE('部门号为30的工资为:'||TO_CHAR(V_salary));
    
      EXCEPTION
        WHEN null_deptno THEN
          V_sqlcode :=SQLCODE;
          V_sqlerr  :=SQLERRM;
          INSERT INTO errlog(errcode, errtext) VALUES(v_sqlcode, v_sqlerr);
          COMMIT;
        WHEN OTHERS THEN
             DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
    END outer;
    

    例5:定义触发器,使用RAISE_APPLICATION_ERROR阻止没有员工姓名的新员式记录插入:

    CREATE OR REPLACE TRIGGER tr_insert_emp
    BEFORE INSERT ON employees
    FOR EACH ROW
    BEGIN
      IF :new.first_name IS NULL OR :new.last_name is null THEN
        RAISE_APPLICATION_ERROR(-20000,'Employee must have a name.');
      END IF;
    END;

    5.2 异常错误传播

        由于异常错误可以在声明部分和执行部分以及异常错误部分出现,因而在不同部分引发的异常错误也不一样。

     

     

    5.2.1 在执行部分引发异常错误

        当一个异常错误在执行部分引发时,有下列情况:

    l 如果当前块对该异常错误设置了处理,则执行它并成功完成该块的执行,然后控制转给包含块。

    l 如果没有对当前块异常错误设置定义处理器,则通过在包含块中引发它来传播异常错误。然后对该包含块执行步骤1)。

     

     

    5.2.2 在声明部分引发异常错误

        如果在声明部分引起异常情况,即在声明部分出现错误,那么该错误就能影响到其它的块。比如在有如下的PL/SQL程序:

     

    DECLARE
        name varchar2(12):='EricHu';
        其它语句
    BEGIN
        其它语句
    EXCEPTION
        WHEN OTHERS THEN 
        其它语句
    END;

     例子中,由于Abc number(3)=’abc’; 出错,尽管在EXCEPTION中说明了WHEN OTHERS THEN语句,但WHEN OTHERS THEN也不会被执行。 但是如果在该错误语句块的外部有一个异常错误,则该错误能被抓住,如:

    BEGIN
        DECLARE
        name varchar2(12):='EricHu';
        其它语句
       BEGIN
        其它语句
       EXCEPTION
        WHEN OTHERS THEN 
        其它语句
        END;
    EXCEPTION
    WHEN OTHERS THEN 
        其它语句
    END;

    5.3 异常错误处理编程

        在一般的应用处理中,建议程序人员要用异常处理,因为如果程序中不声明任何异常处理,则在程序运行出错时,程序就被终止,并且也不提示任何信息。下面是使用系统提供的异常来编程的例子。

     

    5.4  在 PL/SQL 中使用 SQLCODE, SQLERRM异常处理函数

        由于ORACLE 的错信息最大长度是512字节,为了得到完整的错误提示信息,我们可用 SQLERRM和 SUBSTR 函数一起得到错误提示信息,方便进行错误,特别是如果WHEN OTHERS异常处理器时更为方便。

     

    SQLCODE  返回遇到的Oracle错误号,

    SQLERRM  返回遇到的Oracle错误信息.

     

    如:  SQLCODE=-100   è SQLERRM=’no_data_found ‘

     SQLCODE=0      è SQLERRM=’normal, successfual completion’

     

    例6. 将ORACLE错误代码及其信息存入错误代码表

    CREATE TABLE errors (errnum NUMBER(4), errmsg VARCHAR2(100));
    
    DECLARE
       err_msg  VARCHAR2(100);
    BEGIN
       /*  得到所有 ORACLE 错误信息  */
       FOR err_num IN -100 .. 0 LOOP
          err_msg := SQLERRM(err_num);
          INSERT INTO errors VALUES(err_num, err_msg);
       END LOOP;
    END;
    DROP TABLE errors;

    例7. 查询ORACLE错误代码;

    BEGIN
       INSERT INTO employees(employee_id, first_name,last_name,hire_date,department_id)
       VALUES(2222, 'Eric','Hu', SYSDATE, 20);
       DBMS_OUTPUT.PUT_LINE('插入数据记录成功!');
       
       INSERT INTO employees(employee_id, first_name,last_name,hire_date,department_id)
       VALUES(2222, '胡','勇', SYSDATE, 20);
       DBMS_OUTPUT.PUT_LINE('插入数据记录成功!');
    EXCEPTION
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
    END;

    例8. 利用ORACLE错误代码,编写异常错误处理代码;

    DECLARE
       empno_remaining EXCEPTION;
       PRAGMA EXCEPTION_INIT(empno_remaining, -1);
       /* -1 是违反唯一约束条件的错误代码 */
    BEGIN
       INSERT INTO employees(employee_id, first_name,last_name,hire_date,department_id)
       VALUES(3333, 'Eric','Hu', SYSDATE, 20);
       DBMS_OUTPUT.PUT_LINE('插入数据记录成功!');
       
       INSERT INTO employees(employee_id, first_name,last_name,hire_date,department_id)
       VALUES(3333, '胡','勇',SYSDATE, 20);
       DBMS_OUTPUT.PUT_LINE('插入数据记录成功!');
    EXCEPTION
       WHEN empno_remaining THEN 
          DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');
       WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
    END;

    参考 https://www.cnblogs.com/soundcode/archive/2012/01/10/2318385.html

     

     

     

    展开全文
  • oracle触发器实例及异常处理

    千次阅读 2017-08-11 11:50:30
    1.写触发器的业务需求:  我需要在工单表(up_ask)插入数据或更新数据时通过触发器(currentnew_ask_trigger)将工单表的数据插入到一个中间表(nosc_reportnew)中 ... 通过在触发器中添加一个异常处理

    1.写触发器的业务需求:

        我需要在工单表(up_ask)插入数据或更新数据时通过触发器(currentnew_ask_trigger)将工单表的数据插入到一个中间表(nosc_reportnew)中

    2.出现的问题:

        如果工单表的数据超过了中间表字段数据长度就会报错,并且导致工单表也没有插入或更新成功,影响了业务处理。

    3.解决方法:

       通过在触发器中添加一个异常处理,即可将异常抛出。即便工单数据出现字段超长或其他异常,也不会影响业务处理,工单表也能照常插入更新数据。



    一、触发器添加异常处理前:

    CREATE OR REPLACE TRIGGER currentnew_ask_trigger
    AFTER  insert or update 
    ON up_ask
    FOR EACH ROW
       
    BEGIN
      IF updating and (:new.status='已关闭' and :old.status<>'已关闭' or :new.status='已作废') and :new.closedate is not null and (:new.complainttype like '融合通信%' or :new.complainttype like '自有业务%' or :new.complainttype like '基础通信%')  then
        INSERT INTO nosc_reportnew (id,issend,CRMID,ACCEPTTIME,COMPLAINTTYPE,USERCITY,USERPHONE,USERLEVEL,USERBRAND,COMPLAINTCONTENT,DUPLICATECOMPLAINT,COMPLAINTFLAG,PROBLEMPLACE,PROBLEMPLACEDETAIL,LONGITUDE,LATITUDE,EQUIPMENTTYPE,DEALDESC,COMPLAINTREASON,SOLVEFLAG,DEALUSER,REMARK,NETTYPE,ACCEPTCITY,GPRSVALUE,GPRSAVERAGE,STARLEVEL)
        VALUES(SEQ_NONC_CURRENTNEW.Nextval,'0',:NEW.sheetsn,:NEW.Createdate,:NEW.complainttype,:NEW.usercity,:NEW.acceptuserphone,:NEW.clientuserlevel,:NEW.clientuserbrand,:NEW.complaintcontent,:NEW.DUPLICATECOMPLAINT,'4',:NEW.problemhappenplace,:NEW.problemhappenplacedetail,'','',:NEW.EQUIPMENTTYPE,:NEW.DEALRESULT,:NEW.complaintreasoncode,:NEW.solveFlag,:NEW.FINISHDEALER,'',:NEW.nettype,:NEW.acceptcity,:NEW.OnlyElement20,:NEW.AVERAGE_USAGE_VOLUME,:NEW.starlevel);
      elsif inserting and (:new.status='已关闭' or :new.status='已作废') and :new.closedate is not null and (:new.complainttype like '融合通信%' or :new.complainttype like '自有业务%' or :new.complainttype like '基础通信%') then
        INSERT INTO nosc_reportnew (id,issend,CRMID,ACCEPTTIME,COMPLAINTTYPE,USERCITY,USERPHONE,USERLEVEL,USERBRAND,COMPLAINTCONTENT,DUPLICATECOMPLAINT,COMPLAINTFLAG,PROBLEMPLACE,PROBLEMPLACEDETAIL,LONGITUDE,LATITUDE,EQUIPMENTTYPE,DEALDESC,COMPLAINTREASON,SOLVEFLAG,DEALUSER,REMARK,NETTYPE,ACCEPTCITY,GPRSVALUE,GPRSAVERAGE,STARLEVEL)
        VALUES(SEQ_NONC_CURRENTNEW.Nextval,'0',:NEW.sheetsn,:NEW.Createdate,:NEW.complainttype,:NEW.usercity,:NEW.acceptuserphone,:NEW.clientuserlevel,:NEW.clientuserbrand,:NEW.complaintcontent,:NEW.DUPLICATECOMPLAINT,'4',:NEW.problemhappenplace,:NEW.problemhappenplacedetail,'','',:NEW.EQUIPMENTTYPE,:NEW.DEALRESULT,:NEW.complaintreasoncode,:NEW.solveFlag,:NEW.FINISHDEALER,'',:NEW.nettype,:NEW.acceptcity,:NEW.OnlyElement20,:NEW.AVERAGE_USAGE_VOLUME,:NEW.starlevel);
      end IF;
        
    end;

    二、触发器添加异常处理:

    CREATE OR REPLACE TRIGGER currentnew_ask_trigger
    AFTER  insert or update 
    ON up_ask
    FOR EACH ROW
       DECLARE  -----定义异常
        INSERT_EXCE exception;
    BEGIN
      IF updating and (:new.status='已关闭' and :old.status<>'已关闭' or :new.status='已作废') and :new.closedate is not null and (:new.complainttype like '融合通信%' or :new.complainttype like '自有业务%' or :new.complainttype like '基础通信%')  then
        INSERT INTO nosc_reportnew (id,issend,CRMID,ACCEPTTIME,COMPLAINTTYPE,USERCITY,USERPHONE,USERLEVEL,USERBRAND,COMPLAINTCONTENT,DUPLICATECOMPLAINT,COMPLAINTFLAG,PROBLEMPLACE,PROBLEMPLACEDETAIL,LONGITUDE,LATITUDE,EQUIPMENTTYPE,DEALDESC,COMPLAINTREASON,SOLVEFLAG,DEALUSER,REMARK,NETTYPE,ACCEPTCITY,GPRSVALUE,GPRSAVERAGE,STARLEVEL)
        VALUES(SEQ_NONC_CURRENTNEW.Nextval,'0',:NEW.sheetsn,:NEW.Createdate,:NEW.complainttype,:NEW.usercity,:NEW.acceptuserphone,:NEW.clientuserlevel,:NEW.clientuserbrand,:NEW.complaintcontent,:NEW.DUPLICATECOMPLAINT,'4',:NEW.problemhappenplace,:NEW.problemhappenplacedetail,'','',:NEW.EQUIPMENTTYPE,:NEW.DEALRESULT,:NEW.complaintreasoncode,:NEW.solveFlag,:NEW.FINISHDEALER,'',:NEW.nettype,:NEW.acceptcity,:NEW.OnlyElement20,:NEW.AVERAGE_USAGE_VOLUME,:NEW.starlevel);
      elsif inserting and (:new.status='已关闭' or :new.status='已作废') and :new.closedate is not null and (:new.complainttype like '融合通信%' or :new.complainttype like '自有业务%' or :new.complainttype like '基础通信%') then
        INSERT INTO nosc_reportnew (id,issend,CRMID,ACCEPTTIME,COMPLAINTTYPE,USERCITY,USERPHONE,USERLEVEL,USERBRAND,COMPLAINTCONTENT,DUPLICATECOMPLAINT,COMPLAINTFLAG,PROBLEMPLACE,PROBLEMPLACEDETAIL,LONGITUDE,LATITUDE,EQUIPMENTTYPE,DEALDESC,COMPLAINTREASON,SOLVEFLAG,DEALUSER,REMARK,NETTYPE,ACCEPTCITY,GPRSVALUE,GPRSAVERAGE,STARLEVEL)
        VALUES(SEQ_NONC_CURRENTNEW.Nextval,'0',:NEW.sheetsn,:NEW.Createdate,:NEW.complainttype,:NEW.usercity,:NEW.acceptuserphone,:NEW.clientuserlevel,:NEW.clientuserbrand,:NEW.complaintcontent,:NEW.DUPLICATECOMPLAINT,'4',:NEW.problemhappenplace,:NEW.problemhappenplacedetail,'','',:NEW.EQUIPMENTTYPE,:NEW.DEALRESULT,:NEW.complaintreasoncode,:NEW.solveFlag,:NEW.FINISHDEALER,'',:NEW.nettype,:NEW.acceptcity,:NEW.OnlyElement20,:NEW.AVERAGE_USAGE_VOLUME,:NEW.starlevel);
      end IF;
        exception when INSERT_EXCE then raise_application_error('-20002', '不能插入数据到中间表,请检查工单数据!');---抛出异常
    end;


    展开全文
  • ## 编写存储过程和触发器,实现对scott公司员工增 加奖金,10部门增加额为工资的20%,20部门增 加额为工资的15%,30部门增加额为工资的10%, 对于职位为MANAGER且工资高于2500的员工不 增加奖金 emp表结构如下 题目...
  • Oracle触发器抛出自定义异常

    万次阅读 2017-03-18 23:14:08
    现有学生表 ...给student编写一个触发器,当删除一个学生信息时将触发该触发器,判断该学生是否已经选课,如果该学生已经选课。将激发一个异常,把无法删除的信息返回给用户。 create or replace tr
  • oracle高级语法(事物、函数、存储过程、触发器异常)[参照].pdf
  • Xmanager 工具 : 可以远程的调用在本地显示一个图形化 tnsnames.ora vi $ORACLE_HOME/network/admin/tnsnames.ora 在 Linux 中如何图形化配置网络服务名 进入 oracle 用户 netmgr Oracle--> SID( 实例 )删除重装 ...
  • ---触发器  create or replace trigger person_tr before insert or update or delete on person  for each row  Declare   can_not_update_exception EXCEPTION;    begin  ...
  • MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行。在MySQL的目录版本中还无法直接抛出异常。这样我们如何实现呢?
  • oracle 异常触发器;异常处理;e_toomanystudents的作用域和本块的其他变量相同 预定义型异常情态 预定义型异常情态可以直接使用没有必要声明 Invalid_cursor:当执行非法的游标操作时会引发这个错误如试图关闭已关闭...
  • 触发器中忽略异常的方法 exception when NO_DATA_FOUND then begin insert into dept(deptno,dname)values(:new.deptno,:new.dname); end; 替换触发器 conn sys/admin as sysdba; grant create view to scott;...
  • /************************************** 004 PL/SQL 异常处理、触发器 *****************************************/ /** 异常处理 异常有俩种类型 预定义异常 - 当PL/SQL 程序违反Oracle规则或超越系统限制时隐式...
  • 通常情况下会遇到如下需求,当insert的时候,如果已经有记录,则中断操作,抛出相应错误。 mysql命令行创建trigger的时候要注意一下分号的使用,因为mysql解析器遇到分号会执行,所以我们需要用delimiter声明一个...
  • 如何Mysql触发器中抛出一个异常

    万次阅读 2015-04-12 11:17:44
    当想Mysql出发其中插入或者更新一条数据的时候,我希望使用触发器进行一些检查工作。虽然这些工作可以使用PHP来完成,但考虑到公司做PHP的小伙子是个新手,为了简化PHP端的业务,使用触发器来实现可靠性应该更强, ...
  • ‍这是我定义的一个处理book表的触发器: 当我进行这个操作时:insertintobookvalues('7040195836','计算机','tdd','中国',45.45,100); 可以发现: ‍ 原来触发器还是挺好用的。。 总结: 触发器常用...
  • 近期开发公司的平台项目,由于前期的数据库基础扎根比较深,很多功能操作都是在存储过程,触发器中进行控制。这些东西最恶心的地方就是返回的异常会出现超级大长串。需要在后台捕获异常进行判断,最终返回到前端。...
  • DROP TRIGGER IF EXISTS m; CREATE TRIGGER m AFTER DELETE ON test.m FOR EACH ROW ...IF old.scnt = 2 THEN -- old为伪记录占位符,scnt为字段名 SET msg = "sc中有记录无法删除"; SIGNAL SQLSTATE 'HY...
  • oracle异常触发器.ppt

    2020-11-21 08:58:59
    oracle异常触发器;异常处理;e_toomanystudents的作用域和本块的其他变量相同 预定义型异常情态 预定义型异常情态可以直接使用没有必要声明 Invalid_cursor:当执行非法的游标操作时会引发这个错误如试图关闭已关闭...
  • 触发器异常导致的druid问题

    千次阅读 2017-08-11 18:51:37
    触发器异常导致的druid问题
  • oracle异常触发器.ppt

    2020-03-17 14:27:01
    oracle 异常触发器;异常处理;e_toomanystudents的作用域和本块的其他变量相同 预定义型异常情态 预定义型异常情态可以直接使用没有必要声明 Invalid_cursor:当执行非法的游标操作时会引发这个错误如试图关闭已关闭...
  • 1-oracle培训整套教程(存储过程-函数-触发器异常处理,游标.存储包)
  • 1,游标的使用 1.1,游标的概念 1.2,处理显式游标 ...2,异常错误处理 2.1,异常处理概念 2.2,预定义的异常处理 2.3,非预定义的异常处理 2.4,用户自定义的异常处理 2.5,在 PL/SQL 中使用 SQLC...
  • 项目中存储过程运行时记录出错日志方法。 步骤一:创建一个序列,用于标识[存储过程,函数,触发器]执行先后顺序 CREATE SEQUENCE SEQ_PROGRAM_EXECUTE_LOG MINVALUE 1 MAXVALUE 1000000000000 START WITH 1 INCREMENT ...
  • oracle异常触发器.pptx
  • 11.触发器   删除触发器 DROP TRIGGER (触发器名称); alfet 修改之后 1.普通触发器(一般没用,没意义)例: create or replace trigger tri_aa before delete on teachers begin  raise_application_error(-...
  • 1、背景 环境:发布服务器A Windows2008+SQL2008,分发服务器B Windows2008+SQL2008,订阅...订阅服务器C上存在一张用户账户表,之前的机制是通过在用户信息表上的insert触发器往用户账户表初始化数据。问题:发...
  • 一:存储过程的定义  1>过程(多次编译 多次执行):  --过程实现计算器 ... create or replace procedure pro_arthirmByReturn(p1 ... 演示在触发器中自定义异常以及修改列的值  create table orders(  ...
  • oracle异常触发器;e_toomanystudents的作用域和本块的其他变量相同 预定义型异常情态 预定义型异常情态可以直接使用没有必要声明 Invalid_cursor:当执行非法的游标操作时会引发这个错误如试图关闭已关闭的游标 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,720
精华内容 15,888
关键字:

触发器如何记录异常