【问题标题】:is there anytthing way to set a variable to accept only two values in oracle SQL?有什么方法可以设置一个变量以在 oracle SQL 中只接受两个值?
【发布时间】:2021-10-18 12:26:08
【问题描述】:

这是我的代码,我想将变量 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'
);  

【问题讨论】:

  • 那些是而不是“变量”
  • 顺便说一下,电话号码不是数字。它们是字符串,按照大多数 约定,仅限于十个数字字符。如果将它们定义为 NUMBER 类型,则可能会丢失前导零,这意味着您最终得到的数字将不正确。

标签: sql oracle oracle11g


【解决方案1】:

有一种方法,称为检查约束(参见第 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,但这在这里没有意义,因为我认为没有人是“今天”出生的,那一天您将在该表中插入行。如果是这样,你会

Birthday       DATE DEFAULT TRUNC(SYSDATE),

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

最后,看起来表名有错字。真的是AccountRrequest(“Rr”请求中有2个“R”吗?)

【讨论】:

  • 我的桌子的名字是错字,你是对的,我只是想补充一些问题?有什么方法可以使用 PL/SQL 为该表拒绝的每条记录在该表上创建日志?
  • @BROX 这超出了这个问题的范围;你最好问一个新问题。
【解决方案2】:

有两种方法。

  • 首先,您可以使用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' ) )
);
  • 或者,您可以将可接受的值放在另一个表中并使用引用约束。
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)
);

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

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

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多