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

📄 intab.sp

📁 OReilly Oracle PL SQL Programming第4版源代码
💻 SP
字号:
CREATE OR REPLACE PROCEDURE intab (
   table_in           IN   VARCHAR2
 , string_length_in   IN   INTEGER := 20
 , where_in           IN   VARCHAR2 := NULL
 , date_format_in     IN   VARCHAR2 := 'MM/DD/YY HHMISS'
)
IS
   CURSOR col_cur (owner_in IN VARCHAR2, table_in IN VARCHAR2)
   IS
      SELECT column_name, data_type, data_length, data_precision, data_scale
        FROM all_tab_columns
       WHERE owner = owner_in AND table_name = table_in;

   TYPE string_tab IS TABLE OF VARCHAR2 (100)
      INDEX BY BINARY_INTEGER;

   TYPE integer_tab IS TABLE OF PLS_INTEGER
      INDEX BY BINARY_INTEGER;

   colname        string_tab;
   coltype        string_tab;
   collen         integer_tab;
   owner_nm       VARCHAR2 (100)  := USER;
   table_nm       VARCHAR2 (100)  := UPPER (table_in);
   where_clause   VARCHAR2 (1000) := LTRIM (UPPER (where_in));
   cur            INTEGER         := DBMS_SQL.open_cursor;
   fdbk           INTEGER         := 0;
   string_value   VARCHAR2 (2000);
   number_value   NUMBER;
   date_value     DATE;
   dot_loc        INTEGER;
   col_count      INTEGER         := 0;
   col_border     VARCHAR2 (2000);
   col_header     VARCHAR2 (2000);
   col_line       VARCHAR2 (2000);
   col_list       VARCHAR2 (2000);
   line_length    INTEGER         := 0;
   v_length       INTEGER;

   FUNCTION is_string (row_in IN INTEGER)
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN (coltype (row_in) IN ('CHAR', 'VARCHAR2'));
   END;

   FUNCTION is_number (row_in IN INTEGER)
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN (coltype (row_in) IN ('FLOAT', 'INTEGER', 'NUMBER'));
   END;

   FUNCTION is_date (row_in IN INTEGER)
      RETURN BOOLEAN
   IS
   BEGIN
      RETURN (coltype (row_in) = 'DATE');
   END;

   FUNCTION centered_string (string_in IN VARCHAR2, length_in IN INTEGER)
      RETURN VARCHAR2
   IS
      len_string   INTEGER := LENGTH (string_in);
   BEGIN
      IF len_string IS NULL OR length_in <= 0
      THEN
         RETURN NULL;
      ELSE
         RETURN    RPAD ('_', (length_in - len_string) / 2 - 1)
                || LTRIM (RTRIM (string_in));
      END IF;
   END;

   PROCEDURE initialize
   IS
   BEGIN
      dot_loc := INSTR (table_nm, '.');

      IF dot_loc > 0
      THEN
         owner_nm := SUBSTR (table_nm, 1, dot_loc - 1);
         table_nm := SUBSTR (table_nm, dot_loc + 1);
      END IF;
   END initialize;

   PROCEDURE load_column_information
   IS
   BEGIN
      FOR col_rec IN col_cur (owner_nm, table_nm)
      LOOP
         col_list := col_list || ', ' || col_rec.column_name;
         /* Save datatype and length for define column calls. */
         col_count := col_count + 1;
         colname (col_count) := col_rec.column_name;
         coltype (col_count) := col_rec.data_type;

         IF is_string (col_count)
         THEN
            v_length :=
               GREATEST (LEAST (col_rec.data_length, string_length_in)
                       , LENGTH (col_rec.column_name)
                        );
         ELSIF is_date (col_count)
         THEN
            v_length :=
               GREATEST (LENGTH (date_format_in)
                       , LENGTH (col_rec.column_name)
                        );
         ELSIF is_number (col_count)
         THEN
            v_length :=
               GREATEST (NVL (col_rec.data_precision, 38)
                       , LENGTH (col_rec.column_name)
                        );
         END IF;

         collen (col_count) := v_length;
         line_length := line_length + v_length + 1;
         /* Construct column header line. */
         col_header :=
                     col_header || ' ' || RPAD (col_rec.column_name, v_length);
      END LOOP;

      col_list := RTRIM (LTRIM (col_list, ', '), ', ');
      col_header := LTRIM (col_header);
      col_border := RPAD ('-', line_length, '-');
   END load_column_information;

   PROCEDURE construct_and_parse_query
   IS
   BEGIN
      IF where_clause IS NOT NULL
      THEN
         IF (    where_clause NOT LIKE 'GROUP BY%'
             AND where_clause NOT LIKE 'ORDER BY%'
            )
         THEN
            where_clause := 'WHERE ' || LTRIM (where_clause, 'WHERE');
         END IF;
      END IF;

      DBMS_SQL.parse (cur
                    ,    'SELECT '
                      || col_list
                      || '  FROM '
                      || table_in
                      || ' '
                      || where_clause
                    , DBMS_SQL.native
                     );
   END construct_and_parse_query;

   PROCEDURE define_columns_and_execute
   IS
   BEGIN
      FOR col_ind IN 1 .. col_count
      LOOP
         IF is_string (col_ind)
         THEN
            DBMS_SQL.define_column (cur
                                  , col_ind
                                  , string_value
                                  , collen (col_ind)
                                   );
         ELSIF is_number (col_ind)
         THEN
            DBMS_SQL.define_column (cur, col_ind, number_value);
         ELSIF is_date (col_ind)
         THEN
            DBMS_SQL.define_column (cur, col_ind, date_value);
         END IF;
      END LOOP;

      fdbk := DBMS_SQL.EXECUTE (cur);
   END define_columns_and_execute;

   PROCEDURE build_and_display_output
   IS
   BEGIN
      LOOP
         fdbk := DBMS_SQL.fetch_rows (cur);
         EXIT WHEN fdbk = 0;

         IF DBMS_SQL.last_row_count = 1
         THEN
            p.l (col_border);
            p.l (centered_string ('Contents of ' || table_in, line_length));
            p.l (col_border);
            p.l (col_header);
            p.l (col_border);
         END IF;

         col_line := NULL;

         FOR col_ind IN 1 .. col_count
         LOOP
            IF is_string (col_ind)
            THEN
               DBMS_SQL.column_value (cur, col_ind, string_value);
            ELSIF is_number (col_ind)
            THEN
               DBMS_SQL.column_value (cur, col_ind, number_value);
               string_value := TO_CHAR (number_value);
            ELSIF is_date (col_ind)
            THEN
               DBMS_SQL.column_value (cur, col_ind, date_value);
               string_value := TO_CHAR (date_value, date_format_in);
            END IF;

            col_line :=
                  col_line
               || ' '
               || RPAD (NVL (string_value, ' '), collen (col_ind));
         END LOOP;

         p.l (col_line);
      END LOOP;
   END build_and_display_output;
BEGIN
   initialize;
   --
   load_column_information;
   construct_and_parse_query;
   define_columns_and_execute;
   build_and_display_output;
   --
   DBMS_SQL.close_cursor (cur);
EXCEPTION
   WHEN OTHERS
   THEN
      p.l ('Error displaying contents of ' || table_in);
      p.l (DBMS_UTILITY.FORMAT_ERROR_STACK);
      DBMS_SQL.close_cursor (cur);
END;
/

⌨️ 快捷键说明

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