Advertisement
xsbr

Oracle replacement FUNCTION to ids table

Apr 27th, 2011
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 1.91 KB | None | 0 0
  1. CREATE OR REPLACE FUNCTION ZBX_GETNEXTID( nodeid NUMBER, tablename VARCHAR2, fieldname VARCHAR2, idmin NUMBER, idmax NUMBER, inc NUMBER )
  2. RETURN NUMBER IS
  3.         sqlquery VARCHAR2(1000);
  4.         sequencename VARCHAR2(128);
  5.         sequenceexists NUMBER;
  6.         nextid NUMBER(20);
  7.         lastid NUMBER(20);
  8. BEGIN
  9.         --
  10.         -- sequencename construct - IDSSEQ_NODEID_TABLENAME_FIELDNAME
  11.         --
  12.         SELECT UPPER('idsseq_'||CAST(nodeid AS VARCHAR2(10))||'_'||tablename||'_'||fieldname) INTO sequencename
  13.                 FROM dual;
  14.  
  15.         -- checks if sequence exists
  16.         sqlquery := 'SELECT COUNT(1) FROM USER_SEQUENCES WHERE SEQUENCE_NAME = '''||sequencename||'''';
  17.         EXECUTE IMMEDIATE sqlquery INTO sequenceexists;
  18.  
  19.         -- if not, create it
  20.         IF sequenceexists = 0 THEN
  21.                 -- get last id looking into table
  22.                 sqlquery := 'SELECT NVL(MAX('||fieldname||'),'||CAST(idmin AS VARCHAR2)||') FROM '||tablename||' WHERE '||fieldname||' BETWEEN '||CAST(idmin AS VARCHAR2)||' AND '||CAST(idmax AS VARCHAR2);
  23.                 EXECUTE IMMEDIATE sqlquery INTO lastid;
  24.                
  25.                 -- create the new sequence
  26.                 sqlquery := 'CREATE SEQUENCE '||sequencename||' START WITH '||CAST(lastid AS VARCHAR2)||' INCREMENT BY '||CAST(inc AS VARCHAR2)||' NOMAXVALUE';
  27.                 EXECUTE IMMEDIATE sqlquery;
  28.         END IF;
  29.        
  30.         -- retrieve the nextid from sequence
  31.         sqlquery := 'SELECT LEAST(GREATEST(NVL('||sequencename||'.nextval,0),'||CAST(idmin AS VARCHAR2)||'),'||CAST(idmax AS VARCHAR2)||') FROM dual';
  32.         EXECUTE IMMEDIATE sqlquery INTO nextid;
  33.        
  34. --      dbms_output.put_line( 'sequenceexists = '||CAST(sequenceexists AS CHAR) );
  35. --      dbms_output.put_line( 'sequencename = '||sequencename );
  36. --      dbms_output.put_line( 'nextid = '||CAST(nextid AS VARCHAR2) );
  37.        
  38.         RETURN nextid;
  39. END;
  40. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement