2014-05-17 2 views
-1

삭제 레코드를 작성하는 프로 시저를 원한다. 프로 시저 테이블 이름과 ID를 전달한다.오라클 프로 시저 예외 컴파일 오류

오류 (33,1) : PLS-00103 :

CREATE OR REPLACE PROCEDURE TRYNIMAS(
ID NUMBER, 
LENTELE VARCHAR2, 
KLAIDA OUT VARCHAR2 
) 
IS 
INUSE EXCEPTION; 
PRAGMA EXCEPTION_INIT (INUSE,-02292); 
BEGIN 
IF LENTELE = 'table1' THEN 
DELETE FROM KATEGORIJOS WHERE KAT_ID = ID; 

ELSE IF LENTELE = 'table2' THEN 
DELETE FROM KATEGORIJOS WHERE PRT_ID = ID; 

ELSE IF LENTELE = 'table3' THEN 
DELETE FROM KATEGORIJOS WHERE TK_ID = ID; 

ELSE IF LENTELE = 'table4' THEN 
DELETE FROM KATEGORIJOS WHERE PR_ID = ID; 

ELSE IF LENTELE = 'table5' THEN 
DELETE FROM KATEGORIJOS WHERE PIRK_ID = ID; 

ELSE IF LENTELE = 'table6' THEN 
DELETE FROM KATEGORIJOS WHERE TK_ID = ID; 

ELSE 
KLAIDA:= 'TABLE OR RECORD NOT EXIST'; 

END IF; 

EXCEPTION 
WHEN INUSE THEN KLAIDA:= 'Record is in usera and can not be deleted'; 
WHEN OTHERS THEN KLAIDA:= 'Error!'; 
END; 

내가 컴파일 오류가있어 다음 중 하나를 예상 할 때 심볼 "예외"가 발생했습니다 : (사건을 시작하기위한 최종 종료 선언 고토 루프 모드 널 프라그 인상 반환 선택 업데이트는 < < 가까운 현재 삭제 가져 잠금 삽입 개방 롤백 세이브 포인트 세트 FORALL 파이프 퍼지에게

오류 (36,4) 병합 커밋 SQL 실행 계속 함께하면서 경우 : PLS-00103를 :가 발생했습니다 기호 "끝 - of-file "중 하나를 예상 할 때 다음을 예상 할 수 있습니다. 끝내기 프라그 마 최종화 할 수있는 순서 재정의 정적 멤버 생성자 맵

답변

1

모든 ELSE IFELSIF으로 바꿉니다. 나는 오라클은 그것을 해석되어 표시하도록 절차를 포맷 한

이 경우 당신이 IF 문 다수의 내부했다 때 EXCEPTION을 가지고 있기 때문에 불평 것을 볼 수 있습니다에서

CREATE OR REPLACE PROCEDURE TRYNIMAS(
    ID NUMBER, 
    LENTELE VARCHAR2, 
    KLAIDA OUT VARCHAR2 
) 
IS 
    INUSE EXCEPTION; 
    PRAGMA EXCEPTION_INIT (INUSE,-02292); 
BEGIN 
    IF LENTELE = table1 THEN 
    DELETE FROM KATEGORIJOS WHERE KAT_ID = ID; 

    ELSE 
    IF LENTELE = table2 THEN 
     DELETE FROM KATEGORIJOS WHERE PRT_ID = ID; 

    ELSE 
     IF LENTELE = table3 THEN 
     DELETE FROM KATEGORIJOS WHERE TK_ID = ID; 

     ELSE 
     IF LENTELE = table4 THEN 
      DELETE FROM KATEGORIJOS WHERE PR_ID = ID; 

     ELSE 
      IF LENTELE = table5 THEN 
      DELETE FROM KATEGORIJOS WHERE PIRK_ID = ID; 

      ELSE 
      IF LENTELE = table6 THEN 
       DELETE FROM KATEGORIJOS WHERE TK_ID = ID; 

      ELSE 
       KLAIDA:= 'TABLE OR RECORD NOT EXIST'; 

      END IF; 

      EXCEPTION 
       WHEN INUSE THEN KLAIDA:= 'Record is in usera and can not be deleted'; 
       WHEN OTHERS THEN KLAIDA:= 'Error!'; 
      END; 

.

누락 된 부분을 모두 추가하여 절차를 수정할 수 있지만 ELSE IF 대신 ELSIF을 사용하는 것이 더 간단합니다.

+0

나는 동일한 오류 메시지가 나타납니다. – Wizard

+0

당신은 무엇을 시도 했습니까? 'ELSE IF'를'ELSIF'로 바꾸거나 빠진'END IF'를 추가 하시겠습니까? 나는'ELSE IF's를'ELSIF's로 바꾸었고 여러분의 절차는 나를 위해 컴파일되었습니다. –

2

은 내가 CASE 문으로 IF ... ELSIF ... ELSIF를 교체하는 것이 좋습니다 : 나는 무엇을 표 1, 표 2 등 아무 생각이 없기 때문에이 컴파일하는 경우

CREATE OR REPLACE PROCEDURE TRYNIMAS 
    (ID  IN NUMBER, 
    LENTELE IN VARCHAR2, 
    KLAIDA OUT VARCHAR2) 
IS 
    INUSE EXCEPTION; 
    PRAGMA EXCEPTION_INIT (INUSE,-02292); 
BEGIN 
    CASE LENTELE 
    WHEN table1 THEN 
     DELETE FROM KATEGORIJOS WHERE KAT_ID = ID; 
    WHEN table2 THEN 
     DELETE FROM KATEGORIJOS WHERE PRT_ID = ID; 
    WHEN table3 THEN 
     DELETE FROM KATEGORIJOS WHERE TK_ID = ID; 
    WHEN table4 THEN 
     DELETE FROM KATEGORIJOS WHERE PR_ID = ID; 
    WHEN table5 THEN 
     DELETE FROM KATEGORIJOS WHERE PIRK_ID = ID; 
    WHEN LENTELE = table6 THEN 
     DELETE FROM KATEGORIJOS WHERE TK_ID = ID; 
    ELSE 
     KLAIDA:= 'TABLE OR RECORD NOT EXIST'; 
    END CASE; 
EXCEPTION 
    WHEN INUSE THEN 
    KLAIDA:= 'Record is in usera and can not be deleted'; 
    WHEN OTHERS THEN 
    KLAIDA:= 'Error!'; 
END TRYNIMAS; 

나는 아직 모른다 그들은 문자열이거나 데이터베이스의 테이블입니까? (문자열이라면 컴파일 될 것입니다. 데이터베이스의 테이블이라면 뭔가 다른 것을해야 할 것입니다).

공유하고 즐기십시오. 당신은 선택의 구문이 작동하게되면

0

은 - 프로세스를 호출하여 처리되지 않는 커밋 경우 - 당신은 여전히 ​​

  1. 에 명시 적으로 확약을 추가해야합니다.

  2. 주소 WHEN OTHERS

OTHERS THEN KLAIDA의 부적절한 사용 : =! '오류';

예상되는 데이터 오류를 처리하는 데 사용해서는 안됩니다. 시스템 오류 및 예기치 않은 데이터 문제로 인해 프로그램이 실패해야합니다.

WHEN OTHERS 
THEN 
    ROLLBACK; 
    KLAIDA:= 'Error!'; 
    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK); 
    DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
    RAISE; 
END;