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_cardcreate_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 编程(三 )程序包和包体,触发器,视图,索引

PL/SQL:调用包时找不到被调用的程序单元

当我选择 [关闭] 时,我在正文包 pl/sql 中遇到问题

ORA-06508: PL/SQL: 在包 AR_RECEIPT_API_PUB 过程中找不到正在调用的程序单元

PL/SQL - 全局变量并非在所有会话中都可用

编译时PL / Sql问题