Вы создали процедуру, а не функцию, поэтому вы не можете вызывать ее из оператора SQL.Аргументы также не соответствуют определению.
Простой способ проверить это, так как вы используете SQL Developer, - это использовать переменную привязки ref-cursor, объявленную в клиенте:
variable rc refcursor;
execute retrieve_decrypt(5, :rc);
print rc
и затем запустите все три строки как скрипт.
Обратите внимание на двоеточие перед rc
при использовании в качестве аргумента процедуры.Также обратите внимание, что variable
, execute
и print
- все клиентские команды.И execute
- это просто сокращение для анонимного блока PL / SQL.
Более общее использование процедуры будет вызывать ее из блока PL / SQL, используя локальную переменную refcursor, и перебирать результатустановить, что-то делать с каждым рядом.Не совсем понятно, что вы хотите с ними делать.
Вы также можете превратить процедуру в функцию и вернуть 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
уникален, то набор результатов будет одним значением, поэтому вы можете использовать скалярные переменные ипараметры вместо.Пока не ясно, так ли это.