0

私はこの動作するコードを持っています。を実行するたびに、このようINSERT INTO "HR"."CITY" (CITY_ID) VALUES (0);にデータがCITY_ID1つずつ増えCT0001, CT0002 ... CT0015ます。

 CREATE TABLE "HR"."CITY" 
   (    
    "CITY_ID" VARCHAR2(40 BYTE)
   ) ;


  CREATE OR REPLACE TRIGGER "HR"."PK_MAX_TRIGGER_CITY" 
BEFORE INSERT ON CITY
FOR EACH ROW
DECLARE
    CNT NUMBER;
    PKV CITY.CITY_ID%TYPE;
    NO NUMBER;
BEGIN
    SELECT COUNT(*)INTO CNT FROM CITY;

    IF CNT=0 THEN
        PKV:='CT0001';
    ELSE
        SELECT 'CT'||LPAD(MAX(TO_NUMBER(SUBSTR(CITY_ID,3,LENGTH(CITY_ID)))+1),4,'0') INTO PKV
        FROM CITY;
    END IF;
    :NEW.CITY_ID:=PKV;
END;
/
ALTER TRIGGER "HR"."PK_MAX_TRIGGER_CITY" ENABLE;

私がやりたいのはこれE1, E2 ... E15です。

コードを次のように変更します。

    IF CNT=0 THEN
        PKV:='E1';
    ELSE
        SELECT 'E'||LPAD(MAX(TO_NUMBER(SUBSTR(CITY_ID,3,LENGTH(CITY_ID)))+1),4,'0') INTO PKV

最初はデータベースに追加E1しますが、2回目は機能しません。ブラケットの内側にあるものは、私が消化するのが難しいだけです。ここの誰かがブラケットで実際に何が起こっているのかを私に説明し、私がこの問題を解決するのを手伝ってくれることを望んでいました。

前もって感謝します。

4

2 に答える 2

1

あなたがする必要があるのはあなたのElseパーツクエリを修正することです。

SELECT 'E'||(MAX(TO_NUMBER(SUBSTR(CITY_ID,2))+1)) INTO PKV
    FROM CITY;

説明 括弧内で何が起こっているかを知りたいときはいつでも、内側の括弧から始めてください。

See the result of this query:  SELECT SUBSTR(CITY_ID,2) FROM CITY;

ここでは、後に文字列を抽出しますEE常に1番目の位置にあるため、から文字列を検索します2nd position。それで

 SELECT TO_NUMBER(SUBSTR(CITY_ID,2)) FROM CITY ;

-これは文字列を数値に変換しています。次に、テーブルCITYから最大数を見つけ、その後に1を追加します。

SELECT MAX(TO_NUMBER(SUBSTR(CITY_ID,2)))+1 FROM CITY ;

そして最後に、定数Eに結果を追加します。

SELECT 'E'||(MAX(TO_NUMBER(SUBSTR(CITY_ID,2))+1)) INTO PKV
    FROM CITY;

しかし、私の提案を取り入れて、シーケンスを作成してcity_id_seqください。これは、現在行っていることよりも優れたソリューションになります。

CREATE SEQUENCE city_id_seq
MINVALUE 1
MAXVALUE 99999999999
START WITH 1
INCREMENT BY 1
CACHE 20;


CREATE OR REPLACE TRIGGER "HR"."PK_MAX_TRIGGER_CITY" 
BEFORE INSERT ON CITY
FOR EACH ROW
DECLARE
 v_city_id PLS_INTEGER;  
BEGIN
  SELECT city_id_seq.nextval INTO v_city_id  FROM DUAL;

 :NEW.CITY_ID :='E'||v_city_id  ;

/*  if you are using oracle 11g 
:NEW.CITY_ID:='E'||city_id_seq.nextval; 
*/

END;
/
于 2012-12-07T09:48:18.563 に答える
0

括弧で囲まれたコード::

select LPAD(MAX(TO_NUMBER(SUBSTR('CT0015',3,LENGTH('CT0015')))+1),4,'0') from dual;

実際には、city_idの値を3の位置から文字列の末尾まで切り取り、それを数値データ型に変換して1を加算し、左側にゼロを埋め込みます。

したがって、この場合はo / p 0016

于 2012-12-07T09:47:07.157 に答える