如何将Oracle apex项目限制为数字/字符值

时间:2015-04-21 05:52:51

标签: sql oracle check-constraints

我有一个 TEXT 项目字段 - 订单号,用户可以在其中输入详细信息。

  • 当用户输入以1开头的订单号时,它应该只允许数值。

  • 当用户输入以L开头的订单号时,它应接受数字和字母。

有人可以帮助我在Oracle Apex中如何做到这一点吗?

2 个答案:

答案 0 :(得分:0)

您可以在列上使用 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'。 效果很好!

答案 1 :(得分:0)

对于检查提交APEX页的时间并在错误的字段上显示错误消息的解决方案,您可以为该字段创建“验证”,例如,此处验证电子邮件地址(使用不正确的REGEX-但相当正确)。它使用一个返回布尔值的PL / SQL函数。

功能:

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

APEX申请:

APEX example