【问题标题】:Is possible to get a constant value declared in a database package? (SQL or Java)是否可以获得在数据库包中声明的常量值? (SQL 或 Java)
【发布时间】:2010-11-11 01:28:28
【问题描述】:

我在 Oracle 数据库中有一些包。它们包含存储过程、函数和常量。我可以使用 Java CallableStatement 在 Java 中调用函数。此外,我可以执行一条 SQL 语句,如“select package1.function1(value1) from dual;”。但是我找不到如何在 Java 中获取包中声明的常量的值。

例如:

PACKAGE Package1 AS
    A_CONSTANT CONSTANT VARCHAR2 := 'Constant value';
END Package1;

谢谢。

【问题讨论】:

    标签: java sql oracle stored-procedures plsql


    【解决方案1】:

    您可以尝试在 CallableStatement 中使用匿名 PL/SQL 块:

    String constantValue;
    
    CallableStatement statement = connection.prepareCall("BEGIN ? := Package1.A_CONSTANT; END;");
    try {
        statement.registerOutParameter(1, Types.VARCHAR);
        statement.execute();
        constantValue = statement.getString(1);
    } finally {
        statement.close();
    }
    

    【讨论】:

    • +1,比 DCookie 中的一个更好的答案 IF 常量是在接口中声明的,而不是在包的主体中。
    【解决方案2】:

    你不能这样做。您将需要一个“getter”函数来返回在 pacakge 中定义的公共变量或常量的值:

    CREATE OR REPLACE PACKAGE Package1 IS
        A_CONSTANT CONSTANT VARCHAR2(100) := 'Constant value a';
        B_CONSTANT CONSTANT VARCHAR2(100) := 'Constant value b';
        FUNCTION get_const(p_id NUMBER) RETURN VARCHAR2;
    END Package1;
    
    CREATE OR REPLACE PACKAGE BODY Package1 IS
      FUNCTION get_const(p_id NUMBER) RETURN VARCHAR2
      IS
      BEGIN
        IF p_id = 1 THEN
          RETURN package1.a_constant;
        ELSIF p_id = 2 THEN
          RETURN package1.b_constant;
        END IF;
        RETURN NULL;
      END;
    END Package1;
    
    SQL> select package1.a_constant from dual;
    
    select package1.a_constant from dual
    
    ORA-06553: PLS-221: 'A_CONSTANT' is not a procedure or is undefined
    
    SQL> select package1.get_const(1) from dual;
    
    PACKAGE1.GET_CONST(1)
    --------------------------------------------------------------------------------
    Constant value a
    
    SQL>
    

    编辑:如果你不能修改这些包,你可以创建新的函数或包吗?如果可以的话,你可以这样解决这个问题:

    CREATE OR REPLACE FUNCTION get_const(p_id NUMBER) RETURN VARCHAR2 IS
    BEGIN
      IF p_id = 1 THEN
        RETURN package1.a_constant;
      ELSIF p_id = 2 THEN
        RETURN package1.b_constant;
      END IF;
      RETURN NULL;
    END;
    /
    
    
    SQL> select get_const(1) from dual;
    
    GET_CONST(1)
    --------------------------------------------------------------------------------
    Constant value a
    
    SQL> select get_const(2) from dual;
    
    GET_CONST(2)
    --------------------------------------------------------------------------------
    Constant value b
    
    SQL>
    

    您可以从其他 PL/SQL 对象中引用公共变量。

    作为对您上一条评论的回应,我添加了一些代码来展示如何编写一个函数来使用单个函数从包中获取不同的值。如果这不行,恐怕你就上河了。

    【讨论】:

    • 感谢您的回答。但不幸的是我不能修改这些包:(
    • 你能创建新的 pl/sql 对象吗?
    • 最好不要。如果可以的话,必须有一些程序,而不是每个常数的程序。再次感谢。
    • 您可以使用一个或多个函数来完成 - 这取决于您,但您至少需要一个函数才能通过 SQL 获取这些常量。查看我的最后一次编辑。
    【解决方案3】:
    function getConstant(p_constant string) return string is
    v_val string(100);
    begin
        execute immediate 'begin :a :='||p_constant||'; end;' using in out v_val;
        return v_val;
    end;
    

    然后你就可以了

    Select getConstant('MyPkg.myConstant') from dual;
    

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多