繁体   English   中英

第10行出现错误:PL / SQL:语句被忽略

[英]ERROR at line 10: PL/SQL: Statement ignored

我正在尝试在oracle pl / sql上创建一个过程,但出现错误。

我的过程的代码是:

CREATE OR REPLACE PROCEDURE PR_LISTA_CLI (cpf IN VARCHAR2, p_rc OUT SYS_REFCURSOR)
IS
  checkCpf NUMBER; 
BEGIN   

    SELECT COUNT(CPF_CLIENTE) INTO checkCpf FROM CLIENTE WHERE CPF_CLIENTE = cpf;

    IF (checkCpf > 0) THEN
      open p_rc
       for
        select 
            com.data_compra,
            lst.qde_produto, 
            prd.nome_produto, 
            prd.valor_produto * lst.qde_produto
        from cliente cli 
            inner join compra com on cli.cod_cliente = com.cod_cliente 
            inner join lista_produto lst on com.cod_compra = lst.cod_compra
            inner join produto prd on lst.cod_produto = prd.cod_produto
        WHERE cli.cpf_cliente = cpf
        order by com.data_compra asc;
    ELSE
        RAISE_APPLICATION_ERROR(-20999,'ERRO! Cpf não cadastrado!', FALSE);
    END IF;
END;

该过程创建成功,没有错误。

但是我在调​​用它后得到了错误-CALL PR_LISTA_CLI(111111111);

ORA-00911: invalid character

请问如何解决?

谢谢!!!

您的编译错误在第10行,这是您执行SELECT 除非您使用的是12.1或更高版本,并且希望使用新的隐式语句结果功能,否则除非有将结果提取到其中的内容(例如[BULK COLLECT] INTO子句),否则您不能在PL / SQL块中具有SELECT语句。您正在使用SELECT语句打开游标。 假设您的查询返回多行,并且您打算将游标返回给调用者,则可以执行以下操作

CREATE OR REPLACE PROCEDURE PR_LISTA_CLI (cpf IN VARCHAR2, p_rc OUT SYS_REFCURSOR)
IS
  vEXCEPTION EXCEPTION;
  checkCpf NUMBER; 
BEGIN   

    SELECT COUNT(CPF_CLIENTE) INTO checkCpf FROM CLIENTE WHERE CPF_CLIENTE = cpf;

    IF (checkCpf > 0) THEN
      open p_rc
       for
        select 
            com.data_compra,
            lst.qde_produto, 
            prd.nome_produto, 
            prd.valor_produto * lst.qde_produto
        from cliente cli 
            inner join compra com on cli.cod_cliente = com.cod_cliente 
            inner join lista_produto lst on com.cod_compra = lst.cod_compra
            inner join produto prd on lst.cod_produto = prd.cod_produto
        WHERE cli.cpf_cliente = cpf
        order by com.data_compra asc
    ELSE
        RAISE vEXCEPTION;
    END IF;
    EXCEPTION
    WHEN vEXCEPTION THEN
        RAISE_APPLICATION_ERROR(-20999,'ERRO! Cpf não cadastrado!', FALSE);
END;

现在,如果那是你在做什么

  • 由于不修改任何数据库状态,因此创建返回sys_refcursor的函数会更有意义。
  • 您定义的异常似乎没有用。 您正在引发一个异常,然后捕获该相同的异常而仅引发一个不同的异常。 vException中间人,删除异常处理程序和vException变量,然后在您的ELSE子句中调用RAISE_APPLICATION_ERROR (假设首先在这种情况下抛出异常确实有意义)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM