Oracle PL/SQL/PL SQL/SQLERRM

Материал из SQL эксперт
Перейти к: навигация, поиск

Error code and message

    
SQL>
SQL> CREATE TABLE myTable(col1 NUMBER);
Table created.
SQL>
SQL> DECLARE
  2      v_sqlcode NUMBER;
  3      v_sqlerrm VARCHAR2(100);
  4  BEGIN
  5      FOR i IN 1..10000 LOOP
  6        INSERT INTO myTable VALUES (i);
  7      END LOOP;
  8      commit;
  9
 10  EXCEPTION
 11      WHEN OTHERS THEN
 12        v_sqlcode := SQLCODE;
 13        v_sqlerrm := substr(SQLERRM,1,80);
 14        dbms_output.put_line(v_sqlcode || v_sqlerrm);
 15    END;
 16  /
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> drop table myTable;
Table dropped.



Error code: sql%bulk_exceptions(i).error_code

    
SQL> create table myTable (
  2   x number not null );
Table created.
SQL>
SQL> set serverout on
SQL> declare
  2   type numlist is table of number
  3   index by binary_integer;
  4   n numlist;
  5   begin
  6       for i in 1 .. 50 loop
  7           n(i) := i;
  8       end loop;
  9
 10       n(37) := null; -- will cause a problem
 11
 12       forall i in 1 .. 50 save exceptions
 13       insert into myTable values (n(i));
 14
 15       exception when others then
 16       dbms_output.put_line("Errors:"||sql%bulk_exceptions.count);
 17       for i in 1 .. sql%bulk_exceptions.count loop
 18           dbms_output.put_line("index:"||sql%bulk_exceptions(i).error_index);
 19           dbms_output.put_line("code:"||sql%bulk_exceptions(i).error_code);
 20           dbms_output.put_line("message:");
 21           dbms_output.put_line(sqlerrm(sql%bulk_exceptions(i).error_code));
 22       end loop;
 23   end;
 24  /
Errors:1
index:37
code:1400
message:
-1400: non-ORACLE exception
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> drop table myTable;
Table dropped.



Reference sql%bulk_exceptions(i).error_index

    
SQL> create table myTable (
  2   x number not null );
Table created.
SQL>
SQL> set serverout on
SQL> declare
  2   type numlist is table of number
  3   index by binary_integer;
  4   n numlist;
  5   begin
  6       for i in 1 .. 50 loop
  7           n(i) := i;
  8       end loop;
  9
 10       n(37) := null; -- will cause a problem
 11
 12       forall i in 1 .. 50 save exceptions
 13       insert into myTable values (n(i));
 14
 15       exception when others then
 16       dbms_output.put_line("Errors:"||sql%bulk_exceptions.count);
 17       for i in 1 .. sql%bulk_exceptions.count loop
 18           dbms_output.put_line("index:"||sql%bulk_exceptions(i).error_index);
 19           dbms_output.put_line("code:"||sql%bulk_exceptions(i).error_code);
 20           dbms_output.put_line("message:");
 21           dbms_output.put_line(sqlerrm(sql%bulk_exceptions(i).error_code));
 22       end loop;
 23   end;
 24  /
Errors:1
index:37
code:1400
message:
-1400: non-ORACLE exception
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> drop table myTable;
Table dropped.



SQLERRM function.

    
SQL>
SQL> set serveroutput on
SQL>
SQL> BEGIN
  2    DBMS_OUTPUT.PUT_LINE("SQLERRM(0): " || SQLERRM(0));
  3    DBMS_OUTPUT.PUT_LINE("SQLERRM(100): " || SQLERRM(100));
  4    DBMS_OUTPUT.PUT_LINE("SQLERRM(10): " || SQLERRM(10));
  5    DBMS_OUTPUT.PUT_LINE("SQLERRM: " || SQLERRM);
  6    DBMS_OUTPUT.PUT_LINE("SQLERRM(-1): " || SQLERRM(-1));
  7    DBMS_OUTPUT.PUT_LINE("SQLERRM(-54): " || SQLERRM(-54));
  8  END;
  9  /
SQLERRM(0): ORA-0000: normal, successful completion
SQLERRM(100): ORA-01403: no data found
SQLERRM(10):  -10: non-ORACLE exception
SQLERRM: ORA-0000: normal, successful completion
SQLERRM(-1): ORA-00001: unique constraint (.) violated
SQLERRM(-54): ORA-00054: resource busy and acquire with NOWAIT specified
PL/SQL procedure successfully completed.
SQL>
SQL>



SQLERRM function returns the error message associated with the most recently raised error exception

   

SQL> -- SQLERRM function returns the error message associated with the most recently raised error exception
SQL>
SQL>
SQL> -- create demo table
SQL> create table Employee(
  2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
  3    First_Name         VARCHAR2(10 BYTE),
  4    Last_Name          VARCHAR2(10 BYTE),
  5    Start_Date         DATE,
  6    End_Date           DATE,
  7    Salary             Number(8,2),
  8    City               VARCHAR2(10 BYTE),
  9    Description        VARCHAR2(15 BYTE)
 10  )
 11  /
Table created.
SQL>
SQL> -- prepare data
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 6661.78, "Vancouver","Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 6544.78, "Vancouver","Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2344.78, "Vancouver","Manager")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 4322.78,"New York",  "Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 7897.78,"New York",  "Manager")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 1232.78,"Vancouver", "Tester")
  3  /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
  2  /
ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86    6661.78 Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90    6544.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2344.78 Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96    4322.78 New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98    7897.78 New York   Manager
08   James      Cat        17-SEP-96 15-APR-02    1232.78 Vancouver  Tester
8 rows selected.
SQL>
SQL>     CREATE OR REPLACE PROCEDURE add_new_employee
  2          (employee_id_in IN NUMBER, salary_in IN NUMBER)
  3      IS
  4          no_salary EXCEPTION;
  5
  6      BEGIN
  7          IF salary_in = 0 THEN
  8              RAISE no_salary;
  9          ELSE
 10              INSERT INTO employee (id, salary ) VALUES ( employee_id_in, salary_in );
 11      END IF;
 12
 13      EXCEPTION
 14           WHEN no_salary THEN
 15              raise_application_error (-20001,"You must have salary in order to insert the employee.");
 16
 17           WHEN OTHERS THEN
 18              --raise_application_error (-20002,"An error has occurred inserting an employee.");
 19              raise_application_error(-20001,"An error was encountered - "||SQLCODE||" -ERROR- "||SQLERRM);
 20      END;
 21      /
Procedure created.
SQL>
SQL> exec add_new_employee("99",0);
BEGIN add_new_employee("99",0); END;
*
ERROR at line 1:
ORA-20001: You must have salary in order to insert the employee.
ORA-06512: at "sqle.ADD_NEW_EMPLOYEE", line 15
ORA-06512: at line 1

SQL>
SQL> -- clean the table
SQL> drop table Employee
  2  /
Table dropped.
SQL>
SQL>



SQLERRM has the error message

    
SQL> create table myTable(acolumn number);
Table created.
SQL> set serveroutput on
SQL>
SQL> DECLARE
  2      v_sqlcode NUMBER;
  3      v_sqlerrm VARCHAR2(100);
  4  BEGIN
  5      FOR i IN 1..10000 LOOP
  6        INSERT INTO myTable VALUES (i);
  7      END LOOP;
  8      commit;
  9  EXCEPTION
 10      WHEN OTHERS THEN
 11        v_sqlcode := SQLCODE;
 12
 13        v_sqlerrm := substr(SQLERRM,1,80);
 14        dbms_output.put_line(v_sqlcode || v_sqlerrm);
 15    END;
 16  /
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> drop table myTable;
Table dropped.
SQL>



sqlerrm(sql%bulk_exceptions(i).error_code)

    
SQL> create table myTable (
  2   x number not null );
Table created.
SQL>
SQL> set serverout on
SQL> declare
  2   type numlist is table of number
  3   index by binary_integer;
  4   n numlist;
  5   begin
  6       for i in 1 .. 50 loop
  7           n(i) := i;
  8       end loop;
  9
 10       n(37) := null; -- will cause a problem
 11
 12       forall i in 1 .. 50 save exceptions
 13       insert into myTable values (n(i));
 14
 15       exception when others then
 16       dbms_output.put_line("Errors:"||sql%bulk_exceptions.count);
 17       for i in 1 .. sql%bulk_exceptions.count loop
 18           dbms_output.put_line("index:"||sql%bulk_exceptions(i).error_index);
 19           dbms_output.put_line("code:"||sql%bulk_exceptions(i).error_code);
 20           dbms_output.put_line("message:");
 21           dbms_output.put_line(sqlerrm(sql%bulk_exceptions(i).error_code));
 22       end loop;
 23   end;
 24  /
Errors:1
index:37
code:1400
message:
-1400: non-ORACLE exception
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> drop table myTable;
Table dropped.



Trim the error message and then output

    
SQL>
SQL> CREATE TABLE myTable
  2  (col1 NUMBER,
  3   col2 NUMBER,
  4   col3 NUMBER);
Table created.
SQL>
SQL> DECLARE
  2      v_sqlcode NUMBER;
  3      v_sqlerrm VARCHAR2(100);
  4  BEGIN
  5      FOR i IN 1..1000 LOOP
  6        INSERT INTO myTable VALUES (i,i*10,i*100);
  7      END LOOP;
  8      commit;
  9  EXCEPTION
 10      WHEN OTHERS THEN
 11        v_sqlcode := SQLCODE;
 12        v_sqlerrm := substr(SQLERRM,1,80);
 13        dbms_output.put_line(v_sqlcode || v_sqlerrm);
 14    END;
 15  /
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> drop table myTable;
Table dropped.