是否可以获得在数据库包中声明的常量值? (SQL或Java)

时间:2009-07-15 15:47:33

标签: java sql oracle stored-procedures plsql

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

例如:

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

感谢。

3 个答案:

答案 0 :(得分:7)

您可以尝试在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 :(得分:6)

你不能这样做。你需要一个“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对象引用公共变量。

为了回应你的上一条评论,我添加了一些代码来展示如何编写一个函数来使用单个函数从包中获取不同的值。如果这样做不行,我担心你会成为众所周知的小溪。

答案 2 :(得分:0)

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;
相关问题