`
wuhuizhong
  • 浏览: 688726 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

取代DBMS_OUTPUT的PACKAGE

阅读更多
CREATE OR REPLACE PACKAGE p
-- Adapted from PL/Vision library copyright 2002 Quest Software Inc.
IS
   c_linelen   CONSTANT PLS_INTEGER := 80;

   -- Set line length before wrap
   PROCEDURE set_linelen (len IN PLS_INTEGER := c_linelen);

   FUNCTION linelen
      RETURN PLS_INTEGER;

   PROCEDURE l (dt IN DATE, mask_in IN VARCHAR2 := NULL);

   PROCEDURE l (num IN NUMBER);

   PROCEDURE l (stg IN VARCHAR2);

   PROCEDURE l (stg IN VARCHAR2, num IN NUMBER);

   PROCEDURE l (stg IN VARCHAR2, dt IN DATE, mask_in IN VARCHAR2 := NULL);

   PROCEDURE l (bool IN BOOLEAN);

   PROCEDURE l (stg IN VARCHAR2, bool IN BOOLEAN);

   PROCEDURE l (file_in IN UTL_FILE.file_type);

   PROCEDURE l (string_in IN VARCHAR2, file_in IN UTL_FILE.file_type);

   PROCEDURE l (num1 IN NUMBER, num2 IN NUMBER);

   PROCEDURE l (str IN VARCHAR2, num1 IN NUMBER, num2 IN NUMBER);

   PROCEDURE l (bool1 IN BOOLEAN, bool2 IN BOOLEAN);

   PROCEDURE l (stg1 IN VARCHAR2, stg2 IN VARCHAR2);

   PROCEDURE l (dt1 IN DATE, dt2 IN DATE, mask_in IN VARCHAR2 := NULL);

   PROCEDURE l (num IN NUMBER, dt IN DATE, mask_in IN VARCHAR2 := NULL);

   PROCEDURE l (bool IN BOOLEAN, num IN NUMBER);

   PROCEDURE l (bool IN BOOLEAN, dt IN DATE, mask_in IN VARCHAR2 := NULL);

   PROCEDURE l (bool IN BOOLEAN, stg IN VARCHAR2);

   PROCEDURE l (xml_in IN XMLTYPE);

   PROCEDURE l (clob_in IN CLOB);
END p;
/

CREATE OR REPLACE PACKAGE BODY p
IS
   c_max_dopl_line         PLS_INTEGER    := 255;
   c_delim        CONSTANT CHAR (3)       := ' - ';
   v_linelen               PLS_INTEGER    := c_linelen;
   -- Insertion of code from PLVprs package, PL/Vision library copyright 2002 Quest Software Inc.
   c_delimiters   CONSTANT VARCHAR2 (100)
                   := '!@%^&*()-=+\|`~{[]};:''",<.>/? ' || CHR (10)
                      || CHR (9);

   TYPE wrap_aat IS TABLE OF VARCHAR2 (32767)
      INDEX BY BINARY_INTEGER;

   FUNCTION a_delimiter (
      character_in       IN   VARCHAR2
    , delimiters_in      IN   VARCHAR2
    , one_delimiter_in   IN   BOOLEAN := FALSE
   )
      RETURN BOOLEAN
   IS
      retval   BOOLEAN := character_in IS NOT NULL;
   BEGIN
      IF retval
      THEN
         IF one_delimiter_in
         THEN
            retval := delimiters_in = character_in;
         ELSE
            retval := INSTR (delimiters_in, character_in) > 0;
         END IF;
      END IF;

      RETURN retval;
   END;

   FUNCTION next_atom_loc (
      string_in       IN   VARCHAR2
    , start_loc_in    IN   NUMBER
    , direction_in    IN   NUMBER
    , delimiters_in   IN   VARCHAR2
   )
      RETURN INTEGER
   IS
      was_a_delimiter   BOOLEAN
          := a_delimiter (SUBSTR (string_in, start_loc_in, 1), delimiters_in);
      was_a_word        BOOLEAN      := NOT was_a_delimiter;
      next_char         VARCHAR2 (1);
      return_value      NUMBER       := start_loc_in + direction_in;
   BEGIN
      LOOP
         next_char := SUBSTR (string_in, return_value, 1);
         EXIT WHEN
                  /* On a delimiter, since that is always an atomic */
                  a_delimiter (next_char, delimiters_in)
               OR 
                  /* Was a delimiter, but am now in a word. */
                  (    was_a_delimiter
                   AND NOT a_delimiter (next_char, delimiters_in)
                  )
               OR
                  /* Reached end of string scanning forward. */
                  next_char IS NULL
               OR
                  /* Reached beginning of string scanning backward. */
                  return_value < 0;
         /* Shift return_value to move the next character. */
         return_value := return_value + direction_in;
      END LOOP;

      RETURN GREATEST (return_value, 0);
   END next_atom_loc;

   PROCEDURE wrap_string (
      text_in              IN       VARCHAR2
    , list_inout           IN OUT   wrap_aat
    , line_length_in       IN       INTEGER DEFAULT 255
    , keep_linebreaks_in   IN       BOOLEAN DEFAULT FALSE
    , delimiters_in        IN       VARCHAR2 DEFAULT c_delimiters
   )
   IS
      v_text             VARCHAR2 (32767);
      len_text           INTEGER;
      start_loc          INTEGER          := 1;
      end_loc            INTEGER          := 1;
      cr_loc             INTEGER;
      last_space_loc     INTEGER;
      curr_line          VARCHAR2 (32767);
      break_on_newline   BOOLEAN          := FALSE;
   BEGIN
      IF LTRIM (text_in) IS NOT NULL
      THEN
         IF NOT keep_linebreaks_in
         THEN
            v_text := REPLACE (text_in, CHR (10), ' ');
         ELSE
            v_text := text_in;
         END IF;

         len_text := LENGTH (v_text);

         LOOP
            EXIT WHEN end_loc > len_text;
            end_loc := LEAST (end_loc + line_length_in, len_text + 1);

            IF keep_linebreaks_in
            THEN
               cr_loc := INSTR (text_in, CHR (10), start_loc);
               break_on_newline := cr_loc > 0 AND end_loc > cr_loc;
            END IF;

            /* Get the next possible line of text */
            IF break_on_newline
            THEN
               list_inout (list_inout.COUNT + 1) :=
                               SUBSTR (v_text, start_loc, cr_loc - start_loc);
               --PLVstr.betwn (v_text, start_loc, cr_loc-1);
               end_loc := cr_loc + 1;
               break_on_newline := FALSE;
            ELSE
               curr_line :=
                        SUBSTR (v_text || ' ', start_loc, line_length_in + 1);
               last_space_loc :=
                  next_atom_loc (curr_line
                               , LENGTH (curr_line)
                               , -1                               -- backwards
                               , delimiters_in
                                );

               IF last_space_loc > 0
               THEN
                  end_loc := start_loc + last_space_loc;
               END IF;

               /* Add this line to the paragraph */
               list_inout (list_inout.COUNT + 1) :=
                               SUBSTR (v_text, start_loc, end_loc - start_loc);
            END IF;

            start_loc := end_loc;
         END LOOP;
      END IF;
   END wrap_string;

   -- Core p package functionality
   FUNCTION boolstg (val IN BOOLEAN)
      RETURN VARCHAR2
   IS
   BEGIN
      IF val
      THEN
         RETURN 'TRUE';
      ELSIF NOT val
      THEN
         RETURN 'FALSE';
      ELSE
         RETURN 'NULL';
      END IF;
   END boolstg;

   FUNCTION datestg (val IN DATE, MASK IN VARCHAR2 DEFAULT NULL)
      RETURN VARCHAR2
   IS
   BEGIN
      IF MASK IS NULL
      THEN
         RETURN TO_CHAR (val);
      ELSE
         RETURN TO_CHAR (val, MASK);
      END IF;
   END datestg;

   PROCEDURE put_line (str IN VARCHAR2)
   IS
      v_len     PLS_INTEGER     := linelen;
      v_len2    PLS_INTEGER;
      v_chr10   PLS_INTEGER;
      v_str     VARCHAR2 (2000);
   BEGIN
      IF LENGTH (str) > linelen
      THEN
         v_chr10 := INSTR (str, CHR (10));

         IF v_chr10 > 0 AND linelen >= v_chr10
         THEN
            v_len := v_chr10 - 1;
            v_len2 := v_chr10 + 1;
         ELSE
            v_len2 := v_len + 1;
         END IF;

         v_str := SUBSTR (str, 1, v_len);
         DBMS_OUTPUT.put_line (v_str);
         put_line (SUBSTR (str, v_len2));
      ELSE
	     v_str := str;
         DBMS_OUTPUT.put_line (str);
      END IF;
   EXCEPTION
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.ENABLE (1000000);
         DBMS_OUTPUT.put_line (v_str);
   END;

   PROCEDURE display_line (line_in IN VARCHAR2)
   IS
      l_lines   wrap_aat;
      l_row     PLS_INTEGER;
   BEGIN
      IF LENGTH (line_in) > linelen
      THEN
         wrap_string (line_in
                    , l_lines
                    , linelen - 2
                    , keep_linebreaks_in      => TRUE
                     );
         l_row := l_lines.FIRST;

         WHILE (l_row IS NOT NULL)
         LOOP
            l (l_lines (l_row));
            l_row := l_lines.NEXT (l_row);
         END LOOP;
      ELSE
         put_line (line_in);
      END IF;
   END display_line;

   -- Set line length before wrap
   PROCEDURE set_linelen (len IN PLS_INTEGER := c_linelen)
   IS
   BEGIN
      v_linelen :=
                  LEAST (c_max_dopl_line, GREATEST (NVL (len, c_linelen), 1));
   END;

   FUNCTION linelen
      RETURN PLS_INTEGER
   IS
   BEGIN
      RETURN v_linelen;
   END;

   -------------------- The p.l Procedures ----------------
   PROCEDURE l (dt IN DATE, mask_in IN VARCHAR2 := NULL)
   IS
   BEGIN
      display_line (datestg (dt, mask_in));
   END;

   PROCEDURE l (num IN NUMBER)
   IS
   BEGIN
      display_line (TO_CHAR (num));
   END;

   PROCEDURE l (stg IN VARCHAR2)
   IS
   BEGIN
      display_line (stg);
   END;

   PROCEDURE l (stg IN VARCHAR2, num IN NUMBER)
   IS
   BEGIN
      display_line (stg || c_delim || TO_CHAR (num));
   END;

   PROCEDURE l (stg IN VARCHAR2, dt IN DATE, mask_in IN VARCHAR2 := NULL)
   IS
   BEGIN
      display_line (stg || c_delim || datestg (dt, mask_in));
   END;

   PROCEDURE l (bool IN BOOLEAN)
   IS
   BEGIN
      display_line (boolstg (bool));
   END;

   PROCEDURE l (stg IN VARCHAR2, bool IN BOOLEAN)
   IS
   BEGIN
      display_line (stg || c_delim || boolstg (bool));
   END;

   PROCEDURE l (file_in IN UTL_FILE.file_type)
   IS
   BEGIN
      display_line (TO_CHAR (file_in.ID));
   END;

   PROCEDURE l (string_in IN VARCHAR2, file_in IN UTL_FILE.file_type)
   IS
   BEGIN
      l (string_in, file_in.ID);
   END;

   -- Additional overloadings
   PROCEDURE l (num1 IN NUMBER, num2 IN NUMBER)
   IS
   BEGIN
      display_line (TO_CHAR (num1) || c_delim || TO_CHAR (num2));
   END;

   PROCEDURE l (str IN VARCHAR2, num1 IN NUMBER, num2 IN NUMBER)
   IS
   BEGIN
      display_line (str || c_delim || TO_CHAR (num1) || c_delim
                    || TO_CHAR (num2)
                   );
   END;

   PROCEDURE l (bool1 IN BOOLEAN, bool2 IN BOOLEAN)
   IS
   BEGIN
      display_line (boolstg (bool1) || c_delim || boolstg (bool2));
   END;

   PROCEDURE l (stg1 IN VARCHAR2, stg2 IN VARCHAR2)
   IS
   BEGIN
      display_line (stg1 || c_delim || stg2);
   END;

   PROCEDURE l (dt1 IN DATE, dt2 IN DATE, mask_in IN VARCHAR2 := NULL)
   IS
   BEGIN
      display_line (datestg (dt1, mask_in) || c_delim
                    || datestg (dt2, mask_in)
                   );
   END;

   PROCEDURE l (num IN NUMBER, dt IN DATE, mask_in IN VARCHAR2 := NULL)
   IS
   BEGIN
      display_line (TO_CHAR (num) || c_delim || datestg (dt, mask_in));
   END;

   PROCEDURE l (bool IN BOOLEAN, num IN NUMBER)
   IS
   BEGIN
      display_line (boolstg (bool) || c_delim || TO_CHAR (num));
   END;

   PROCEDURE l (bool IN BOOLEAN, dt IN DATE, mask_in IN VARCHAR2 := NULL)
   IS
   BEGIN
      display_line (boolstg (bool) || c_delim || datestg (dt, mask_in));
   END;

   PROCEDURE l (bool IN BOOLEAN, stg IN VARCHAR2)
   IS
   BEGIN
      display_line (stg || c_delim || boolstg (bool));
   END;

   PROCEDURE l (xml_in IN XMLTYPE)
   IS
   BEGIN
      p.l (xml_in.getstringval ());
   END;

   PROCEDURE l (clob_in IN CLOB)
   IS
      buffer     VARCHAR2 (32767);
      amount     BINARY_INTEGER;
      POSITION   PLS_INTEGER      := 1;
   BEGIN
      LOOP
         amount := linelen;
         DBMS_LOB.READ (clob_in, amount, POSITION, buffer);
         -- Display the buffer contents:
         p.l (buffer);
         POSITION := POSITION + amount;
      END LOOP;
   EXCEPTION
      WHEN NO_DATA_FOUND OR VALUE_ERROR
      THEN
         NULL;
   END;
END p;
/

 

分享到:
评论

相关推荐

    DBMS_XMLDOM DBMS_XMLPARSER DBMS_XMLQUERY 文档

    Oracle数据库系统提供了强大的XML处理能力,这主要体现在其内置的几个PL/SQL包上,如DBMS_XMLDOM、DBMS_XMLPARSER和DBMS_XMLQUERY。这些包为开发者提供了处理XML文档的一整套工具,使得在数据库环境中进行XML数据的...

    使用dbms_stats包手工收集统计信息

    Oracle 数据库中使用 dbms_stats 包手动收集统计信息 在 Oracle 数据库中,dbms_stats 包提供了一种手动收集统计信息的方式,包括基于表、用户和索引的统计信息。通过使用 dbms_stats 包,我们可以手动收集统计信息...

    oracle dbms_lob

    Oracle数据库系统中,`DBMS_LOB`是一个重要的PL/SQL包,专门用于处理大型对象(LOBs,Large Object)。LOBs是Oracle提供的一种数据类型,用于存储大量数据,如文本、图像、音频或视频文件等。这个包包含了各种过程和...

    DBMS_STATS.GATHER_TABLE_STATS详解.pdf

    ### DBMS_STATS.GATHER_TABLE_STATS详解 #### 一、概述 `DBMS_STATS.GATHER_TABLE_STATS` 是 Oracle 数据库中的一个重要过程,主要用于收集表、列和索引的统计信息,这些统计信息对于优化器选择合适的执行计划至关...

    ORACLE SYS.DBMS_REGISTRY_SYS has errors

    标题中的问题“ORACLE SYS.DBMS_REGISTRY_SYS has errors”指的是在Oracle数据库系统中,系统包BODY `SYS.DBMS_REGISTRY_SYS` 出现错误,导致了一系列的PL/SQL调用失败。这种错误通常与数据库的元数据注册功能有关,...

    DBMS_SQL的使用

    dbms_output.put_line('Fetch rows is ' || d); EXIT WHEN d ; DBMS_SQL.COLUMN_VALUE(c, 1, n_tab); DBMS_SQL.COLUMN_VALUE(c, 2, n_tab1); -- 这里可以添加更多的逻辑来处理查询结果 END LOOP; dbms_...

    怎样禁用及回收java的授权dbms_java

    ### 如何禁用及回收Java的授权:dbms_java 授权管理详解 #### 一、引言 在Oracle数据库环境中,`dbms_java`包提供了一系列功能强大的工具,用于管理和控制Java应用程序的安全性。这对于那些在Oracle环境中部署了...

    dbms_obfuscation_toolkit加密解密数据

    ### DBMS_OBFUSCATION_TOOLKIT:Oracle 数据库中的加密与解密工具包 DBMS_OBFUSCATION_TOOLKIT是Oracle数据库提供的一种用于数据加密解密的强大工具包,自Oracle 8i版本开始引入。它支持多种加密算法,如DES、...

    DBMS_RANDOM.VALUE OR DBMS_RANDOM.STRING

    在Oracle数据库系统中,`DBMS_RANDOM`是一个非常实用的包,它提供了生成随机数和随机字符串的功能。这个包在各种场景下都有广泛的应用,比如在测试数据的生成、模拟随机行为或者创建伪随机数据时。我们将深入探讨`...

    PostgreSQL_DBMS_for_Windows_922_136133.exe

    支持ArcGIS10.2版本的PostgreSQL_DBMS_for_windows_922,ESRI官方原版资源。

    Oracle系统包详细使用方法

    首先,我们来看dbms_output包,它用于在PL/SQL程序中进行输入和输出。通过enable和disable过程,我们可以开启或关闭输出功能。put_line过程用于打印一行文本,而put过程则允许逐字符输出,配合new_line过程添加换行...

    dbms_lock控制串行详解

    DBMS_LOCK是Oracle数据库系统中的一个内置包,用于在用户会话之间实现锁的管理,以确保并发操作的安全性和数据一致性。这篇博文深入探讨了DBMS_LOCK的功能、使用方法以及在实际应用中的重要性。 首先,我们要理解...

    DBMS_SQL.rar_dbms_oracle

    在Oracle数据库系统中,DBMS_SQL是一个非常重要的包,它提供了动态执行SQL语句的功能,这对于开发复杂的数据库应用或者需要在运行时构建SQL语句的情况非常有用。DBMS_SQL允许我们处理那些在编译时未知的SQL语句,极...

    DBMS_c.rar_C语言实现DBMS_DBMS_c_c语言DBMS_dbms

    在这个项目中,"DBMS_c.rar" 提供了一个使用 C 语言实现的简单 DBMS 框架,名为 "DBMS_c",特别强调了用 C 语言来构建数据库系统的能力。C 语言以其高效和灵活性著称,这使得它成为编写底层系统软件的理想选择,尽管...

    DBMS_REDEFINITION

    DBMS_REDEFINITION DBMS_REDEFINITION 是 Oracle 10g 中的一个包,主要用于在线修改表的属性,可以在线重定义表,性能调优方面用处很大。 DBMS_REDEFINITION 包提供了多个函数和过程,可以用于在线重定义表,包括...

    DBMS_PROFILER使用指南

    DBMS_PROFILER是Oracle数据库提供的一种性能分析工具,主要用于PL/SQL代码的性能优化。它可以帮助开发者识别程序中的瓶颈,从而提升应用的执行效率。在本文中,我们将深入探讨DBMS_PROFILER的使用方法,包括安装、...

    DBMS.rar_dbms_dbms java_dbms_java_plus

    "DBMS.rar_dbms_dbms_java_dbms_java_plus"这个标题暗示了我们关注的焦点:使用Java实现对DBMS(特别是Oracle数据库)的操作,并且具有类似SQL*PLUS的功能。SQL*PLUS是Oracle公司提供的一个命令行工具,用于执行SQL...

    Oracle PL/SQL常用47个工具包

    9. **DBMS_OUTPUT.PUT_LINE 和 DBMS_OUTPUT.GET_LINE**: 分别用于写入和读取调试信息。 10. **DBMS_LOB**: 处理大型对象(LOBs),如BFILE、BLOB、CLOB和NCLOB。 11. **DBMS_SQL**: 动态执行SQL语句,提供解析、...

    ORACLE DBMS STATS ERROR

    然而,当出现错误“ORA-04063: package body 'SYS.DBMS_REGISTRY_SYS' has errors”时,表明`DBMS_STATS`包或与其相关的`SYS.DBMS_REGISTRY_SYS`包体存在错误,这可能对数据库性能和正常操作造成影响。 **问题症状*...

Global site tag (gtag.js) - Google Analytics