在 oracle 数据库问题中从另一个调用 pl/sql

Posted

技术标签:

【中文标题】在 oracle 数据库问题中从另一个调用 pl/sql【英文标题】:call pl/sql from another one in oracle database problem 【发布时间】:2020-01-27 09:52:04 【问题描述】:

我有 2 个存储过程 1 被称为 A 具有以下 impl

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,它是 proc 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:遇到符号“CREATE”

【问题讨论】:

CREATE [ OR REPLACE ] 部分在 PROCEDURE 关键字之前都缺失。 【参考方案1】:

您以错误的方式调用 A 过程:

省略EXEC,这是一条SQL*Plus命令 省略参数的描述IN/OUT,数据类型)- 只传递值 省略DECLARE;在触发器或匿名 PL/SQL 块中需要它,但在存储过程中不需要 顺便说一句,变量名在前,数据类型在后(phone_id) 我建议您分别为参数和变量添加前缀p_(或par_)和l_(或您想要的任何其他前缀),以将它们与列名区分开来。否则很容易混淆。 另外,出于同样的原因,在查询中使用表别名

所以:

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;

因为我没有你的表,例如(为了展示如何做)我使用了 Scott 的示例模式:

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>

【讨论】:

以上是关于在 oracle 数据库问题中从另一个调用 pl/sql的主要内容,如果未能解决你的问题,请参考以下文章

在 ORACLE 的 select 语句中从 PL/SQL 调用函数

oracle:使用 PL/sql 过程从另一个模式填充表

在java中从另一个调用一个构造函数[重复]

如何在 Java 中从另一个构造函数调用一个构造函数?

如何在 Access VBA 中从另一个窗体调用一个窗体的 Form_Load

在模板上下文中从另一个助手调用一个助手 (Meteor 0.9.4)