楼主: Andy_GaoWei

[备份恢复] ★如何将表中数据生成SQL文件?★

[复制链接]
论坛徽章:
0
11#
发表于 2005-3-3 10:49 | 只看该作者
/*
写了个简单的脚本 xx.sql 如下
*/

spool test.sql
set heading off

select 'insert into test_data(col_a, col_b, col_c) values (''' || col_a || ''', ''' || col_b || ''',''' || col_b || ''');' from test_data;

spool off
exit


/*
--  执行以上脚本可得返回名为test.sql的如下:
语句:
sqlplus   userName/psw@yourDb   @xx.sql
*/

insert into test_data(col_a, col_b, col_c) values ('11', 'bb','cc');              
insert into test_data(col_a, col_b, col_c) values ('22', 'b2','c3');

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2005-3-3 11:56 | 只看该作者
好的,你们是最俸的,21世纪中华民族伟大的复兴事业就靠你们!

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
13#
发表于 2005-3-3 12:27 | 只看该作者
更灵活的,可以使用存储过程:

> drop table t_data
  2  /

表已丢弃。

> create table t_data
  2  as
  3  select object_id from dba_objects
  4  where rownum < 100
  5  /

表已创建。

>
> set serveroutput on
>
> declare
  2  begin
  3    dbms_output.enable(100000);
  4    for c_1 in (select * from t_data where rownum < 5) loop
  5      dbms_output.put_line('insert into t_data values');
  6      dbms_output.put_line('('||c_1.object_id||');');
  7   end loop;
  8  end;
  9  /
insert into t_data values
(20);
insert into t_data values
(44);
insert into t_data values
(28);
insert into t_data values
(15);

PL/SQL 过程已成功完成。

>
>

把过程的输出spool一下即可.

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34
14#
发表于 2005-3-3 12:42 | 只看该作者
还是版主强,我一般用工具生成。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
15#
发表于 2005-3-3 12:52 | 只看该作者
http://blog.itpub.net/post/96/2305
看看偶这个贴子,对各种数据类型都考虑到啦。

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
16#
发表于 2005-3-3 13:03 | 只看该作者
开发工具是用来提高生产效率的,能用,为何不用?!
不过如果要跟应用程序集成就要自己写代码了.
使用java可以很方便的实现.

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
17#
发表于 2005-3-3 13:53 | 只看该作者
刚刚写了一个比较粗糙的java版:

    /**
     * 根据输入的sql生成insert脚本
     *
     * @param conn
     * @param sqlstmt
     * @param uri 输出的文件名称
     * @return
     * @throws GFPortalException
     */
    public boolean createSqlFile(Connection conn, String sqlstmt, String tablename,String uri) throws GFPortalException {
        //执行语句
        PreparedStatement pstmt;
        ResultSet rs = null;
        //连接
        try {
            //获取sql语句
            pstmt =
                    conn.prepareStatement(sqlstmt,
                            ResultSet.TYPE_SCROLL_INSENSITIVE,
                            ResultSet.CONCUR_READ_ONLY);
        } catch (Exception e) {
            logger.debug("查询初始化失败!" + e);
            throw new GFPortalException("查询初始化失败!" + e);
        }
        //获取结果集
        try {
            rs = pstmt.executeQuery(); //结果集
            ResultSetMetaData rsmd = rs.getMetaData(); //元数据
            PrintWriter out = new PrintWriter(new FileWriter(uri), true);
            while (rs.next()) {
                StringBuffer row = new StringBuffer();
                row.append("insert into " + tablename + " values(";
                int count = rsmd.getColumnCount();
                //获取其中的一条记录
                for (int i = 1; i <= count; i++) {
                    //放入到文件中
                    if (!CommonUtility.isNull(rs.getObject(i)))//判断是否为null
                    {
                        switch (rsmd.getColumnType(i)) {
                            case Types.BIT:
                            case Types.INTEGER:
                            case Types.TINYINT:
                            case Types.BIGINT:
                            case Types.REAL:
                            case Types.FLOAT:
                            case Types.DOUBLE:
                            case Types.NUMERIC:
                            case Types.DECIMAL:
                            case Types.LONGVARBINARY:
                            case Types.VARBINARY:
                            case Types.BINARY:
                                row.append(rs.getObject(i));
                                break;

                            case Types.BLOB:
                            case Types.CLOB:
                                break;

                            case Types.DATE:
                            case Types.TIME:
                            case Types.TIMESTAMP:
                            case Types.NULL:
                                row.append("to_date('";
                                row.append(CommonUtility.getYMDHMM(rs.getDate(i)));
                                row.append("'";
                                row.append(",'yyyy-mm-dd hh24:mi:ss')";
                                break;

                            case Types.LONGVARCHAR:
                            case Types.CHAR:
                            case Types.VARCHAR:
                            case Types.OTHER:
                            default:
                                row.append("'";
                                row.append(rs.getString(i));
                                row.append("'";
                                break;
                        }//end switch
                    } else {
                        row.append("''";
                    }
                    if (i == count)//判断是否最后一列
                    {
                        row.append(";";
                    } else {
                        row.append(",";
                    }
                }
                //完成一行
                out.println(row.toString());
                //释放资源
                row = null;
            }
        } catch (Exception e) {
            logger.debug("查询出错!" + e);
            throw new GFPortalException("查询出错!" + e.getMessage());
        } finally {
            try {
                ConnMgr.closePreparedStatement(pstmt);
                rs.close();
                pstmt.close();
            } catch (Exception e2) {

            }
        }
        return true;
    }


junit的单元测试类:
    public void testCreateSqlFile() throws Exception {
        Connection conn = ConnMgr.getConnection();
        businessLogicQueryHelper.createSqlFile(conn, "select * from WF_PROCESSACTIVITY", "WF_PROCESSACTIVITY","c:\\test.txt");
        ConnMgr.closeConnection(conn);
    }

样例输出数据:
insert into WF_PROCESSACTIVITY values(100,100101,'填写计划',1,2,0,'note101','plan_edit.jsp');
insert into WF_PROCESSACTIVITY values(100,100102,'局收发',2,2,0,'note102','ykjhsp_jff.jsp');

使用道具 举报

回复
论坛徽章:
2
ITPUB元老
日期:2005-02-28 12:57:00会员2006贡献徽章
日期:2006-04-17 13:46:34
18#
发表于 2005-3-3 14:11 | 只看该作者
还是老和尚强,写脚本的话最麻烦的就是日期类型的,select出来的日期格式还和不同环境变量有关。我们这边的应用程序已经全部使用字符类型来表示日期了,写程序也方便

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
19#
发表于 2005-3-3 14:20 | 只看该作者
最初由 fable_cao 发布
[B]还是老和尚强,写脚本的话最麻烦的就是日期类型的,select出来的日期格式还和不同环境变量有关。我们这边的应用程序已经全部使用字符类型来表示日期了,写程序也方便 [/B]


如果select的时候指定了to_char,而且使用的格式是'YYYY-MM-DD HH24:MI:SS',就不会和环境变量有关了。

用字符串表示日期,怎么使用索引,全部建立成函数索引吗?
用字符串表示日期,怎么计算两个日期中有多少天?怎么计算某个日期是星期几,不是还要转化为date去计算吗?

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
38
ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14现任管理团队成员
日期:2012-10-18 17:11:21版主4段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
20#
发表于 2005-3-3 14:39 | 只看该作者
强!偶一直都是用Toad做这事的。
想不到husthxd斑竹还是java行家啊

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表