第10行的错误:PL / SQL:忽略语句

时间:2014-10-21 22:50:00

标签: sql oracle plsql

我试图在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

如何解决它,请试试?

谢谢!!!

1 个答案:

答案 0 :(得分:2)

您的编译错误位于第10行,您正在执行SELECT。除非您使用12.1或更高版本并且希望使用新的implicit statement results功能,否则在PL / SQL块中不能有SELECT语句,除非有什么东西可以将结果提取到(例如{{{{ 1}}子句)或者您正在使用[BULK COLLECT] INTO语句来打开游标。假设您的查询返回多行并且您打算将光标返回给调用者,您可以执行类似

的操作
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子句中调用RAISE_APPLICATION_ERROR(假设在第一种情况下抛出异常是有意义的位)。