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