作ってみたものの、ストプロの中で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);
シーケンサーっぽく使おうと思ったけどダメぽ。。