Как ограничить элемент вершины Oracle числовыми/символьными значениями

У меня есть поле элемента ТЕКСТ - номер заказа, где пользователь может ввести свои данные.

  • Когда пользователь вводит номер заказа, начинающийся с 1, он должен разрешать только числовые значения.

  • Когда пользователь вводит номер заказа, начинающийся с буквы L, он должен принимать как цифры, так и буквы.

Как я могу сделать это в Oracle Apex?


person Gayathri    schedule 21.04.2015    source источник


Ответы (2)


Вы можете использовать ограничение CHECK для столбца, чтобы разрешить:

  • значения только с цифрами, начинающиеся с «1»
  • значения, как если бы они начинались с 'L'

Проверить ограничение будет:

CHECK
(
  CASE
  WHEN SUBSTR(text,1,1) ='1' THEN
    REGEXP_substr(text, '^[[:digit:]]+$')
  WHEN SUBSTR(text,1,1) ='L' THEN
    text
  END IS NOT NULL)

Давайте посмотрим на тестовый пример:

Настройка

SQL> CREATE TABLE t(text VARCHAR2(30));

Table created.

SQL>
SQL> ALTER TABLE t ADD CONSTRAINT t_chk CHECK
  2  (
  3    CASE
  4    WHEN SUBSTR(text,1,1) ='1' THEN
  5      REGEXP_substr(text, '^[[:digit:]]+$')
  6    WHEN SUBSTR(text,1,1) ='L' THEN
  7      text
  8    END IS NOT NULL);

Table altered.

SQL>

Тест

SQL> INSERT INTO t VALUES('123');

1 row created.

SQL> INSERT INTO t VALUES('1a');
INSERT INTO t VALUES('1a')
*
ERROR at line 1:
ORA-02290: check constraint (LALIT.T_CHK) violated


SQL> INSERT INTO t VALUES('L12A');

1 row created.

SQL> INSERT INTO t VALUES('A12A');
INSERT INTO t VALUES('A12A')
*
ERROR at line 1:
ORA-02290: check constraint (LALIT.T_CHK) violated


SQL> SELECT * FROM t;

TEXT
------------------------------
123
L12A

SQL>

Таким образом, он разрешил только значения '123' и 'L12A'. И он не разрешал значения '1a' и 'A12A'. Работает отлично!

person Lalit Kumar B    schedule 21.04.2015
comment
Спасибо большое :) Логика сработала :) - person Gayathri; 21.04.2015
comment
@Gayathri Пожалуйста, отметьте это как ответ. Это помогло бы другим. Здесь, в Stack Overflow, если вам нравится ответ, вы также можете проголосовать за него. Добро пожаловать в Stack Overflow :-) - person Lalit Kumar B; 21.04.2015
comment
Конечно, я отмечу это как ответ. Не могли бы вы также помочь мне со следующим вопросом: case-in-oracle-apex?noredirect=1#comment47627546_29743964" title="как скрыть элемент текстового поля на основе истинных или ложных случаев в oracle apex"> stackoverflow.com/questions/29743964/ - person Gayathri; 21.04.2015
comment
Я видел этот вопрос, однако я не работаю с отчетами. Так что, боюсь, я не могу помочь вам с этим. - person Lalit Kumar B; 21.04.2015

Для решения, которое проверяет, когда отправляется страница APEX, и выдает хорошее сообщение об ошибке в ошибочном поле, вы можете создать «Проверку» для поля, пример здесь проверяет адрес электронной почты (с неправильным REGEX, но довольно правильно ). Он использует функцию PL/SQL, возвращающую логическое значение.

Функция:

begin
  return regexp_count(:P811_EMAIL_ADDRESS, '^[-_A-Z0-9.]+@([A-Z]+\.)?[A-Z]+\.COM$') >= 1;
end;

Приложение АПЕКС:

Пример APEX

person Mark Stewart    schedule 19.07.2019