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

How to convert this Query to Procedure?

我写了下面的 select 查询,它找到了,并给出了 put。

    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;

需要一些专家的帮助来解决这个问题。作为这个问题,我在很多时候都在挣扎。

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

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

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

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

注意 rc 用作过程参数时前面的冒号。另请注意,variableexecuteprint 都是客户端命令。 execute 只是 shorthand 对于匿名 PL/SQL 块。

该过程的更一般用途是使用本地 refcursor 变量从 PL/SQL 块中调用它,然后遍历结果集,对每一行执行一些操作。虽然不清楚你想用它们做什么。

您也可以将过程变成函数和 return refcursor,而不是将其作为输出参数:

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 是唯一的,那么结果集将是单个值,因此您可以改用标量变量和输出参数。尚不清楚情况是否如此。