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

Sql 如何将此查询转换为过程?,sql,database,oracle,stored-procedures,dbfunctions,Sql,Database,Oracle,Stored Procedures,Dbfunctions,我写了下面的select查询和it工作查找,并给出了输出 Select custname,contactno, enc_dec.decrypt(creditcardno,password) as creditcardno ,enc_dec.decrypt(income,password) as income from employees where custid=5; 现在我需要为这个名称写一个过程“retrieve_decrypt5”。 我这样写的过程,它遵守了,但调用它时并没

我写了下面的select查询和it工作查找,并给出了输出

    Select custname,contactno, enc_dec.decrypt(creditcardno,password) as  
creditcardno ,enc_dec.decrypt(income,password) as 
income from employees where custid=5;
现在我需要为这个名称写一个过程“retrieve_decrypt5”。 我这样写的过程,它遵守了,但调用它时并没有打印结果和给定的错误

    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_decrypt5 FROM DUAL。


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

您创建了一个过程,而不是函数,因此无法从SQL语句调用它。参数也与定义不匹配

在使用SQL Developer时,测试它的一种简单方法是使用一个ref cursor bind变量,该变量在客户机中声明:

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参数。不过,目前还不清楚情况是否如此。

也许您的意思是创建一个函数而不是一个过程。看看这个例子:Pole,我如何将它转换为函数?我尝试执行它,现在有任何错误。但不要打印任何输出。我已经展示了一个函数版本。您是否将过程版本作为脚本或单独的语句运行?相同的脚本。我试着执行你的第二个过程,它在第三行返回语句附近出现错误。语法错误哦,忘记了最重要的更改!固定的但仍然没有经过测试。