首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遇到符号PLSQL

遇到符号PLSQL
EN

Stack Overflow用户
提问于 2019-05-23 01:37:25
回答 2查看 113关注 0票数 2

我正在尝试创建一个过程,在找到屏幕上所有必要的数据后,每个打印出来。此过程搜索成员,并接收两个参数,P_CRITERIO (如果您按ID查找memeber )、Last或national,以及具有id、姓氏或国家id的P_SOCIO。

我试着删除异常部分,我没有得到相同的错误,但我仍然有一个我无法修复的错误

代码语言:javascript
复制
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:当期望下列情况之一时遇到符号"EXCEPTION“:(开始大小写声明结束退出goto if循环模式无效实用化,提高返回选择更新,而使用<<继续关闭当前删除获取锁插入打开回滚保存点集select所有合并管道清除47/23 PLS-00103:遇到符号" end - of -file”时,需要下列之一:最终可实例化顺序覆盖静态成员构造函数映射

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-23 01:47:26

你的代码有问题。

若要使用if修复错误,可以将代码的这一部分替换为

代码语言:javascript
复制
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不能接受多个参数

代码语言:javascript
复制
EXCEPTION           
WHEN NO_DATA_FOUND THEN         
    DBMS_OUTPUT.PUT_LINE('El socio no existe'); 

这就是我目前所能看到的

票数 4
EN

Stack Overflow用户

发布于 2019-05-23 07:25:53

PLS-00103: Encountered the symbol异常总是指示语法错误。因此,通过查看给定行号以上的代码(本例中为42行),并将其与Oracle PL/SQL文档中给出的语法进行比较,可以很容易地解决问题。

在您的情况下,问题是您的代码可能是有效的,但它不是。你写过

代码语言:javascript
复制
IF ... 
ELSE IF

现在,当第二个IF嵌套时,这是有效的语法:

代码语言:javascript
复制
IF ...
ELSE IF ... END IF;
END IF;

在这个场景中,每个独立的IF都与END IF匹配。但是你实际上是在尝试实现一个交换机。所以你只有一个目的。在这种情况下,您必须使用ELSIF来代替:

代码语言:javascript
复制
IF ...
ELSIF ...
END IF;

异常块中还有另一个语法错误。DBMS_OUTPUT.PUT_LINE()接受一个参数,一个字符串。若要使用用户定义的数字返回消息,请使用RAISE_APPLICATION_ERROR()函数。

当别人的分支只是不好的做法。实际上有数千条Oracle错误消息,其中许多可能会影响您的过程。将所有这些压缩为一个通用消息对任何试图诊断程序失败的人都没有帮助。最初那将是你,所以请你自己,以及谁将维持它在你之后。另外,引发异常也比使用DBMS_OUTPUT更好:消息可以被忽略或被忽略,异常必须被处理。

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56267010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档