0

SQL と oracle でいくつかの質問をしようとしていますが、機能しておらず、目的の結果が返されません。誰かが私が間違っていることを教えてもらえますか?

質問は:-

請求書の期限が 30 日を超えている顧客を識別して非アクティブとマークするクエリを作成します (これは通常、サブクエリを使用して実行できます)。システムから実際に顧客レコードを削除するのではなく、顧客を非アクティブとしてマークするだけであることを忘れないでください。

これは私が試したクエリです:-

SELECT CUSTID, CUSTFIRSTNAME, CUSTSTATUS FROM CUSTOMER;

UPDATE CUSTOMER
SET CUSTSTATUS='I'
WHERE CUSTID IN
(SELECT CUSTID FROM BILLING
 WHERE (SYSDATE - DUEDATE) > 30 AND PAIDDATE IS NULL);


SELECT CUSTID, CUSTFIRSTNAME, CUSTSTATUS FROM CUSTOMER;

課金テーブルの値は次のとおりです:-

--INSERT STATEMENTS FOR TABLE BILLING


INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(1, 1, 30, DATE '2012-07-01', 30, DATE '2012-07-01' );

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(2, 2, 80, DATE '2012-06-25', 0,  );

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(3, 3, 50, DATE '2012-04-01', 0,  );

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(4, 4, 30, DATE '2012-06-11', 30, DATE '2012-06-11' );

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(5, 5, 50, DATE '2012-04-30', 0,  );

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(6, 6, 80, DATE '2012-06-01', 80, DATE '2012-05-30' );

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(7, 7, 30, DATE '2012-06-15', 0,  );

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(8, 8, 30, DATE '2012-05-30', 0,  );

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(9, 9, 80, DATE '2012-05-25', 0,  );

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(10, 10, 50, DATE '2012-04-01', 0,  );

これらはBILLINGおよびCustomerテーブルの構造です:-

SQL> desc customer;
 Name                                                                     Null?    Type
 ------------------------------------------------------------------------ -------- -----------------
 CUSTID                                                                   NOT NULL NUMBER(5)
 CUSTSTATUS                                                               NOT NULL CHAR(1)
 CUSTDELETERZN                                                                     VARCHAR2(100)
 CUSTDELETEDATE                                                                    DATE
 EMPID                                                                    NOT NULL NUMBER(5)
 CUSTFIRSTNAME                                                            NOT NULL VARCHAR2(30)
 CUSTLASTNAME                                                             NOT NULL VARCHAR2(20)
 CUSTSTARTDATE                                                                     DATE
 PACKID                                                                   NOT NULL NUMBER(2)
 CUSTPHONE                                                                         VARCHAR2(12)
 CUSTSTREET                                                                        VARCHAR2(30)
 CUSTCITY                                                                          VARCHAR2(20)
 CUSTSTATE                                                                         CHAR(2)
 CUSTZIP                                                                           NUMBER(5)
 CUSTEMAIL                                                                         VARCHAR2(30)

SQL> desc billing;
 Name                                                                     Null?    Type
 ------------------------------------------------------------------------ -------- -----------------
 CUSTID                                                                   NOT NULL NUMBER(5)
 BILLID                                                                   NOT NULL NUMBER(5)
 BILLAMT                                                                  NOT NULL NUMBER(5)
 DUEDATE                                                                  NOT NULL DATE
 PAIDAMT                                                                           NUMBER(5)
 PAIDDATE                                                                          DATE

私も書いてみました" WHERE (SYSDATE - DUEDATE) > 30 AND PAIDDATE ='');"

これもうまくいきませんでした。

編集:-

INSERT ステートメントに NULL を挿入しましたが、このエラーが発生しています:-

UPDATE CUSTOMER * 1 行目のエラー: ORA-02290: チェック制約 (D03318785.CC_CUSTOMER_F_CUSTSTATUS) 違反

誰でも助けてくれますか?

顧客テーブルの作成は次のとおりです:-

CREATE TABLE CUSTOMER(
    custid      NUMBER(5) NOT NULL
    CONSTRAINT pk_custid PRIMARY KEY,
    custstatus      CHAR(1) NOT NULL,
    custdeleterzn   VARCHAR2(100),
    custdeletedate  DATE,
    empid       NUMBER(5) NOT NULL,
    custfirstname   VARCHAR2(30) NOT NULL,
    custlastname    VARCHAR2(20) NOT NULL,
    custstartdate   DATE,
    packid      NUMBER(2) NOT NULL,
    custphone       VARCHAR2(12),
    custstreet      VARCHAR2(30),
    custcity        VARCHAR2(20),
    custstate       CHAR(2),
    custzip     NUMBER(5),
    custemail       VARCHAR2(30));
4

3 に答える 3

4

この文:

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(5, 5, 50, DATE '2012-04-30', 0,  );

は無効な SQL であり、実行されません。

列に「何も」は入れませPAIDDATE。それらを実行すると、構文エラーが発生するはずです。

それを無視して挿入をコミットした場合、無効なステートメントは実行されていないため、それらの行は挿入されていません(したがって、PAIDDATE の値が NULL の行はテーブルにありません)。そのため、あなたのアップデートはそれらを見つけていません。

このエラーは、列にORA-02290: check constraint (D03318785.CC_CUSTOMER_F_CUSTSTATUS許可されている値が制限されており、割り当てようとしている値がそれらの値ではないことを意味します。チェック制約を作成した SQL スクリプトを見つける必要があるため、どの値が許可されているかを確認してください。CUSTSTATUS'I'

チェック制約の定義を取得するには、次のステートメントを使用できます。

select dbms_metadata.get_ddl('CONSTRAINT', 'CC_CUSTOMER_F_CUSTSTATUS') 
from dual;
于 2012-06-08T09:57:47.400 に答える
0

挿入ステートメントでは、最後の値を入力しません(これまでに見たことはありません)。次のようにnull値で明示的に設定してみてください。

INSERT INTO BILLING(CUSTID,BILLID,BILLAMT,DUEDATE,PAIDAMT,PAIDDATE )
VALUES(5, 5, 50, DATE '2012-04-30', 0, NULL);
于 2012-06-08T08:24:11.557 に答える
0

これを試して:

WHERE DUEDATE < TRUNC(SYSDATE) - 30 AND PAIDDATE IS NULL

列名に関数を適用することは可能な限り避けるべきであり、IS NULL を使用して NULL 値をテストします。

于 2012-06-08T08:08:58.250 に答える