Как вызвать хранимую процедуру только с параметром OUT? - PullRequest
0 голосов
/ 29 апреля 2019

Я создал хранимую процедуру в Oracle 11g:

CREATE OR REPLACE PROCEDURE greetings(cnt OUT VARCHAR2) 
AS 
BEGIN
    SELECT COUNT(*) 
    INTO cnt 
    FROM SYS.all_tables; 
END greetings;

, но не могу ее вызвать.

Я пробовал следующие фрагменты кода:

  1. EXEC GREETINGS();
  2. EXEC GREETINGS;
  3. CALL GREETINGS;

Ответы [ 3 ]

2 голосов
/ 29 апреля 2019

Для процедуры требуется один параметр, поэтому - укажите его.

SQL> CREATE OR REPLACE PROCEDURE greetings(cnt OUT VARCHAR2)
  2  AS
  3  BEGIN
  4      SELECT COUNT(*)
  5      INTO cnt
  6      FROM SYS.all_tables;
  7  END greetings;
  8  /

Procedure created.

Один вариант, который работает везде, это использовать анонимный блок PL / SQL:

SQL> set serveroutput on
SQL> declare
  2    l_cnt number;
  3  begin
  4    greetings(l_cnt);
  5    dbms_output.put_line(l_cnt);
  6  end;
  7  /
87

PL/SQL procedure successfully completed.

Другой работает в SQL * Plus (или любом другом инструменте, который способен имитировать его):

SQL> var l_cnt number;
SQL> exec greetings(:l_cnt);

PL/SQL procedure successfully completed.

SQL> print l_cnt;

     L_CNT
----------
        87
0 голосов
/ 30 апреля 2019

Что касается примера call, это объясняется в EXECUTE распознает хранимую процедуру, CALL не . Это не очевидно из документации по синтаксису, но требует скобок, поэтому (довольно бесполезно) отвергает все это и создает впечатление, что greetings - это проблема, тогда как на самом деле это не так:

SQL> call greetings;
call greetings
     *
ERROR at line 1:
ORA-06576: not a valid function or procedure name

при использовании обязательных скобок вы получите реальную проблему:

SQL> call greetings();
call greetings()
     *
ERROR at line 1:
ORA-06553: PLS-306: wrong number or types of arguments in call to 'GREETINGS'

Как уже отмечали другие, вам не хватает параметра.

SQL> var n number
SQL>
SQL> call greetings(:n);

Call completed.

SQL> print :n

         N
----------
       134

execute - это всего лишь удобный ярлык SQL * Plus для блока PL / SQL begin xxx; end;, который менее суетлив в скобках и выдает одинаковое сообщение об ошибке с ними или без них.

(variable и print являются командами SQL * Plus и могут не поддерживаться в других средах.)

0 голосов
/ 29 апреля 2019

Нет проблем с телом процедуры. Вы можете позвонить так:

SQL> var nmr number;
SQL> exec greetings(:nmr);

PL/SQL procedure successfully completed
nmr
------------------------------------------
306 -- > <a numeric value returns in string format> 

Oracle не заботится о присвоении числового значения строке. Выполнение печатает результат напрямую, но в любое время вы можете снова вызвать это значение переменной (nmr) и вывести его как

SQL> print nmr
nmr
---------
306
...