`
wenjinglian
  • 浏览: 825029 次
  • 性别: Icon_minigender_1
  • 来自: 株洲->深圳
社区版块
存档分类
最新评论

oracle导出表insert语句存储过程

阅读更多

 

 

create or replace procedure print_insert(v_tname  varchar2,
                                         v_cbatch number default 0)
/*
  v_tname 要输出sql的表名
  v_cbatch 输出commit间隔
  */
 as
  /* 声明动态游标变量 */
  type cur_alldata is ref cursor;
  l_alldata cur_alldata;
  /* 将单行数据写入v_row*/
  v_sql varchar2(3999);
  v_row varchar2(3999);
  /* 函数的前向声明 */
  function formatfield(v_tname varchar2, v_cname varchar2, v_colno number)
    return varchar2;

  /* 格式化数据输出 */
  function formatdata(v_tname varchar2, v_row varchar2) return varchar2 as
    v_ldata varchar2(32765);
    v_rdata varchar2(32765);
    v_cname varchar2(3999);
    v_instr number(10);
    v_count number(6);
  begin
    v_instr := instr(v_row, '(', 1, 2); --INSTR(源字符串, 目标字符串, 起始位置, 匹配序号)
    v_ldata := substr(v_row, 1, v_instr);
    v_rdata := substr(v_row, v_instr + 1);
    v_instr := instr(v_rdata, ')', -1, 1);
    v_rdata := substr(v_rdata, 1, v_instr - 1);
  
    v_count := 0;
    loop
      v_instr := instr(v_rdata, ',');
      exit when v_instr = 0;
    
      v_cname := substr(v_rdata, 1, v_instr - 1);
      v_rdata := substr(v_rdata, v_instr + 1);
      v_count := v_count + 1;
      /* 格式化不同的数据类型 */
      v_cname := formatfield(v_tname, v_cname, v_count);
    
      /* 将处理后的字段值加入v_ldata */
      if v_count = 1 then
        v_ldata := v_ldata || v_cname;
      else
        v_ldata := v_ldata || ',' || v_cname;
      end if;
    
    end loop;
  
    /* 添加最后一个字段的值 */
    if v_count = 1 then
      v_ldata := v_ldata || formatfield(v_tname, v_rdata, v_count + 1) || ');';
    else
      v_ldata := v_ldata || ',' ||
                 formatfield(v_tname, v_rdata, v_count + 1) || ');';
    end if;
    dbms_output.put_line(v_ldata);
    return v_ldata;
  end;

  /* 针对不同的数据类型进行处理 */
  function formatfield(v_tname varchar2, v_cname varchar2, v_colno number)
    return varchar2 as
    v_name varchar2(3999);
    v_type varchar2(99);
  begin
    select coltype
      into v_type
      from col
     where tname = upper(v_tname)
       and colno = v_colno;
    --判断数据类型
    if v_type = 'DATE' then
      v_name := 'to_date(' || '''' || v_cname || '''' || ',' || '''' ||
                'yyyy-mm-dd hh24:mi:ss' || '''' || ')';
    elsif v_type = 'VARCHAR2' then
      v_name := '''' || v_cname || '''';
    elsif v_type = 'CHAR' then
      v_name := '''' || v_cname || '''';
    else
      v_name := v_cname;
    end if;
    return v_name;
  end;

  /* 求输入表的字段列表 */
  function getfields(v_tname varchar2) return varchar2 as
    v_fields    varchar2(3999);
    v_fieldName varchar2(3999);
  begin
    for cur_fname in (select cname, coltype
                        from col
                       where tname = upper(v_tname)
                       order by colno) loop
      if v_fields is null then
        v_fields := 'nvl(' || cur_fname.cname || ',' || '''' || '0' || '''' || ')';
      else
        v_fields := v_fields || '||'',''||' || 'nvl(' || cur_fname.cname || ',' || '''' || '0' || '''' || ')';
      end if;
      if v_fieldName is null then
        v_fieldName := cur_fname.cname;
      else
        v_fieldName := v_fieldName || ',' || cur_fname.cname;
      end if;
    end loop;
  
    v_fields := 'select ' || '''' || 'insert into ' || v_tname || ' (' ||
                v_fieldName || ') values(' || '''' || '||' || v_fields || '||' || '''' || ')' || '''' ||
                ' from ' || v_tname;
    return v_fields;
  end;
begin
  DBMS_OUTPUT.ENABLE(buffer_size => null); --解决PLSQL Developer 出现ORU-10027: buffer overflow, limit of 10000 bytes
  execute immediate 'alter session set nls_date_format=' || '''' ||
                    'yyyy-mm-dd hh24:mi:ss' || '''';
  dbms_output.put_line(' *** 表SQL输出 *** ');

  v_sql := getfields(v_tname);
  --dbms_output.put_line(v_sql);
  open l_alldata for v_sql;
  loop
    fetch l_alldata
      into v_row;
    exit when l_alldata%notfound;
    --dbms_output.put_line(v_row);
  
    dbms_output.put_line(formatdata(v_tname, v_row));
    if mod(l_alldata%rowcount, v_cbatch) = 0 then
      dbms_output.put_line('commit;');
    end if;
  end loop;

  close l_alldata;
end;

 

  原博客:http://blog.itpub.net/xzh2000

  对原作者的代码进行了相应的修改。

 

在命令行中执行:

 

set serveroutput on; --设置服务器输出
exec print_insert('表名',100);

 

 

--获取表的相关字段属性(相当于java反射获取对象属性)

 select * from col where tname = upper('表名');

 

 

 

 

分享到:
评论
2 楼 wenjinglian 2013-04-12  
sangshuye 写道
哥们,我用的怎么不好使啊?

可能是版本问题,我当时是oracle10g
1 楼 sangshuye 2013-04-07  
哥们,我用的怎么不好使啊?

相关推荐

    Oracle导出INSERT语句

    在数据库管理中,有时我们需要将数据从一个环境迁移到另一个环境,或者备份某些表的数据,这时“Oracle导出INSERT语句”的工具就显得非常实用。 这个小工具的核心功能是将Oracle数据库中的数据转换为一系列的INSERT...

    Oracle导出INSERT语句V1.1

    总的来说,“Oracle导出INSERT语句V1.1”是数据库管理员和开发人员的强大助手,它可以简化数据迁移和备份过程,提高工作效率。了解如何有效利用这个工具,将有助于我们在Oracle数据库管理中更高效地完成任务。

    表数据生成insert语句的存储过程

    表数据生成insert语句的存储过程;表数据生成insert语句的存储过程;

    Oracle导出INSERT语句V1.1.1

    "Oracle导出INSERT语句V1.1.1"就是这样一个实用工具,它能帮助我们自动化这个过程。 该工具的主要功能是提取Oracle数据库表中的记录,并自动生成相应的INSERT语句,格式化后的SQL语句便于在不同的Oracle实例或者...

    数据库数据导出到insert 语句

    当我们需要导出数据库表的数据为INSERT语句时,通常会用到一些数据库管理工具,如MySQL Workbench、pgAdmin(PostgreSQL)或者Oracle SQL Developer等。这些工具通常提供了导出数据为脚本的功能,其中包括了针对每个...

    windows和unix下通过spool导出oracle数据(导成insert语句)

    - **导出INSERT语句**:首先,使用`SPOOL filename.sql`命令指定一个输出文件,比如`filename.sql`。然后,执行`SELECT * FROM table_name`来查询你需要的表,此时输出会被重定向到文件中。为了将结果转化为INSERT...

    sybase库中导出全部表的oracle、mysql和sybase的建表语句

    本主题聚焦于从Sybase数据库中导出全部表的建表语句,并转换为Oracle、MySQL和Sybase自身的格式。这样的操作对于跨平台的数据迁移、数据库结构比对以及系统兼容性测试具有很高的实用价值。 首先,让我们深入了解`...

    自动生成insert语句的工具

    这类工具通常用于将已有的数据库数据导出为INSERT语句,以便在其他环境中重新创建相同的数据结构和内容,或者作为备份和恢复策略的一部分。 在数据库管理中,手动编写大量的INSERT语句是一项耗时且容易出错的任务。...

    Navicat_Premium_10.1.7(通用查询分析器,可将数据导出Insert语句)

    Navicat Premium 10.1.7 提供了一项独特功能,即能够将表中的数据导出为Insert语句。这对于备份数据、在不同环境之间迁移数据或者在代码中动态生成插入操作特别有用。用户可以选择特定的行或整个表格,Navicat会自动...

    java类实现导出各种数据库insert语句.pdf

    首先,它可以实现自动化导出insert 语句,减少手动编写的工作量。其次,它可以支持多种数据库管理系统,包括 Oracle、MySQL 等。最后,它可以提高工作效率和准确性。 缺点 虽然使用 Java 类实现导出各种数据库 ...

    把任意数据库导出为其它数据库的insert(可执行程序+java代码)

    此软件用于把数据库里的数据导出为指定数据库类型的insert语句,用于数据备份或迁移到另一个数据库, 大文本和二进制字段被忽略。 当前支持oracle、sybase、mysql和ms sqlServer数据库。 你可以修改参数文件、增加新...

    sql server导出成sql语句

    接着,对于每个列,我们根据其数据类型生成相应的INSERT语句片段。例如,对于VARCHAR和CHAR类型的列,数据会被包围在单引号中;对于非字符串类型,如INT,数据将直接插入。注意,时间戳、图像、文本、N文本以及SQL_...

    Oracle导出图片源代码

    在Oracle SQL中,我们可以使用PL/SQL过程或函数来操作BLOB字段,例如INSERT、UPDATE和SELECT语句。对于导出,我们需要一个能够读取BLOB数据并将其转换为可保存到文件系统的格式的程序。 以下是导出图片的一些关键...

    导入导出 Oracle 分区表数据

    ### 导入导出Oracle分区表数据 #### 一、概述 在Oracle数据库管理中,对分区表进行数据的导入与导出是一项常见的任务。分区技术可以显著提高大型表的性能,尤其是在处理大规模数据集时。为了有效地管理和迁移这些...

    Oracle数据库导入导出工具

    - `sqlplus`:通过SQL命令行工具,配合`INSERT INTO SELECT`语句或`CREATE TABLE AS SELECT`进行数据导入导出。 - 第三方工具:如本例中的Java桌面程序,提供图形化界面,简化操作流程。 6. **导入导出参数设置**...

    SQLServer 2005数据导出成insert语句

    沈阳信软计算机有限公司的员工在业余时间开发了这个小工具,实现了SQLServer2005的数据导出,导出的数据是 [表名].sql。 这个文件可以导入到任何数据库里,实现了数据库切换。开发工作在SQLServer2005里比较方便,但...

    ORACLE 导入导出表空间文档

    ### Oracle 数据库表空间管理与数据导入导出详解 #### 表空间概念及管理 在Oracle数据库中,**表空间**是逻辑存储结构的一部分,用于组织数据库中的数据和索引。一个表空间由一个或多个数据文件组成,这些数据文件...

    oracle利用批处理文件执行SQL语句,bat连接oracle数据库并执行语句

    Oracle数据库是世界上最流行的数据库管理系统之一,它广泛应用于企业级数据存储和管理。批处理文件(如.bat文件)在Windows环境中是一种高效的方式,可以自动化执行一系列命令,包括连接数据库和执行SQL语句。在这个...

    好用的数据库助手;支持SQL Server,Oracle ;可以自动生成insert语句或update语句;

    而“好用的数据库助手”通过自动分析数据库表结构,可以快速生成精确的INSERT和UPDATE语句,这一功能大大简化了数据导入导出和日常维护的操作,使得数据库管理变得更加高效和便捷。 在自动化SQL语句生成的基础上,...

Global site tag (gtag.js) - Google Analytics