⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 str2list.pkg

📁 OReilly Oracle PL SQL Programming第4版源代码
💻 PKG
字号:
CREATE OR REPLACE PACKAGE str2list
-- Copyright 2000 Steven Feuerstein 
--                steven@stevenfeuerstein.com
IS
   PROCEDURE parse (
      str             IN   VARCHAR2,
      delim           IN   VARCHAR2,
      pkg             IN   VARCHAR2,
      coll            IN   VARCHAR2,
      datatype        IN   VARCHAR2 := 'VARCHAR2(32767)',
      extend_needed        BOOLEAN := FALSE
   );

   PROCEDURE parse (
      str          IN   VARCHAR2,
      delim        IN   VARCHAR2,
      pkg          IN   VARCHAR2,
      appendproc   IN   VARCHAR2,
                             /* pkg.appendproc (oneval); */
      deleteproc   IN   VARCHAR2,
          /* pkg.deleteproc (onerow); or pkg.deleteproc; */
      datatype     IN   VARCHAR2
   );

   PROCEDURE showlist (pkg IN VARCHAR2, coll IN VARCHAR2);

   PROCEDURE showlist (
      pkg            IN   VARCHAR2,
      firstrowproc   IN   VARCHAR2,
      nextrowproc    IN   VARCHAR2,
      getvalfunc     IN   VARCHAR2,
      showproc       IN   VARCHAR2 := 'pl',
      datatype       IN   VARCHAR2 := 'VARCHAR2(32767)'
   );
   
   PROCEDURE trc;
   PROCEDURE notrc;
   FUNCTION tracing RETURN BOOLEAN;
END str2list;
/ 
CREATE OR REPLACE PACKAGE BODY str2list
IS
   g_trc BOOLEAN := FALSE;

   PROCEDURE trc
   IS
   BEGIN
      g_trc := TRUE;
   END;

   PROCEDURE notrc
   IS
   BEGIN
      g_trc := FALSE;
   END;

   FUNCTION tracing RETURN BOOLEAN
   IS
   BEGIN
      RETURN g_trc;
   END;
   
   PROCEDURE disperr (str IN VARCHAR2)
   IS
   BEGIN
      do.pl /* do.pkg */ ('Compilation/Execution Error:');
      do.pl /* do.pkg */ (SQLERRM);
      do.pl /* do.pkg */ ('In:');
      do.pl /* do.pkg */ (str);
   END;

   PROCEDURE parse (
      str             IN   VARCHAR2,
      delim           IN   VARCHAR2,
      pkg             IN   VARCHAR2,
      coll            IN   VARCHAR2,
      datatype        IN   VARCHAR2 := 'VARCHAR2(32767)',
      extend_needed        BOOLEAN := FALSE
   )
   IS
      collname        VARCHAR2 (100)   := pkg || '.' || coll;
      dynblock        VARCHAR2 (32767);
      extstring       VARCHAR2 (100);
      nextrowstring   VARCHAR2 (100);
   BEGIN
      IF extend_needed
      THEN
         -- Nested table or VARRAY
         extstring := collname || '.EXTEND;';
         nextrowstring := collname || '.LAST';
      ELSE
         -- Index-by collection
         extstring := NULL;
         nextrowstring :=
                       'NVL (' || collname || '.LAST, 0) + 1';
      END IF;

      dynblock :=
         'DECLARE 
            v_loc PLS_INTEGER;
            v_startloc PLS_INTEGER := 1;
            v_item ' ||
            datatype ||
            ';
          BEGIN ' ||
            collname ||
            '.DELETE;
             IF :str IS NOT NULL 
             THEN 
                LOOP
                   v_loc := INSTR (:str, :delim, v_startloc);
                   IF v_loc = v_startloc
                   THEN
                      v_item := NULL;
                   ELSIF v_loc = 0
                   THEN
                      v_item := SUBSTR (:str, v_startloc);
                   ELSE
                      v_item := SUBSTR (:str, v_startloc, v_loc - v_startloc);
                   END IF;' ||
                   extstring || collname || '(' || nextrowstring || ') 
                      := v_item;
                      
                   IF v_loc = 0
                   THEN
                      EXIT;
                   ELSE 
                      v_startloc := v_loc + 1;
                   END IF;
                END LOOP;
             END IF;
          END;';
      
	  IF tracing THEN do.pl /* do.pkg */ ('STR2LIST: DIRECT ASSIGNMENT:'); do.pl /* do.pkg */ (dynblock); END IF;
	  EXECUTE IMMEDIATE dynblock USING str, delim;
   EXCEPTION
      WHEN OTHERS
      THEN
         disperr (dynblock); raise; -- TVP 5/2001
   END;

   PROCEDURE parse (
      str          IN   VARCHAR2,
      delim        IN   VARCHAR2,
      pkg          IN   VARCHAR2,
      appendproc   IN   VARCHAR2,
      deleteproc   IN   VARCHAR2,
      datatype     IN   VARCHAR2
   )
   IS
      dynblock   VARCHAR2 (32767);
   BEGIN
      dynblock :=
         'DECLARE 
            v_loc PLS_INTEGER;
            v_startloc PLS_INTEGER := 1;
            v_item ' ||
            datatype ||
            ';
          BEGIN 
             ' ||
            pkg ||
            '.' ||
            deleteproc ||
            ';
             IF :str IS NOT NULL 
             THEN 
                LOOP
                   v_loc := INSTR (:str, :delim, v_startloc);
                   IF v_loc = v_startloc
                   THEN
                      v_item := NULL;
                   ELSIF v_loc = 0
                   THEN
                      v_item := SUBSTR (:str, v_startloc);
                   ELSE
                      v_item := SUBSTR (:str, v_startloc, v_loc - v_startloc);
                   END IF;' ||
            pkg ||
            '.' ||
            appendproc ||
            '( v_item);
                   IF v_loc = 0
                   THEN
                      EXIT;
                   ELSE 
                      v_startloc := v_loc + 1;
                   END IF;
                END LOOP;
             END IF;
          END;';
      
	  IF tracing THEN do.pl /* do.pkg */ ('STR2LIST: API ASSIGNMENT:'); do.pl /* do.pkg */ (dynblock); END IF;
	  EXECUTE IMMEDIATE dynblock USING str, delim;
   EXCEPTION
      WHEN OTHERS
      THEN
         disperr (dynblock); raise;
   END;

   PROCEDURE showlist (pkg IN VARCHAR2, coll IN VARCHAR2)
   IS
      collname   VARCHAR2 (100)   := pkg || '.' || coll;
      dynblock   VARCHAR2 (32767);
   BEGIN
      dynblock :=
         'DECLARE 
            indx PLS_INTEGER := ' ||
            collname ||
            '.FIRST;
            v_startloc PLS_INTEGER := 1;
            v_item VARCHAR2(32767);
          BEGIN 
             LOOP
                EXIT WHEN indx IS NULL;
                do.pl /* do.pkg */ (' ||
            collname ||
            '(indx));
                indx := ' ||
            collname ||
            '.NEXT (indx);
             END LOOP;
          END;';
      
	  IF tracing THEN do.pl /* do.pkg */ ('STR2LIST: SHOW LIST - DIRECT:'); do.pl /* do.pkg */ (dynblock); END IF;
      EXECUTE IMMEDIATE dynblock;
   EXCEPTION
      WHEN OTHERS
      THEN
         disperr (dynblock);
   END;

   PROCEDURE showlist (
      pkg            IN   VARCHAR2,
      firstrowproc   IN   VARCHAR2,
      nextrowproc    IN   VARCHAR2,
      getvalfunc     IN   VARCHAR2,
      showproc       IN   VARCHAR2 := 'pl',
      datatype       IN   VARCHAR2 := 'VARCHAR2(32767)'
   )
   IS
      dynblock   VARCHAR2 (32767);
   BEGIN
      dynblock :=
         'DECLARE 
            indx PLS_INTEGER := ' || pkg ||
            '.' ||
            firstrowproc ||
            ';
            v_startloc PLS_INTEGER := 1;
            v_item ' ||
            datatype ||
            ';
          BEGIN 
             LOOP
                EXIT WHEN indx IS NULL;' ||
            showproc ||
            ' (' ||
            pkg ||
            '.' ||
            getvalfunc ||
            '(indx));
                indx := ' ||
            pkg ||
            '.' ||
            nextrowproc ||
            '(indx);
             END LOOP;
          END;';
      
	  IF tracing THEN do.pl /* do.pkg */ ('STR2LIST: SHOW LIST - API:');do.pl /* do.pkg */ (dynblock); END IF;
	  EXECUTE IMMEDIATE dynblock;
   EXCEPTION
      WHEN OTHERS
      THEN
         disperr (dynblock);
   END;
END str2list;
/



/*======================================================================
| Supplement to the third edition of Oracle PL/SQL Programming by Steven
| Feuerstein with Bill Pribyl, Copyright (c) 1997-2002 O'Reilly &
| Associates, Inc. To submit corrections or find more code samples visit
| http://www.oreilly.com/catalog/oraclep3/
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -