在 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 调用函数