Возможно объявить постоянную величину в пакете базы данных? (SQL или Java)

В наши дни строковый метод repeat реализован почти повсеместно. (Это не в Internet Explorer .) Поэтому, если вам не требуется поддержка старых браузеров, вы можете просто написать:

"a".repeat(10)

До repeat мы использовали этот хак:

Array(11).join("a") // create string with 10 a's: "aaaaaaaaaa"

(Обратите внимание, что массив длины 11 дает вам только 10 «а» с, поскольку Array.join помещает аргумент между элементами массива.)

Саймон также указывает на то, что согласно этого jsperf , кажется, что в Safari и Chrome быстрее (но не в Firefox) повторять символ несколько раз, просто добавляя его с помощью цикла for (хотя и немного менее лаконично).

6
задан Jon 15 July 2009 в 16:10
поделиться

2 ответа

Вы можете попробовать использовать анонимный блок 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();
}
7
ответ дан 8 December 2019 в 18:40
поделиться

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

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.

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

6
ответ дан 8 December 2019 в 18:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: