PL/SQL 包 - 在包中调用过程
Posted
技术标签:
【中文标题】PL/SQL 包 - 在包中调用过程【英文标题】:PL/SQL package - calling a procedure within a package 【发布时间】:2020-04-06 10:35:50 【问题描述】:我是一个 pl/sql 初学者,试图了解如何在同一个包中调用过程。这是一个包含 2 个过程的示例包体。首先是用于创建员工,其次是在 emp_id 不为空时创建员工卡。你能告诉我如何在下面的 if 语句块中继续吗?
非常感谢!
create or replace PACKAGE BODY sample_package
IS
PROCEDURE create_employee(
emp_id IN OUT VARCHAR2,
emp_name IN VARCHAR2,
emp_surname IN VARCHAR2)
IS
BEGIN
schema.package.procedure(
emp_id,
emp_name,
emp_surname
);
IF (emp_id != null) THEN
--how do I call procedure create_id_card
END IF;
END;
PROCEDURE create_id_card(
card_id IN OUT VARCHAR2,
card_name IN VARCHAR2)
IS
BEGIN
schema.package.procedure(
card_id,
card_name
);
END;
END sample_package;
【问题讨论】:
为了从create_employee
调用create_id_card
,create_id_card
必须在包头中声明或放在create_employee
之前或在create_employee
之上转发声明PROCEDURE create_id_card(card_id IN OUT VARCHAR2, card_name IN VARCHAR2);
。
参考 Belayer 的 cmets “正如当前编写的那样,create_id_card 过程将永远不会被调用。这不是因为调用语法不正确 - 它是正确的。它永远不会被调用,因为“(emp_id ! = null)" 永远不会返回 True。任何应用于 null 的操作总是返回 null。你需要 "(emp_id is not null)"
【参考方案1】:
您必须找到一种在过程 create_employee 中传递变量 card_id 和 card_name 的方法,如下所示
PROCEDURE create_employee(
emp_id IN OUT VARCHAR2,
emp_name IN VARCHAR2,
emp_surname IN VARCHAR2)
IS
l_card_id VARCHAR2(100);
l_card_name VARCHAR2(255);
BEGIN
schema.package.procedure(
emp_id,
emp_name,
emp_surname
);
l_card_name:=emp_name;
IF emp_id is not null THEN
create_id_card(l_card_id, l_card_name);
END IF;
END;
【讨论】:
【参考方案2】:就这么简单:
IF (emp_id is not null) THEN
--how do I call procedure create_id_card
create_id_card(parameter1, parameter2);
END IF;
由于这两个程序都在同一个包中,所以您不必执行任何操作(在其名称前加上包或所有者名称,如果您的意思是这样的话)。
我不知道您实际传递了哪些参数,所以我将它们命名为 parameter_x
。
【讨论】:
正如目前所写的,但是永远不会调用 create_id_card 过程。这是 not 因为调用语法不正确 - 它是正确的。它永远不会被调用,因为 "(emp_id != null)" 永远不会返回 True。应用于 null 的任何操作始终返回 null。你需要“(emp_id is not null)” 哈!没错,@Belayer!谢谢你。根本没注意。以上是关于PL/SQL 包 - 在包中调用过程的主要内容,如果未能解决你的问题,请参考以下文章
当我选择 [关闭] 时,我在正文包 pl/sql 中遇到问题