《Oracle PL/SQL开发指南》学习笔记32——源码调试——包(第一部分,包架构)

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 08:25   170   0

1. 前向引用(Forward Referencing)

"The execution block knows everything in its declaration block or external declaration block(s). The forward-referencing stub lets the PL/SQL single-pass parser put the second procedure declaration in its list of identifiers. It is added before the parser reads the first procedure because single-pass parsers read from the top down. When the parser reads the first procedure, it knows about the second procedure. The parser then validates the call to the second procedure and looks for the implementation of second later in the program to compile the code successfully. The parser raises a PLS-00328 error if the subprogram is missing after reading the complete source code.

NOTE Java uses a two-pass parser and lets you avoid forward declarations."

SQL> /* Formatted on 2018/12/9 22:03:46 (QP5 v5.256.13226.35538) */
SQL> DECLARE
  2     -- Placeholder for a forward-referencing stub.
  3     PROCEDURE FIRST (pv_caller VARCHAR2)
  4     IS
  5     BEGIN
  6        DBMS_OUTPUT.put_line ('"First" called by [' || pv_caller || ']');
  7        second ('First');
  8     END;
  9
 10     PROCEDURE second (pv_caller VARCHAR2)
 11     IS
 12     BEGIN
 13        DBMS_OUTPUT.put_line ('"Second" called by [' || pv_caller || ']');
 14     END;
 15  BEGIN
 16     FIRST ('Main');
 17  END;
 18  /
      second ('First');
      *
第 7 行出现错误:
ORA-06550: 第 7 行, 第 7 列:
PLS-00313: 在此作用域中没有声明 'SECOND'
ORA-06550: 第 7 行, 第 7 列:
PL/SQL: Statement ignored


SQL> ed
已写入 file afiedt.buf

  1  DECLARE
  2     -- Placeholder for a forward-referencing stub.
  3     PROCEDURE second(pv_caller VARCHAR2);
  4     PROCEDURE FIRST (pv_caller VARCHAR2)
  5     IS
  6     BEGIN
  7        DBMS_OUTPUT.put_line ('"First" called by [' || pv_caller || ']');
  8        second ('First');
  9     END;
 10     PROCEDURE second (pv_caller VARCHAR2)
 11     IS
 12     BEGIN
 13        DBMS_OUTPUT.put_line ('"Second" called by [' || pv_caller || ']');
 14     END;
 15  BEGIN
 16     FIRST ('Main');
 17* END;
 18  /
"First" called by [Main]
"Second" called by [First]

PL/SQL 过程已成功完成。

2. 重载(overloading)

/* Formatted on 2018/12/9 22:42:36 (QP5 v5.256.13226.35538) */
CREATE OR REPLACE PACKAGE not_overloading
IS
   FUNCTION adding (a NUMBER, b NUMBER)
      RETURN NUMBER;

   FUNCTION adding (one NUMBER, two NUMBER)
      RETURN BINARY_INTEGER;
END;


CREATE OR REPLACE PACKAGE overloading
IS
   FUNCTION adding (a NUMBER, b NUMBER)
      RETURN NUMBER;

   FUNCTION adding (a VARCHAR2, b NUMBER)
      RETURN NUMBER;

   FUNCTION adding (a NUMBER, b VARCHAR2)
      RETURN NUMBER;

   FUNCTION adding (a VARCHAR2, b VARCHAR2)
      RETURN BINARY_INTEGER;
END overloading;
SQL> ed
已写入 file afiedt.buf

  1  create or replace procedure test(abc number) is
  2  begin
  3  dbms_output.put_line(abc);
  4* end test;
SQL> /

过程已创建。

SQL> desc test
PROCEDURE test
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 ABC                            NUMBER                  IN

SQL> ed
已写入 file afiedt.buf

  1  create or replace procedure test(cde number, abc number) is
  2  begin
  3  dbms_output.put_line(abc);
  4* end test;
SQL> /

过程已创建。

SQL> desc test
PROCEDURE test
参数名称                       类型                    输入/输出默认值?
------------------------------ ----------------------- ------ --------
 CDE                            NUMBER                  IN
 ABC                            NUMBER                  IN

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP