我写下面的选择查询,它可以工作find,并给出了结果。
Select custname,contactno, enc_dec.decrypt(creditcardno,password) as
creditcardno ,enc_dec.decrypt(income,password) as
income from employees where custid=5;
现在,我需要以“ retrieve_decrypt(5)”的形式将此名称编写过程。 我编写这样的过程,它符合要求,但是在调用它时不会显示结果并给出错误。
CREATE OR REPLACE PROCEDURE retrieve_decrypt(
custid in NUMBER,
decrypt_value out sys_refcursor
)
IS
BEGIN
open decrypt_value for Select custname,contactno, enc_dec.decrypt(creditcardno,password) as
creditcardno ,enc_dec.decrypt(income,password) as
income from employees where custid=custid ;
COMMIT;
END;
/
我这样称呼SELECT retrieve_decrypt(5) FROM DUAL;
。
需要一些专家帮助来解决此问题。作为这个问题,我很努力。
答案 0 :(得分:1)
您创建的是过程,而不是函数,因此无法从SQL语句调用它。参数也不符合定义。
在使用SQL Developer时,一种简单的测试方法是使用在客户端中声明的ref-cursor绑定变量:
variable rc refcursor;
execute retrieve_decrypt(5, :rc);
print rc
,然后将所有三行作为脚本运行。
在用作过程参数时,请注意rc
之前的冒号。另请注意,variable
,execute
和print
都是客户端命令。 execute
只是匿名PL / SQL块的简写。
该过程的更一般用途是使用本地refcursor变量从PL / SQL块中调用该过程,并遍历结果集,对每一行进行处理。尚不清楚您想对他们做什么。
您还可以将过程转换为函数并返回refcursor,而不用将其作为out参数:
CREATE OR REPLACE FUNCTION retrieve_decrypt(
custid in NUMBER
)
RETURN sys_refcursor
IS
decrypt_value sys_refcursor;
BEGIN
open decrypt_value for Select custname,contactno, enc_dec.decrypt(creditcardno,password) as
creditcardno ,enc_dec.decrypt(income,password) as
income from employees where custid=custid ;
RETURN decrypt_value;
END;
/
(未测试),然后可以按照显示的方式调用它:
SELECT retrieve_decrypt(5) FROM DUAL;
,但并非所有客户端都会整齐地显示结果。您还可以从PL / SQL块调用并遍历结果。
但是,如果您的custid
是唯一的,那么结果集将是单个值,因此您可以改用标量变量和out参数。尚不清楚是否是这种情况。