Столкнулся с символом «ИСКЛЮЧЕНИЕ» при ожидании одного из следующих: ,

#oracle #plsql #plsql-package

#Oracle #plsql #plsql-пакет

Вопрос:

1. Это пакет для ввода от пользователя нескольких сведений и сохранения их в БД, но здесь я получаю несколько ошибок при создании проверки (часть исключения)

 create or replace PACKAGE  MOVIE_PKG
AS
PROCEDURE ADDCONSUMERDETAILS(c_con_ID consumer_info.con_id%type,c_con_name consumer_info.con_name%type,
c_con_email consumer_info.con_email%type,c_con_co consumer_info.con_co%type,c_con_ct consumer_info.con_ct%type);
END MOVIE_PKG;

create or replace PACKAGE BODY MOVIE_PKG
AS
--ADD/INSERT CONSUMER INFORMATION--take input for cust id 
PROCEDURE ADDCONSUMERDETAILS(c_con_id consumer_info.con_id%type,c_con_name consumer_info.con_name%type,
c_con_email consumer_info.con_email%type,c_con_co consumer_info.con_co%type,c_con_ct consumer_info.con_ct%type)
AS
EXC_CON_ID EXCEPTION;
EXC_CON_NAME EXCEPTION;
EXC_CON_CO EXCEPTION;
BEGIN
--CONSUMER ID VALIDATION
IF LENGTH(EXC_CON_ID)=0 THEN
RAISE EXC_CON_ID;
ELSE IF LENGTH(EXC_CON_ID)<4 THEN
RAISE EXC_CON_NAME;
ELSE IF LENGTH(EXC_CON_CO)!=10 THEN
RAISE EXC_CON_CO;
ELSE
INSERT INTO CONSUMER_INFO VALUES(C_CON_ID,C_CON_NAME,C_CON_EMAIL,C_CON_CO,C_CON_CT);
  DBMS_OUTPUT.PUT_LINE('Data Added Successfully');
END IF;

EXCEPTION
WHEN EXC_CON_ID THEN
   DBMS_OUTPUT.PUT_LINE('INVALID CONSUMER ID, CHECK CONSUMER ID:ENTER CORRECT ID');
WHEN EXC_CON_NAME THEN
   DBMS_OUTPUT.PUT_LINE('INVALID CONSUMER NAME, ENTER CORRECT CONSUMER NAME');
WHEN EXC_CON_CO THEN
   DBMS_OUTPUT.PUT_LINE('INVALID CONSUMER NUMBER');
END ADDCONSUMERDETAILS;

END MOVIE_PKG;
  

—Триггер для предупреждения о вставке в таблицу потребителя

 create or replace TRIGGER consumer_insert_chk
AFTER
INSERT
ON CONSUMER_INFO
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('A ROW IS INSERTED TO CONSUMER TABLE');
--End of trigger
END consumer_insert_chk;
  

—БЛОК НА СТОРОНЕ КЛИЕНТА

 SET SERVEROUTPUT ON;
DECLARE
  C_CON_ID consumer_info.con_id%type:='amp;IDENTIFICATIONNUMBER';
  C_CON_NAME  CONSUMER_INFO.CON_NAME%TYPE:='amp;NAME';
  C_CON_EMAIL CONSUMER_INFO.CON_EMAIL%TYPE:='amp;EMAIL';
  C_CON_CO CONSUMER_INFO.CON_CO%TYPE:=amp;CONTACTNO;
  C_CON_CT CONSUMER_INFO.CON_CT%TYPE:='amp;CITY';
BEGIN
MOVIE_PKG.ADDCONSUMERDETAILS(C_CON_ID,c_con_name,c_con_email,c_con_co,c_con_ct);
END;
/
  
  1. Это ошибка, которую я получаю

    ОШИБКА СТРОКИ / СТОЛБЦА


    23/1 PLS-00103: Столкнулся с символом «EXCEPTION» при ожидании одного из следующих событий: ( begin case объявить end exit для goto if loop mod null pragma raise return выбрать обновление, а с помощью << continue закрыть текущее удалить выборку заблокировать вставить открыть точку сохранения отката установить SQL выполнить фиксацию для всех очистка канала слияния 32/5 PLS-00103: Обнаружен символ «MOVIE_PKG» при ожидании одного из следующих событий: Ошибки: проверьте журнал компилятора

Ответ №1:

Перед ключевым словом не хватает двух END IF s EXCEPTION .

 BEGIN
   --CONSUMER ID VALIDATION
   IF LENGTH (EXC_CON_ID) = 0
   THEN
      RAISE EXC_CON_ID;
   ELSE
      IF LENGTH (EXC_CON_ID) < 4
      THEN
         RAISE EXC_CON_NAME;
      ELSE
         IF LENGTH (EXC_CON_CO) != 10
         THEN
            RAISE EXC_CON_CO;
         ELSE
            INSERT INTO CONSUMER_INFO
                 VALUES (C_CON_ID,
                         C_CON_NAME,
                         C_CON_EMAIL,
                         C_CON_CO,
                         C_CON_CT);

            DBMS_OUTPUT.PUT_LINE ('Data Added Successfully');
         END IF;
      END IF;              --> this
   END IF;                 --> this
EXCEPTION
   WHEN EXC_CON_ID
   THEN
      DBMS_OUTPUT.PUT_LINE (
         'INVALID CONSUMER ID, CHECK CONSUMER ID:ENTER CORRECT ID');
   WHEN EXC_CON_NAME
   THEN
      DBMS_OUTPUT.PUT_LINE (
         'INVALID CONSUMER NAME, ENTER CORRECT CONSUMER NAME');
   WHEN EXC_CON_CO
   THEN
      DBMS_OUTPUT.PUT_LINE ('INVALID CONSUMER NUMBER');
END ADDCONSUMERDETAILS;
  

Хотите верьте, хотите нет, но это действительно очень помогает, если вы обращаете внимание на форматирование. Отступ творит чудеса и позволяет легко определить виновника. Неформатированный код — это беспорядок… неудивительно, что у вас проблемы. Я предлагаю вам либо использовать форматировщик GUI, либо — если вы используете SQL * Plus — отформатировать его вручную.

Ответ №2:

Правильный синтаксис для ELSE IF инструкции ELSIF (ссылка) . Также я не понимаю, почему вы всегда проверяете длину исключения.

 create or replace PACKAGE  MOVIE_PKG
AS
PROCEDURE ADDCONSUMERDETAILS(c_con_ID consumer_info.con_id%type,
                             c_con_name consumer_info.con_name%type,
                             c_con_email consumer_info.con_email%type,
                             c_con_co consumer_info.con_co%type,
                             c_con_ct consumer_info.con_ct%type
                            );
END MOVIE_PKG;
/

create or replace PACKAGE BODY MOVIE_PKG
AS
--ADD/INSERT CONSUMER INFORMATION--take input for cust id 

PROCEDURE ADDCONSUMERDETAILS(c_con_ID consumer_info.con_id%type,
                             c_con_name consumer_info.con_name%type,
                             c_con_email consumer_info.con_email%type,
                             c_con_co consumer_info.con_co%type,
                             c_con_ct consumer_info.con_ct%type
                            );
AS
  EXC_CON_ID EXCEPTION;
  EXC_CON_NAME EXCEPTION;
  EXC_CON_CO EXCEPTION;
BEGIN
  --CONSUMER ID VALIDATION
  IF LENGTH(C_CON_ID) = 0 THEN
    RAISE EXC_CON_ID;

  ELSIF LENGTH(C_CON_NAME) < 4 THEN
    RAISE EXC_CON_NAME;

  ELSIF LENGTH(C_CON_CO) != 10 THEN
    RAISE EXC_CON_CO;

  ELSE
    INSERT INTO CONSUMER_INFO 
           VALUES(C_CON_ID,
                  C_CON_NAME,
                  C_CON_EMAIL,
                  C_CON_CO,
                  C_CON_CT);
    DBMS_OUTPUT.PUT_LINE('Data Added Successfully');
  END IF;

EXCEPTION
  WHEN EXC_CON_ID THEN
    DBMS_OUTPUT.PUT_LINE('INVALID CONSUMER ID, CHECK CONSUMER ID:ENTER CORRECT ID');
  WHEN EXC_CON_NAME THEN
    DBMS_OUTPUT.PUT_LINE('INVALID CONSUMER NAME, ENTER CORRECT CONSUMER NAME');
  WHEN EXC_CON_CO THEN
    DBMS_OUTPUT.PUT_LINE('INVALID CONSUMER NUMBER');

END ADDCONSUMERDETAILS;

END MOVIE_PKG;
/