純sql實現獲取insert數據的最佳方案

--文件genins.sql

-- #############################################################################################
--
-- %Purpose:    Generate INSERT statements for existing data in a table
--
-- #############################################################################################
--
PROMPT ==========================================================================
PROMPT Generate INSERT statements for existing data in a table
PROMPT ==========================================================================
PROMPT
PROMPT You'll be prompted for the following:
PROMPT - table_name: The name of the table to generate statements (case insensitive)
PROMPT - col1:       The name of a column you want to fill with fixed data (case insensitive)
PROMPT .             - [ENTER]: do not use this functionality
PROMPT - col1_value: The value for the column above (case sensitive)
PROMPT .             - Enter String Values within two single quotes: ''example''
PROMPT .             - [ENTER]: do not use this functionality
PROMPT - col2:       The name of a column you want to fill with fixed data (case insensitive)
PROMPT .             - [ENTER]: do not use this functionality
PROMPT - col2_value: The value for the column above (case sensitive)
PROMPT .             - Enter String Values within two single quotes: ''example''
PROMPT .             - [ENTER]: do not use this functionality
PROMPT

set feedback off
set trimspool on
set linesize 255

CREATE OR REPLACE PROCEDURE genins(p_table IN varchar
                                  ,p_default_col1 VARCHAR default null
                                  ,p_default_col1_value VARCHAR default null
                                  ,p_default_col2 VARCHAR default null
                                  ,p_default_col2_value VARCHAR default null)
IS
  --
  l_column_list   VARCHAR(2000);
  l_value_list    VARCHAR(2000);
  l_query         VARCHAR(2000);
  l_cursor        INTEGER;
  ignore NUMBER;
  --
  FUNCTION get_cols(p_table VARCHAR)
  RETURN VARCHAR
  IS
    l_cols VARCHAR(2000);
    CURSOR l_col_cur(c_table VARCHAR) IS
            SELECT column_name
            FROM   user_tab_columns
            WHERE  table_name = upper(c_table)
            ORDER BY column_id;
  BEGIN
    l_cols := null;
    FOR rec IN l_col_cur(p_table)
    LOOP
      l_cols := l_cols || rec.column_name || ',';
    END LOOP;
    RETURN substr(l_cols,1,length(l_cols)-1);
  END;
  --
  FUNCTION get_query(p_table IN VARCHAR
                    ,p_default_col1 VARCHAR
                    ,p_default_col1_value VARCHAR
                    ,p_default_col2 VARCHAR
                    ,p_default_col2_value VARCHAR)
  RETURN VARCHAR
  IS
    l_query VARCHAR(2000);
      CURSOR l_query_cur(c_table VARCHAR
                        ,c_default_col1 VARCHAR
                        ,c_default_col1_value VARCHAR
                        ,c_default_col2 VARCHAR
                        ,c_default_col2_value VARCHAR) IS
        SELECT decode(column_name,c_default_col1,''''||replace(c_default_col1_value,'''','''''')||'''',
               decode(column_name,c_default_col2,''''||replace(c_default_col2_value,'''','''''')||'''',
              'decode('||column_name||',null,''null'','||
               decode(data_type
               ,'VARCHAR2','''''''''||'||column_name ||'||'''''''''
               ,'DATE'    ,'''to_date(''''''||to_char('||column_name||',''YYYY-MM-DD HH24:MI:SS'')||'''''',''''YYYY-MM-DD HH24:MI:SS'''')'''
               ,column_name
               ) || ')' )) column_query
          FROM user_tab_columns
         WHERE table_name = upper(c_table)
        ORDER BY column_id;
  BEGIN
    l_query := 'SELECT ';
    FOR rec IN l_query_cur(p_table, p_default_col1, p_default_col1_value, p_default_col2, p_default_col2_value)
    LOOP
      l_query := l_query || rec.column_query || '||'',''||';
    END LOOP;
    l_query := substr(l_query,1,length(l_query)-7);
    RETURN l_query || ' FROM ' || p_table;
  END;
  --
BEGIN
  l_column_list  := get_cols(p_table);
  l_query        := get_query(p_table,upper(p_default_col1),p_default_col1_value
                                     ,upper(p_default_col2),p_default_col2_value);
  l_cursor := dbms_sql.open_cursor;
  DBMS_SQL.PARSE(l_cursor, l_query, DBMS_SQL.native);
  DBMS_SQL.DEFINE_COLUMN(l_cursor, 1, l_value_list, 2000);
  ignore := DBMS_SQL.EXECUTE(l_cursor);
  --
  LOOP
    IF DBMS_SQL.FETCH_ROWS(l_cursor)>0 THEN
      DBMS_SQL.COLUMN_VALUE(l_cursor, 1, l_value_list);
      DBMS_OUTPUT.PUT_LINE('INSERT INTO '||p_table||' ('||l_column_list||')');
      DBMS_OUTPUT.PUT_LINE('  VALUES ('||l_value_list||');');
    ELSE
      EXIT;
    END IF;
  END LOOP;
END;
/

set serveroutput on size 1000000
exec genins('&table_name','&col1','&col1_value','&col2','&col2_value');
set serveroutput off

drop procedure genins;
set feedback on

 

 

1.把genins.sql放入你的目錄下:


/users>ll genins.sql

/users>sqlplus userid/password@dbName

 

2.建張臨時表做 參考條件

SQL> create table tab_test

  2  as

  3  select *

  4  from tab_abc where rownum<10;

 

Table created.

 

3.獲得想要的 像臨時表中一樣的 insert數據。

 

SQL> start genins.sql

==========================================================================

Generate INSERT statements for existing data in a table

==========================================================================

 

You'll be prompted for the following:

- table_name: The name of the table to generate statements (case insensitive)

- col1:       The name of a column you want to fill with fixed data (case insensitive)

.             - [ENTER]: do not use this functionality

- col1_value: The value for the column above (case sensitive)

.             - Enter String Values within two single quotes: ''example''

.             - [ENTER]: do not use this functionality

- col2:       The name of a column you want to fill with fixed data (case insensitive)

.             - [ENTER]: do not use this functionality

- col2_value: The value for the column above (case sensitive)

.             - Enter String Values within two single quotes: ''example''

.             - [ENTER]: do not use this functionality

 

Enter value for table_name: tab_test

Enter value for col1: <RETURN>

Enter value for col1_value: <RETURN>

Enter value for col2: <RETURN>

Enter value for col2_value: <RETURN>

INSERT INTO tab_test (book,bookNAME,author,book_DATE)
VALUES ('72260','CITI LIKE0...','hiyu',to_date('2008-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'));

INSERT INTO tab_test (book,bookNAME,author,book_DATE)
VALUES ('72261','CITI LIKE1...','hiyu',to_date('2008-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'));

INSERT INTO tab_test (book,bookNAME,author,book_DATE)
VALUES ('72262','CITI LIKE2...','hiyu',to_date('2008-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'));

INSERT INTO tab_test (book,bookNAME,author,book_DATE)
VALUES ('72263','CITI LIKE3...','hiyu',to_date('2008-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'));

INSERT INTO tab_test (book,bookNAME,author,book_DATE)
VALUES ('72264','CITI LIKE4...','hiyu',to_date('2008-01-31 00:00:00','YYYY-MM-DD HH24:MI:SS'));

SQL>

 

注意: 以上灰色的字體就是我們 想要的 insert 數據。

 

 4.刪除臨時表

 

SQL> drop table tab_test;

 

Table dropped.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章