【问题标题】:Oracle 11g PL/SQL Positions of CONTANT variables in PACKAGEOracle 11g PL/SQL PACKAGE 中 CONTANT 变量的位置
【发布时间】:2023-03-11 11:35:01
【问题描述】:

我有严格的优化问题。当过程/函数被多次调用时,我应该在我的 PACKAGE 中放置 CONSTANT 变量吗?

让我们看看这个:

CREATE OR REPLACE PACKAGE WB_TEST IS
  PROCEDURE TEST;
END WB_TEST;

CREATE OR REPLACE PACKAGE BODY WB_TEST IS
  FUNCTION PARSER(IN_PARAM IN VARCHAR2) RETURN VARCHAR2 IS
    LC_MSG   CONSTANT VARCHAR2(80) := 'Hello USERNAME! How are you today?';
    LC_PARAM CONSTANT VARCHAR2(10) := 'USERNAME';
  BEGIN
    RETURN REPLACE(LC_MSG, LC_PARAM, IN_PARAM);
  END PARSER;

  PROCEDURE TEST IS
  BEGIN
    FOR I IN 1 .. 1000 LOOP
      DBMS_OUTPUT.PUT_LINE(PARSER(TO_CHAR(I)));
    END LOOP;
  END TEST;
BEGIN
  DBMS_OUTPUT.ENABLE(1000000);
END WB_TEST;
/

或者这样做更好:

CREATE OR REPLACE PACKAGE WB_TEST IS
  PROCEDURE TEST;
END WB_TEST;

CREATE OR REPLACE PACKAGE BODY WB_TEST IS
  GC_MSG   CONSTANT VARCHAR2(80) := 'Hello USERNAME! How are you today?';
  GC_PARAM CONSTANT VARCHAR2(10) := 'USERNAME';

  FUNCTION PARSER(IN_PARAM IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
    RETURN REPLACE(GC_MSG, GC_PARAM, IN_PARAM);
  END PARSER;

  PROCEDURE TEST IS
  BEGIN
    FOR I IN 1 .. 1000 LOOP
      DBMS_OUTPUT.PUT_LINE(PARSER(TO_CHAR(I)));
    END LOOP;
  END TEST;
BEGIN
  DBMS_OUTPUT.ENABLE(1000000);
END WB_TEST;

【问题讨论】:

    标签: plsql oracle11g query-optimization


    【解决方案1】:

    从性能的角度来看,这不太重要。 PL/SQL 编译器生成的代码在这两种情况下应该是相同的——常量几乎肯定会在它们被引用的地方被内联编译。

    选择其中一个的唯一原因是代码清晰和变量范围。如果常量确实是PARSER 函数的本地常量——如果它们不太可能对包中的其他方法有用,则应该将它们声明为函数的一部分。另一方面,如果它们可能对包中的其他方法有用,则应该将它们声明为包体的一部分。如果它们可能对包外的方法有用,则应该将它们声明为包规范的一部分。

    【讨论】:

      猜你喜欢
      • 2015-07-01
      • 2012-02-07
      • 2015-07-08
      • 2016-05-21
      • 2017-07-04
      • 2012-02-09
      • 2012-03-30
      • 1970-01-01
      • 2021-03-27
      相关资源
      最近更新 更多