вызовите pl / sql из другого в oracle проблема с базой данных - PullRequest
0 голосов
/ 27 января 2020

у меня есть 2 хранимые процедуры, 1 называется A со следующим значением

PROCEDURE A(p_id IN NUMBER, lic_cat_2  OUT varchar2,lic_cat_1  OUT varchar2,traffic_code  OUT varchar2,lic_type  OUT varchar2,emp_num  OUT varchar2)
// Some LOGIC    
end A ;

и PROCEDURE B, который является оберткой для pro c A, но мне нужно получить другое значение с помощью запроса

PROCEDURE B(ph_id IN NUMBER, lic_cat_2  OUT varchar2,lic_cat_1  OUT varchar2,traffic_code  OUT varchar2,lic_type  OUT varchar2,emp_num  OUT varchar2)
    declare number phone_id  
    begin
    select into phone_id   parent_id from per_phones where phone_id= p_id
    exec A(phone_id,lic_cat_2  OUT varchar2,lic_cat_1  OUT varchar2,traffic_code  OUT varchar2,lic_type  OUT varchar2,emp_num  OUT varchar2);
    END B;

но это дает мне PLS-00103: обнаружен символ «СОЗДАТЬ»

1 Ответ

1 голос
/ 27 января 2020

Вы вызываете процедуру A неправильным образом:

  • опустите EXEC, это SQL* плюс команда
  • опустите параметры ' описание (IN/OUT, тип данных) - передать только значения
  • опустить DECLARE; он нужен в триггерах или анонимных блоках PL / SQL, но не в хранимых процедурах
    • кстати, имя переменной идет первым, тип данных следующий (для phone_id)
  • Я бы предложил вам префиксировать параметры и переменные с p_ (или par_) и l_ соответственно (или любым другим префиксом, который вы хотите), чтобы отличать guish от имен столбцов. Иначе легко запутаться.
    • также используйте псевдонимы таблиц в своих запросах по той же причине

Итак:

CREATE OR REPLACE PROCEDURE B (p_ph_id         IN     NUMBER,
                               p_lic_cat_2        OUT VARCHAR2,
                               p_lic_cat_1        OUT VARCHAR2,
                               p_traffic_code     OUT VARCHAR2,
                               p_lic_type         OUT VARCHAR2,
                               p_emp_num          OUT VARCHAR2)
IS
   l_phone_id  NUMBER;
BEGIN
   SELECT p.parent_id
     INTO l_phone_id
     FROM per_phones p
    WHERE p.phone_id = p_ph_id;

   A (l_phone_id,
      p_lic_cat_2,
      p_lic_cat_1,
      p_traffic_code,
      p_lic_type,
      p_emp_num);
END B;

Как я понимаю У меня нет ваших таблиц, например (чтобы показать, как это сделать) Я использовал пример схемы Скотта:

SQL> create or replace procedure a (par_deptno in number, par_dname out varchar2)
  2  is
  3  begin
  4    select dname into par_dname from dept where deptno = par_deptno;
  5  end;
  6  /

Procedure created.

SQL>
SQL> create or replace procedure b (par_empno in number, par_dname out varchar2) is
  2    l_deptno emp.deptno%type;
  3  begin
  4    select deptno into l_deptno from emp where empno = par_empno;
  5
  6    a(l_deptno, par_dname);
  7  end;
  8  /

Procedure created.

SQL>
SQL> set serveroutput on
SQL> declare
  2    l_dname dept.dname%type;
  3  begin
  4    b (7654, l_dname);
  5    dbms_output.put_line('Dname = ' || l_dname);
  6  end;
  7  /
Dname = SALES

PL/SQL procedure successfully completed.

SQL>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...