PL SQL 이상 처리

13329 단어 OaclesqlAccess
이상 이름                           ORACLE 오류        설명 하 다.                     
CURSOR_ALREADY_OPEN                ORA-6511          열 린 커서 를 열 려 고 합 니 다. 
DUP_VAL_ON_INDEX                   ORA-0001          유일한 제한 을 파괴 하려 고 시도 하 다.   
INVALID_CURSOR                     ORA-1001          잘못된 커서 사용 하기   
INVALID_NUMBER                     ORA-1722          비 숫자 값 에 대해 숫자 조작 을 시도 하 다
LOGIN_DENIED                       ORA-1017          잘못된 사용자 이름 이나 암호     
NO_DATA_FOUND                      ORA-1403          검색 에서 데 이 터 를 찾 을 수 없 음           
NOT_LOGGED_ON                      ORA-1012          연결 되 기도 전에 데이터베이스 작업 을 시도 합 니 다. 
PROGRAM_ERROR                      ORA-6501          내부 오류                 
ROWTYPE_MISMATCH                   ORA-6504          주 변수 와 커서 의 형식 이 호 환 되 지 않 습 니 다. 
STORAGE_ERROR                      ORA-6500          내부 오류                 
TIMEOUT_ON_RESOURCE                ORA-0051          시간 초과 가 발생 하 다                 
TOO_MANY_ROWS                      ORA-1422          SELECT INTD 명령 이 되 돌아 오 는 여러 줄
TRANSACTION_BACKED_OUT             ORA-006           자물쇠 제출 로 반송 되다       
VALUE_ERROR                        ORA-6502          변환 또는 편집 오류         
ZERO_DIVIDE                        ORA-1476          제로 가 되 려 고 시도 하 다               
                                     
Oracle 이상 요약
Oracle 이상 처리 이상 처 리 는 응용 프로그램의 건장 성 을 시험 하 는 가장 좋 은 방법 으로 개발 자 는 프로그램 에서 발생 할 수 있 는 각종 오 류 를 고려 하고 해당 하 는 처 리 를 해 야 한다.
Oracle 에서 이상 은 미리 정 의 된 이상, 미리 정 의 된 이상 과 사용자 정의 이상 세 가지 로 나 뉜 다.
미리 정 의 된 이상 미리 정 의 된 이상 은 PL / SQL 에서 제공 하 는 시스템 이상 을 말 합 니 다.PL / SQL 응용 프로그램 이 Oracle 규칙 을 위반 하거나 다른 시스템 제한 이 발생 할 경우 내부 이상 이 은근히 발생 합 니 다.
다음은 PL / SQL 이 미리 정의 한 이상 (자주 업데이트 중) 입 니 다.
1 CURSOR_ALREADY_OPEN 이 이상 이 ORA - 06511 오 류 를 촉발 합 니 다.
프로그램 에 있 는 커서 가 열 려 있 는 동작 을 실 행 했 을 때 개발 자가 열 려 있 는 커서 를 다시 열 려 고 할 때 이 이상 이 발생 합 니 다.
예시:
DECLARE
CURSOR test_cursor IS
SELECT SYSDATE FROM dual;
BEGIN
OPEN test_cursor;
FOR test_cursor2 IN test_cursor LOOP
dbms_output.put_line(test_cursor2.SYSDATE);
END LOOP;
EXCEPTION
WHEN cursor_already_open THEN
dbms_output.put_line('      ,             。');
END;
/

2 INCALID_CURSOR 이 이상 이 ORA - 01001 오 류 를 촉발 합 니 다.
불법 커서 를 열 어 할당 작업 을 수행 하거나 열 리 지 않 은 커서 를 닫 으 려 고 할 때 이 이상 이 발생 합 니 다.
예시:
DECLARE
CURSOR test_cursor IS
SELECT SYSDATE FROM dual;
test_time DATE;
BEGIN
--OPEN test_cursor;
FETCH test_cursor
INTO test_time;
dbms_output.put_line('     : ' || test_time);
CLOSE test_cursor;
EXCEPTION
WHEN invalid_cursor THEN
dbms_output.put_line('           .');
END;
/

3 NO_DA TA_FOUND 이 이상 이 ORA - 01403 오 류 를 촉발 합 니 다.
커서 를 읽 고 할당 작업 (SELECT INTO 작업) 을 할 때 줄 을 되 돌려 주지 않 으 면 이 이상 이 발생 합 니 다.
예시:
DECLARE
test_owner DATE;
BEGIN
SELECT t.owner INTO test_owner FROM all_tables t WHERE t.table_name = 'test';
dbms_output.put_line(test_owner);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('No value.');
END;
/

4 TOO_MANY_ROWS 이 이상 이 ORA - 01422 오 류 를 촉발 합 니 다.
위 에 기록 을 되 돌려 주지 않 았 습 니 다. 여 기 는 대조 기록 을 되 돌려 줄 때 이 이상 을 촉발 합 니 다.
예시:
DECLARE
test_records dba_tables%ROWTYPE;
BEGIN
select * INTO test_records from dba_tables where owner='APPS' AND ROWNUM < 3;
dbms_output.put_line(test_records.table_name);
EXCEPTION
WHEN too_many_rows THEN
dbms_output.put_line('Too many values.');
END;
/

5 VALUE_ERROR 이 이상 이 ORA - 06502 오 류 를 촉발 합 니 다.
PL / SQL 프로그램 에서 할당 작업 을 수행 할 때 오른쪽 값 의 길이 가 왼쪽 변수의 길이 보다 크 면 이 이상 을 촉발 합 니 다.
예시:
DECLARE
v_test VARCHAR2(1);
BEGIN
SELECT 'WHAT' INTO v_test FROM dual;
dbms_output.put_line(v_test);
EXCEPTION
WHEN value_error THEN
dbms_output.put_line('       .');
END;
/

6 DUP_VAL_ON_INDEX 이 이상 이 ORA - 00001 오 류 를 촉발 합 니 다.
표 의 모든 열 이 주 키 로 표시 되 거나 유일 성 이 있 으 면 이 열 에 중복 되 는 값 을 삽입 할 때 이 이상 이 발생 합 니 다.
예시:
CREATE TABLE test_table
(
v_id NUMBER PRIMARY KEY,
v_name VARCHAR2(20)
)
INSERT INTO test_table VALUES(1,'test1');
INSERT INTO test_table VALUES(2,'test2');
SELECT * FROM test_table;
BEGIN
UPDATE test_table SET v_name = new_name WHERE v_id = &input_id;
EXCEPTION
WHEN dup_val_on_index THEN
dbms_output.put_line(' deptno         .');
END;
/

7 CASE_NOT_FOUND 이 이상 이 ORA - 06592 오 류 를 촉발 합 니 다.
CASE 구문 에 서 는 CASE 구문 의 조건 이 WHEN 자구 에서 해당 하 는 조건 의 가 지 를 찾 지 못 하고, 이 CASE 구문 에 ELSE 분기 가 포함 되 어 있 지 않 으 면 이 이상 을 촉발 합 니 다.
예시:
DECLARE
v_test NUMBER;
BEGIN
SELECT val INTO v_test FROM dual;
CASE
WHEN v_test = 1 THEN
dbms_output.put_line(v_test);
WHEN v_test = 2 THEN
dbms_output.put_line(v_test);
WHEN v_test = 3 THEN
dbms_output.put_line(v_test);
--ELSE
-- dbms_output.put_line(v_test);
END CASE;
EXCEPTION
WHEN case_not_found THEN
dbms_output.put_line(' CASE      ' || v_test || '     .');
END;
/

8 ZERO_DIVIDE 이 이상 이 ORA - 01476 오 류 를 촉발 합 니 다.
프로그램 에서 0 을 나눗셈 으로 연산 할 때 이 이상 이 발생 합 니 다.
예시:
DECLARE
v_test1 NUMBER := 100;
v_test2 NUMBER := 0;
v_test3 NUMBER := 0;
BEGIN
v_test3 := v_test1 / v_test2;
dbms_output.put_line(v_test3);
EXCEPTION
WHEN zero_divide THEN
dbms_output.put_line('0      .');
END;
/

9 INVALID_NUMBER 이 이상 이 ORA - 01722 오 류 를 촉발 합 니 다.
숫자 나 값 오류, 문자 에서 수치 로 의 변환 오류.
예시:
BEGIN
UPDATE emp SET sal = sal + '1oo'; -- 1oo
EXCEPTION
WHEN invalid_number THEN
dbms_output.put_line('        .');
END;
/
DECLARE
v_test NUMBER;
v_test2 NUMBER;
BEGIN
v_test := '100';
v_test2 := '1a';
dbms_output.put_line(v_test);
EXCEPTION
WHEN INVALID_NUMBER THEN
DBMS_OUTPUT.PUT_LINE('        .');
END;
/

10 ACCESS_INTO_NULL 이 이상 이 ORA - 06530 오 류 를 촉발 합 니 다.
프로그램의 대상 이 대상 초기 화 작업 을 먼저 하지 않 았 을 때 대상 의 속성 값 을 직접 부여 하면 이 이상 이 발생 합 니 다.
예시:
DECLARE
v_test test_type;
BEGIN
v_test.v_name := 'test';
EXCEPTION
WHEN access_into_null THEN
dbms_output.put_line('       v_test');
END;
/

11. COLLECTION IS NULL 이 이상 하 게 ORA - 06531 오 류 를 촉발 합 니 다.
집합 요소 에 값 을 부여 하기 전에 이 집합 요 소 를 초기 화해 야 합 니 다. 그렇지 않 으 면 이 이상 이 발생 합 니 다.
예시:
DECLARE
TYPE emp_ssn_array IS TABLE OF NUMBER/* INDEX BY BINARY_INTEGER*/;
best_employees emp_ssn_array;
BEGIN
best_employees(0) := '123456';
dbms_output.put_line('best_employees(0): ' || best_employees(0));
EXCEPTION
WHEN collection_is_null THEN
dbms_output.put_line('         .');
END;
/

12 SUBSCRIPT_BEYOND_COUNT 이 이상 이 ORA - 06533 오 류 를 촉발 합 니 다.
복합 데이터 형식 을 사용 할 때 아래 표 시 를 넘 으 면 이 이상 이 발생 합 니 다.
예시:
DECLARE
TYPE test_array IS VARRAY(20) OF NUMBER;
v_test test_array;
BEGIN
v_test := test_array(123456);
dbms_output.put_line('v_test(1): ' || v_test(2));
EXCEPTION
WHEN subscript_beyond_count THEN
dbms_output.put_line('    .');
END;
/

13 SUBSCRIPT_OUTSIDE_LIMIT 는 이 이상 이 ORA - 06532 오 류 를 촉발 하고 복합 데이터 형식 을 사용 할 때 마이너스 로 표 시 될 때 이 이상 을 촉발 합 니 다.
예시:
DECLARE
TYPE test_array IS VARRAY(20) OF NUMBER;
v_test test_array;
BEGIN
v_test := test_array(123456);
dbms_output.put_line('v_test(-1): ' || v_test(-1));
EXCEPTION
WHEN subscript_outside_limit THEN
dbms_output.put_line('       .');
END;
/

14 LONIN_DENIED 이 이상 촉발 ORA01017 오류.
PL / SQL 이 데이터 베 이 스 를 연결 할 때 암호 가 잘못 되면 이 이상 이 발생 합 니 다.
15 NOT_LOGGED_ON 이 이상 이 ORA - 01012 오 류 를 촉발 합 니 다.
PL / SQL 이 데이터 베 이 스 를 연결 하지 않 으 면 프로그램 실행 에 이상 이 발생 합 니 다.
16 PROGRAM_ERROR 이 이상 이 ORA - 06501 오 류 를 촉발 합 니 다.
이 이상 이 발생 하면 PL / SQL 의 내부 문 제 를 나타 낸다.사용 자 는 데이터 사전 과 PL / SQL 시스템 패 키 지 를 다시 설치 해 야 할 수도 있 습 니 다.
17. ROWTYPE MISMATCH 이 이상 은 ORA - 06504 오 류 를 촉발 합 니 다.
값 을 할당 할 때 숙주 커서 변수 와 PL / SQL 커서 변수의 반환 형식 이 호 환 되 지 않 으 면 이 이상 이 발생 합 니 다.
18 SELF_IF_NULL 이 이상 이 ORA - 30625 오 류 를 촉발 합 니 다.
대상 형식 을 사용 할 때 NULL 예제 에서 구성원 을 호출 하 는 방법 이 이 이상 을 촉발 합 니 다.
19 STORAGE_ERROR 이 이상 이 ORA - 06500 오 류 를 촉발 합 니 다.
PL / SQL 블록 이 실 행 될 때 내 적 공간 을 벗 어 나 거나 내 적 으로 손상 되면 이 이상 이 발생 합 니 다.
20 SYS_INVALID_ROWID 이 이상 이 ORA - 01410 오 류 를 촉발 합 니 다.
문자열 을 ROWID 로 변환 할 때 잘못된 문자열 을 사용 하면 이 이상 이 발생 합 니 다.
21 TIMEOUT_ON_RESOURCE 이 이상 이 ORA - 00051 오 류 를 촉발 합 니 다.
Oracle 은 자원 을 기다 리 는 중 시간 초과 오류 가 발생 하면 이 이상 을 촉발 합 니 다.
22 ORA - 04021 Oracle 은 자원 을 기다 리 는 중 시간 초과 오류 가 발생 했 습 니 다. 이 자원 은 다른 session 에 의 해 잠 겨 있 을 수 있 습 니 다. 이 때 이 이상 을 촉발 합 니 다.
23 ORA - 01791 은 Selected 표현 식 SELECT DISTINCT goodid 가 아 닙 니 다.
barcode,
depotid,
goodsname
FROM sa_sale
WHERE depotid = '11'
ORDER BY selldate

이 말 은 실 행 될 때 오류 가 있 지만 정렬 을 order by 로 바 꿉 니 다.  Goodsid 나 다른 바코드, DepotId, GoodsName 에 오류 가 없 었 습 니 다. 이것 은 selldate 가 검색 결과 필드 에 없 었 고 이 문 구 는 distinct 문 구 였 기 때 문 입 니 다.그래서 이 오류 가 발생 할 수 있 습 니 다.
다음은 정확 한 해결 방법 을 제시 합 니 다.
SELECT goodsid,
barcode,
depotid,
goodsname
FROM (SELECT DISTINCT goodsid,
barcode,
depotid,
goodsname,
selldate
FROM sa_sale
WHERE depotid = '11')
ORDER BY selldate

24 ORA - 01002: fetch out of sequence 커서 에서 데이터 세트 를 다 가 져 온 다음 에 다시 FETCH 작업 을 할 때 이 이상 을 촉발 합 니 다.
25 PLS - 00382: expression is of wrong type 표현 식 형식 이 잘못 되 었 습 니 다.코드 에 부 여 된 작업 의 좌우 양쪽 유형 이 다르다 는 것 이다.
2. 미리 정 의 된 것 이 아 닌 이상 을 사용 하 는 절 차 는 다음 과 같다.
이상 정의 - > 관련 이상 과 오류 - > 참조 예외
Oracle 오류 와 예외 간 의 연관 관 계 를 정의 할 때 의사 과정 EXCEPTION 사용INTI。
다음은 ORA - 02291 오 류 를 처리 하 는 것 을 예 로 들 어 설명 한다.
DECLARE
e_integrity EXCEPTION;
PRAGMA EXCEPTION_INIT(e_integrity, -2291);
BEGIN
UPDATE emp SET deptno = dno WHERE empno = &eno;
EXCEPTION
WHEN e_integrity THEN
dbms_output.put_line('      .');
END;
/

3. 사용자 정의 이상 은 미리 정 의 된 이상 과 미리 정 의 된 이상 을 사용 합 니 다. 프로그램 은 Oracle 오 류 를 포착 하고 Oracle 오류 가 발생 했 을 때 자동 으로 해당 하 는 이상 을 촉발 할 수 있 습 니 다.그러나 실제 응용 프로그램 에 서 는 다른 오류 가 발생 할 수 있 습 니 다. 이 때 는 특정 상황 에 이상 을 사용자 정의 할 수 있 지만 이 이상 을 표시 해 야 합 니 다. 이상 을 정의 한 다음 에 이상 과 오 류 를 연결 하여 이상 을 표시 하고 마지막 으로 EXCEPTION 에서 이 이상 을 처리 해 야 합 니 다.
예시:
DECLARE
l_error_message VARCHAR2(200);
e_user_exception EXCEPTION;
BEGIN
** ** ** ** **;
IF '    ' THEN
l_error_message := '      ';
RAISE e_user_exception;
END IF;
EXCEPTION
WHEN e_user_exception THEN
raise_application_error(-20001, l_error_message);
END;
/

4 예외 함수 1 SQLCODE, SQLERRM 이 PL / SQL 블록 에서 Oracle 오류 가 발생 했 을 때 예외 함 수 를 사용 하면 오류 번호 와 관련 된 오류 메 시 지 를 얻 을 수 있 습 니 다.
SQLCODE 는 Oracle 오류 번 호 를 되 돌려 줍 니 다.
SQLERRM 은 오류 번호 에 대응 하 는 오류 메 시 지 를 되 돌려 줍 니 다.
예시:
DECLARE
v_ename emp.ename%TYPE;
BEGIN
SELECT ename INTO v_ename FROM emp WHERE sal = &v_sal;
dbms_output.put_line('   :' || v_ename);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('      ' || v_sal || '  ');
WHEN OTHERS THEN
dbms_output.put_line('   ' || SQLCODE);
dbms_output.put_line(SQLERRM);
END;
/

2 RAISE_APPLICATION_ERROR 는 저장 과정, 함수 와 가방 에 RAISE 를 사용 합 니 다.APPLICATION_ERROR 는 오류 번호 와 메 시 지 를 사용자 정의 할 수 있 습 니 다.
raise_application_error: 오류 메 시 지 를 사용자 정의 하 는 데 사용 합 니 다 (프로그램 세그먼트 에 사용)
문법:
raise_application_error(error_number,message[,{TRUE | FALSE}]);
error_number: 오류 번호, 범 위 는: - 2000 ~ - 20999 사이 의 마이너스 정수 입 니 다.
message: 오류 메시지, 길이 2048 바이트 초과 할 수 없습니다.
세 번 째 신뢰 할 수 있 는 매개 변 수 는 TRUE 라면 이 오 류 는 이전 오류 스 택 에 놓 여 있 습 니 다.FALSE (기본 값) 가 있 으 면 이전의 모든 오 류 를 바 꿉 니 다.
예시:
CREATE OR REPLACE PROCEDURE raise_comm
(
eno NUMBER,
commission NUMBER
) IS
v_comm emp.comm%TYPE;
BEGIN
SELECT comm INTO v_comm FROM emp WHERE emp = eno;
IF v_comm IS NULL THEN
raise_application_error(-20001, '      .');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('      .');
END;
/ 

좋은 웹페이지 즐겨찾기