我试图在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
如何解决它,请试试?
谢谢!!!
答案 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
(假设在第一种情况下抛出异常是有意义的位)。