如何将此查询转换为过程?

时间:2019-02-15 00:30:35

标签: sql database oracle stored-procedures dbfunctions

我写下面的选择查询,它可以工作find,并给出了结果。

    Select custname,contactno, enc_dec.decrypt(creditcardno,password) as  
creditcardno ,enc_dec.decrypt(income,password) as 
income from employees where custid=5;

enter image description here

现在,我需要以“ 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;enter image description here

需要一些专家帮助来解决此问题。作为这个问题,我很努力。

1 个答案:

答案 0 :(得分:1)

您创建的是过程,而不是函数,因此无法从SQL语句调用它。参数也不符合定义。

在使用SQL Developer时,一种简单的测试方法是使用在客户端中声明的ref-cursor绑定变量:

variable rc refcursor;
execute retrieve_decrypt(5, :rc);
print rc

,然后将所有三行作为脚本运行。

在用作过程参数时,请注意rc之前的冒号。另请注意,variableexecuteprint都是客户端命令。 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参数。尚不清楚是否是这种情况。