You can use this function:
create or replace FUNCTION SEQGEN(vinp in varchar2, iSeq in INTEGER) RETURN VARCHAR2 is vResult VARCHAR2(32); iBas INTEGER; iRem INTEGER; iQuo INTEGER; lLen CONSTANT INTEGER := 2; BEGIN iBas := length(vInp); iQuo := iSeq; WHILE iQuo > 0 LOOP iRem := iQuo mod iBas; --dbms_output.put_line('Now we divide ' || lpad(iQuo,lLen,'0') || ' by ' || lpad(iBas,lLen,'0') || ', yielding a quotient of ' || lpad( TRUNC(iQuo / iBas) ,lLen,'0') || ' and a remainder of ' || lpad(iRem,lLen,'0') || ' giving the char: ' || substr(vInp, iRem, 1)); iQuo := TRUNC(iQuo / iBas); If iRem < 1 Then iRem := iBas; iQuo := iQuo - 1; End If; vResult := substr(vInp, iRem, 1) || vResult; END LOOP; RETURN vResult; END SEQGEN;
Try the function:
SELECT * FROM ( SELECT seqgen('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',rownum + 47989 --start value ) Output, level evt FROM dual CONNECT BY level < 1679618) --stop value WHERE mod(evt,50000) = 0 OR output in ('0001','0002','0009','000A','000Z', '0010','0011','001A','ZZZZ')
Note that if you change the line, you must also change the start and stop value.
Read more about systems with numbers here: Converting System Numbers - Explanation
wittrup
source share