Oracleでランダムシーケンサーの作成 続編

  • 投稿日:
  • カテゴリ:

作ってみたものの、ストプロの中でINSERT/UPDATE等を発行している場合はそのストプロはSELECT文の中で呼び出せないという制約があるらしいです。

重複チェック用のテーブル作成 

CREATE TABLE RANDOM_SEQUENCE (
    ID VARCHAR2(64),
    RNDSEQ VARCHAR2(128),
    CONSTRAINT PK_RANDOM_SEQUENCE PRIMARY KEY (ID, RNDSEQ)
);

ストプロ作成 

CREATE OR REPLACE FUNCTION rndseq_next (id2 varchar2, opt char, len NUMBER)
    RETURN VARCHAR2 PARALLEL_ENABLE
    IS
        cnt NUMBER := 0;
        rndseq2 VARCHAR2(128) := NULL;
    BEGIN
        LOOP
            rndseq2 := random_string(opt, len);
            SELECT COUNT(*) INTO cnt FROM RANDOM_SEQUENCE WHERE ID = id2 AND RNDSEQ = rndseq2;
            IF cnt = 0 THEN
                EXIT;
            END IF;
        END LOOP;
        INSERT INTO RANDOM_SEQUENCE(ID, RNDSEQ) VALUES (id2, rndseq2);
        COMMIT;
        RETURN rndseq2;
    EXCEPTION
        WHEN OTHERS THEN
            RETURN NULL;
    END rndseq_next;
/

後はこんな感じで呼び出します。

rndseq_next('myid1', 'z', 10);

シーケンサーっぽく使おうと思ったけどダメぽ。。

新しいサイトもよろしくお願いします!