Advertisement
xsbr

Oracle replacement PROCEDURE to ids table

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