有什么方法可以将变量设置为在 oracle SQL 中只接受两个值?

is there anytthing way to set a variable to accept only two values in oracle SQL?

这是我的代码,我想将我的变量 Account_Type 设置为仅接受两个值。

CREATE TABLE AccountRrequest(
  RequestId NUMBER PRIMARY KEY,
  Branch VARCHAR2(15),
  Account_Type VARCHAR2(15),       --> Account_Type
  Title VARCHAR2(4),
  FirstName VARCHAR2(15),
  LastName VARCHAR2(15),
  Birthday DATE DEFAULT (MM-DD-YYYY),
  WorkPhone NUMBER(10),
  HomePhone NUMBER(10),
  Address VARCHAR2(30),
  State VARCHAR2(15),
  Zip NUMBER(10),
  Email VARCHAR2(30),
  Status VARCHAR2(10) DEFAULT 'Entered'
);  

有一种方法,称为检查约束(参见第5-7行)(它被设置为接受type1type2; 不允许使用其他值):

SQL> CREATE TABLE AccountRrequest
  2  (
  3     RequestId      NUMBER PRIMARY KEY,
  4     Branch         VARCHAR2 (15),
  5     Account_Type   VARCHAR2 (15)
  6                      CONSTRAINT ch_acctype CHECK
  7                         (account_type IN ('type1', 'type2')),
  8     Title          VARCHAR2 (4),
  9     FirstName      VARCHAR2 (15),
 10     LastName       VARCHAR2 (15),
 11     Birthday       DATE,                           -- DEFAULT (MM - DD - YYYY),
 12     WorkPhone      NUMBER (10),
 13     HomePhone      NUMBER (10),
 14     Address        VARCHAR2 (30),
 15     State          VARCHAR2 (15),
 16     Zip            NUMBER (10),
 17     Email          VARCHAR2 (30),
 18     Status         VARCHAR2 (10) DEFAULT 'Entered'
 19  );

Table created.
    
SQL> insert into accountrrequest (requestid, account_type) values (1, 'type3');
insert into accountrrequest (requestid, account_type) values (1, 'type3')
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CH_ACCTYPE) violated


SQL> insert into accountrrequest (requestid, account_type) values (1, 'type1');

1 row created.

SQL>

此外,默认的“格式”无法按照您的方式进行设置,因此我在第 11 行对其进行了注释。默认值可以是例如sysdate,但这在这里没有意义,因为我认为没有人是“今天”出生的,那一天您将向 table 中插入行。如果是这样,你会

Birthday       DATE DEFAULT TRUNC(SYSDATE),

此外,在这种情况下,它不是一个接受某些值的“变量”——它是一个

最后,table 名字好像打错了。真的吗AccountRrequest(在“Rr”请求中有 2 个“R”?)

有两种方法。

  • 首先,您可以使用 CHECK 约束来限制值;
CREATE TABLE AccountRequest(
  RequestId    NUMBER PRIMARY KEY,
  Branch       VARCHAR2(15),
  Account_Type VARCHAR2(15),
  Title        VARCHAR2(4),
  FirstName    VARCHAR2(15),
  LastName     VARCHAR2(15),
  Birthday     DATE,
  WorkPhone    VARCHAR2(10),
  HomePhone    VARCHAR2(10),
  Address      VARCHAR2(30),
  State        VARCHAR2(15),
  Zip          NUMBER(10),
  Email        VARCHAR2(30),
  Status       VARCHAR2(10) DEFAULT 'Entered',
  CONSTRAINT AccountRequest__Acount_Type__CHK
    CHECK ( Account_Type IN ( 'value1', 'value2' ) )
);
  • 或者,您可以将 acceptable 值放在另一个 table 中并使用引用约束。
CREATE TABLE account_types (
  account_type VARCHAR2(15),
  CONSTRAINT account_types__account_type__pk PRIMARY KEY (account_type)
);

INSERT INTO Account_Types ( Account_Type ) VALUES ( 'value1' );
INSERT INTO Account_Types ( Account_Type ) VALUES ( 'value2' );

CREATE TABLE AccountRequest(
  RequestId    NUMBER PRIMARY KEY,
  Branch       VARCHAR2(15),
  Account_Type VARCHAR2(15) NOT NULL,
  Title        VARCHAR2(4),
  FirstName    VARCHAR2(15),
  LastName     VARCHAR2(15),
  Birthday     DATE,
  WorkPhone    VARCHAR2(10),
  HomePhone    VARCHAR2(10),
  Address      VARCHAR2(30),
  State        VARCHAR2(15),
  Zip          NUMBER(10),
  Email        VARCHAR2(30),
  Status       VARCHAR2(10) DEFAULT 'Entered',
  CONSTRAINT AccountRequest__Acount_Type__FK
    FOREIGN KEY ( Account_Type ) REFERENCES Account_Types (Account_Type)
);

注意:您可能不想对 phone 数字使用 NUMBER 数据类型;尽管它们由数字字符组成,但它们通常以 0 开头,而 NUMBER 列不会存储它。

注意:DATE 是一种二进制数据类型,ALWAYS 具有年、月、日、小时、分钟和秒组件,并且NOT 是否存储任何格式。您不能使用 DEFAULT 设置格式。