Как преобразовать этот запрос в процедуру? - PullRequest
0 голосов
/ 15 февраля 2019

Я пишу следующий запрос select, и он работает find и выдаётся put.

    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 голосов
/ 15 февраля 2019

Вы создали процедуру, а не функцию, поэтому вы не можете вызывать ее из оператора 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 уникален, то набор результатов будет одним значением, поэтому вы можете использовать скалярные переменные ипараметры вместо.Пока не ясно, так ли это.

...