Возможно ли получить постоянное значение, объявленное в пакете базы данных? (SQL или Java) - PullRequest
6 голосов
/ 15 июля 2009

У меня есть несколько пакетов в базе данных Oracle. Они содержат хранимые процедуры, функции и константы. Я могу вызывать функции в Java, используя Java CallableStatement. Кроме того, я мог выполнить инструкцию SQL как «выберите package1.function1 (value1) from dual;». Но я не могу найти, как получить значение константы, объявленной в пакете в Java.

Например:

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

Спасибо.

Ответы [ 3 ]

7 голосов
/ 16 июля 2009

Вы можете попробовать использовать анонимный блок PL / SQL в CallableStatement:

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();
}
6 голосов
/ 15 июля 2009

Вы не можете сделать это. Вам понадобится функция "getter", чтобы вернуть значение публичной переменной или константы, определенной в пакете:

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.

В ответ на ваш последний комментарий я добавил некоторый код, показывающий, как можно написать функцию для получения различных значений из пакета с помощью одной функции. Если это не сработает, я боюсь, что вы дошли до пословицы.

0 голосов
/ 09 октября 2013
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...