如何将此查询转换为过程?
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
用作过程参数时前面的冒号。另请注意,variable
、execute
和 print
都是客户端命令。 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
是唯一的,那么结果集将是单个值,因此您可以改用标量变量和输出参数。尚不清楚情况是否如此。
我写了下面的 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
用作过程参数时前面的冒号。另请注意,variable
、execute
和 print
都是客户端命令。 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
是唯一的,那么结果集将是单个值,因此您可以改用标量变量和输出参数。尚不清楚情况是否如此。