когда пытаешься извинить процедуру он сказал ошибку компиляции в оракуле? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь написать процедуру выбора в oracle.but, но она успешно компилируется, когда я пытаюсь выполнить данную ошибку.

 set serveroutput on;
    CREATE OR REPLACE  PROCEDURE retrieve_decrypt(
        custid  in NUMBER,
        column_name in VARCHAR2,
        test_value OUT VARCHAR2
        ) 
        AS

   BEGIN
      -- enc_dec.decrypt(column_name,password) into  test_value from employees where custid=5;
        COMMIT;
   END;
/


set serveroutput on;
EXEC retrieve_decrypt(5,'creditcardno');

ошибка говорит,

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Это ваша процедура:

SQL> create or replace procedure retrieve_decrypt
  2    (custid      in number,
  3     column_name in varchar2,
  4     test_value out varchar2
  5    )
  6  as
  7  begin
  8    -- your code goes here
  9    null;
 10  end;
 11  /

Procedure created.

SQL>

Вот как вы ее называете (и получаете сообщение об ошибке):

SQL> exec retrieve_decrypt(5, 'creditcardno');
BEGIN retrieve_decrypt(5, 'creditcardno'); END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'RETRIEVE_DECRYPT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


SQL>

Причина ошибки:

  • процедура содержит 3 параметры:
    • 2 из них IN - вы предоставили их значения
    • 1 из них OUT - вы не предоставилион получил ошибку

Вот что вы должны были сделать: поскольку третий параметр равен OUT, вам нужно ОБЪЯВИТЬ его:

SQL> declare
  2    l_out varchar2(20);
  3  begin
  4    retrieve_decrypt(5, 'creditcardno', l_out);
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL>

EXEC, которую вы использовали, является командой SQL * Plus, поэтому она может работать не везде;DECLARE-BEGIN-END блок будет, поэтому я бы предложил вам его использовать.

В качестве альтернативы, в SQL * Plus его можно переписать как

SQL> var l_out varchar2
SQL>
SQL> exec retrieve_decrypt(5, 'creditcardno', :l_out);

PL/SQL procedure successfully completed.

SQL>

, но - еще раз - вам лучшеиспользуйте DECLARE-BEGIN-END PL / SQL блок.

0 голосов
/ 14 февраля 2019

Исходная ошибка:

неверный номер или типы аргументов при вызове 'RETRIEVE_DECRYPT'

Процедура требует 3 параметра.Вы передаете только 2 (или, по-видимому, только 1, при попытке создать сообщение об ошибке, показанное).

Почему вы также видите сообщение «Обычно ошибка компиляции PL / SQL»?Команда EXEC в SQLPlus создает блок PL / SQL, содержащий предоставленный вами текст, и отправляет его в Oracle для выполнения.Oracle пытается скомпилировать этот блок PL / SQL (точно так же, как он компилирует процедуру при ее создании).В этом случае компиляция завершится неудачно из-за несоответствия количества аргументов.

...