如何在 PL/SQL 中使用包内的过程

Posted

技术标签:

【中文标题】如何在 PL/SQL 中使用包内的过程【英文标题】:How to use procedure within package in PL/SQL 【发布时间】:2020-10-21 10:27:09 【问题描述】:

如何创建一个包含过程的包?程序将指定和激励作为输入,并通过添加给定指定的激励来更新员工工资。显示已更新的员工记录数,例如“更新了 3 条员工记录”。 我有一个表 EMPLOYEE,包含 EMP_ID、EMP_NAME、SALARY 和 DESIGNATION。 给定的功能要求是:

Package name as  EMP_DESIGNATION, and
Procedure signature:
EMP_DETAILS(design employee.designation%TYPE, incentive number);

我尝试的代码是-

set serveroutput on;
CREATE OR REPLACE PACKAGE EMP_DESIGNATION AS
 PROCEDURE EMP_DETAILS(
design employee.designation%TYPE,
incentive NUMBER) IS
BEGIN
UPDATE employee SET employee.salary = employee.salary + incentive
WHERE employee.designation = design;
dbms_output.put_line(SQL%ROWCOUNT || ' employee record(s) are updated');
END EMP_DESIGNATION;
END;
/

输出是-

Warning: Package Body created with compilation errors.
BEGIN
*
ERROR at line 1:
ORA-04063: package body "P10017.EMP_DESIGNATION" has errors
ORA-06508: PL/SQL: could not find program unit being called:
"P10017.EMP_DESIGNATION"
ORA-06512: at line 2

如何解决这个错误?请帮忙。先感谢您。 PL/SQL:语句被忽略

【问题讨论】:

要找出受 DML 语句影响的行数,请检查 SQL%ROWCOUNT 的值 【参考方案1】:

你必须先创建一个包规范,然后是它的body。像这样的:

SQL> CREATE OR REPLACE PACKAGE emp_designation
  2  AS
  3     PROCEDURE emp_details (design employee.designation%TYPE, incentive NUMBER);
  4  END emp_designation;
  5  /

Package created.

SQL>
SQL> CREATE OR REPLACE PACKAGE BODY emp_designation
  2  AS
  3     PROCEDURE emp_details (design employee.designation%TYPE, incentive NUMBER)
  4     IS
  5     BEGIN
  6        UPDATE employee
  7           SET employee.salary = employee.salary + incentive
  8         WHERE employee.designation = design;
  9
 10        DBMS_OUTPUT.put_line (
 11           SQL%ROWCOUNT || ' employee record(s) are updated');
 12     END emp_details;
 13  END emp_designation;
 14  /

Package body created.

SQL>

【讨论】:

在进行更改后,代码仍然会引发错误,我已经提到过,通过在上面的问题中对其进行编辑。 您所做的更改不正确。再看看我的代码。不能先 END 包体,再 END 过程。 哦,所以我不应该结束开始,因为我们正在结束程序和包? 必须结束所有开始的事情,但你必须注意你要结束的事情。

以上是关于如何在 PL/SQL 中使用包内的过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PL / SQL 中读取另一个游标内的游标

Oracle:调用包内的存储过程

如何在 vue 中触发 npm 包内的方法?

如何在 pl/sql 过程中使用游标返回多行和多列?

如何在pl / sql中同时在不同会话中执行存储过程

如何在 PL/SQL 中查看存储过程的代码