Обнаружен символ PLSQL - PullRequest
2 голосов
/ 23 мая 2019

Я пытаюсь создать процедуру, которая после нахождения всех необходимых данных выводит на экран каждый из них. Эта процедура ищет членов и получает два параметра: P_CRITERIO, если вы ищете член по идентификатору, фамилии или национальному идентификатору, и P_SOCIO, который имеет идентификатор, фамилию или национальный идентификатор.

Я пытался удалить часть «Исключение», я не получил ту же ошибку, но у меня все еще есть ошибка, которую я не могу исправить

CREATE OR REPLACE PROCEDURE P_CONSULTAR_SOCIOS (P_CRITERIO IN VARCHAR2,P_SOCIO IN VARCHAR2)
IS  

    V_SENT_SOCIO SOC_SOCIO%rowtype;
    V_DEUDA NUMBER;--total dept
    V_SALDO NUMBER;--available money
    capital_pagado NUMBER;--how much he has paid
    capital_a_pagar NUMBER;--how much he has to pay
    V_APORTES NUMBER;--total contributions

BEGIN

    IF UPPER(P_CRITERIO) = 'ID' THEN    
        SELECT * INTO V_SENT_SOCIO FROM SOC_SOCIO WHERE ID_SOCIO=P_SOCIO;
    ELSE IF UPPER(P_CRITERIO) = 'CEDULA' THEN       
        SELECT * INTO V_SENT_SOCIO FROM SOC_SOCIO WHERE CEDULA=P_SOCIO; 
    ELSE IF UPPER(P_CRITERIO) = 'APELLIDO' THEN 
        SELECT * INTO V_SENT_SOCIO FROM SOC_SOCIO WHERE APELLIDO=P_SOCIO;
    END IF;

    --available money           
    SELECT NVL(SALDO_DISPONIBLE,0) INTO V_SALDO     
    FROM AHO_CUENTA_AHORRO      
    WHERE ID_SOCIO = V_SENT_SOCIO.ID_SOCIO; 

    --calculates if he has any loan active and the amount is stored in V_DEUDA      
    select sum(capital_pagado) into capital_pagado from cre_prestamos where id_sol_cred=V_SENT_SOCIO.ID_SOCIO;          
    select sum(capital_a_pagar) into capital_a_pagar from cre_prestamos where id_sol_cred=V_SENT_SOCIO.ID_SOCIO and UPPER(estado)='A';          
    V_DEUDA := (capital_pagado - capital_a_pagar);


    --sum of total contributions
    select sum(nvl(sdo.monto,0)) into V_APORTES from soc_detalle_obligaciones sdo
    join soc_obligaciones o on sdo.id_obligacion = o.id_obligacion
    where o.ID_SOCIO=V_SENT_SOCIO.ID_SOCIO and o.tipo_obligacion = 'A';

    --prints result
    DBMS_OUTPUT.PUT_LINE('| '||V_SENT_SOCIO.ID_SOCIO||' | '||V_SENT_SOCIO.CEDULA||
    ' | '||V_SENT_SOCIO.NOMBRE_APELLIDO||' | '||' | '||V_SALDO||' | '||V_DEUDA||' | '||
    V_APORTES||' |');   

    EXCEPTION           
        WHEN NO_DATA_FOUND THEN         
            DBMS_OUTPUT.PUT_LINE(-20032,'El socio no existe');      
        WHEN OTHERS THEN        
            DBMS_OUTPUT.PUT_LINE('Ha ocurrido un error');
END P_CONSULTAR_SOCIOS;
/ 

ошибки я получаю говорит

42/1     PLS-00103: Encountered the symbol "EXCEPTION" when expecting one
         of the following:
         ( begin case declare end exit for goto if loop mod null
         pragma raise return select update while with <an identifier>
         <a double-quoted delimited-identifier> <a bind variable> <<
         continue close current delete fetch lock insert open rollback
         savepoint set sql execute commit forall merge pipe purge

47/23    PLS-00103: Encountered the symbol "end-of-file" when expecting
         one of the following:
         end not pragma final instantiable order overriding static
         member constructor map

Ответы [ 2 ]

4 голосов
/ 23 мая 2019

Что-то не так с вашим кодом.

Чтобы исправить ошибку с помощью if, вы можете заменить эту часть кода на

IF UPPER(P_CRITERIO) = 'ID' THEN    
    SELECT * INTO V_SENT_SOCIO FROM SOC_SOCIO WHERE ID_SOCIO=P_SOCIO;
ELSIF UPPER(P_CRITERIO) = 'CEDULA' THEN       
    SELECT * INTO V_SENT_SOCIO FROM SOC_SOCIO WHERE CEDULA=P_SOCIO; 
ELSIF UPPER(P_CRITERIO) = 'APELLIDO' THEN 
    SELECT * INTO V_SENT_SOCIO FROM SOC_SOCIO WHERE APELLIDO=P_SOCIO;
END IF;

Произошла ошибка с вашими исключениями.

PUT_LINE Не может принимать более одного параметра

EXCEPTION           
WHEN NO_DATA_FOUND THEN         
    DBMS_OUTPUT.PUT_LINE('El socio no existe'); 

Это то, что я вижу до сих пор

2 голосов
/ 23 мая 2019

PLS-00103: Encountered the symbol исключение всегда указывает на синтаксическую ошибку. Так что это легко решить, посмотрев на код над данным номером строки - в данном случае 42 - и сравнив его с синтаксисом, приведенным в документации Oracle PL / SQL .

Проблема в вашем случае в том, что ваш код может быть действительным, но это не так. Вы написали

IF ... 
ELSE IF

Теперь это правильный синтаксис, когда второй IF вложен:

IF ...
ELSE IF ... END IF;
END IF;

В этом сценарии каждый автономный IF соответствует END IF. Но вы на самом деле пытаетесь реализовать переключатель. Таким образом, у вас есть только один конец, если. В этом случае вы должны использовать вместо ELSIF:

IF ...
ELSIF ...
END IF;

В блоке ИСКЛЮЧЕНИЕ есть еще одна синтаксическая ошибка. DBMS_OUTPUT.PUT_LINE () принимает один параметр - строку. Чтобы вернуть сообщение с определенным пользователем номером, используйте функцию RAISE_APPLICATION_ERROR ().

Ветвь ДРУГИЕ - просто плохая практика. Буквально тысячи сообщений об ошибках Oracle, многие из которых могут сбить вашу процедуру. Сжатие всех этих данных в одно общее сообщение бесполезно для любого, кто пытается диагностировать причину сбоя программы. Изначально это будете вы, поэтому помогайте себе, а также людям, которые будут поддерживать вас после вас. Также лучше вызывать исключения, а не использовать DBMS_OUTPUT: сообщения могут игнорироваться или оставаться незамеченными, исключения должны обрабатываться.

EXCEPTION           
    WHEN NO_DATA_FOUND THEN         
        raise_application_error(-20032,'El socio no existe');      
    WHEN OTHERS THEN        
        DBMS_OUTPUT.PUT_LINE('Ha ocurrido un error');
        raise;
END P_CONSULTAR_SOCIOS;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...