123
返回列表 发新帖
楼主: Andy_GaoWei

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

[复制链接]
论坛徽章:
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
21#
发表于 2005-3-3 16:04 | 只看该作者
最初由 yangtingkun 发布
[B]

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

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


偶这边也是用的char型,没有用date型.
1.查询的时候是:
column_name = '20050301'
会使用上索引.
2.诸如计算两个日期中有多少天的需求几乎没有

呵呵,一句话,怎么方便怎么用

使用道具 举报

回复
论坛徽章:
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
22#
发表于 2005-3-3 16:08 | 只看该作者
最初由 lwxxrq 发布
[B]强!偶一直都是用Toad做这事的。
想不到husthxd斑竹还是java行家啊 [/B]


toad/sql navigator都可以.
btw:其实java的世界也很精彩的

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2006-02-05 17:25:21
23#
发表于 2005-3-4 11:09 | 只看该作者

xzh2000 ,根据你的过程,我执行时发生错误!

xzh2000 ,你好我根据你提供的代码创建存储过程后再执行时发生错误:
SQL> exec print_insert('www.gz',2);
*
ERROR 位于第1行:
ORA-00936: 缺少表达式
ORA-06512: 在"WWW.PRINT_INSERT", line 95
ORA-06512: 在line 1

请教怎么回事?

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
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
24#
发表于 2005-3-4 11:31 | 只看该作者

Re: xzh2000 ,根据你的过程,我执行时发生错误!

最初由 anzi_oracle 发布
[B]xzh2000 ,你好我根据你提供的代码创建存储过程后再执行时发生错误:
SQL> exec print_insert('www.gz',2);
*
ERROR 位于第1行:
ORA-00936: 缺少表达式
ORA-06512: 在"WWW.PRINT_INSERT", line 95
ORA-06512: 在line 1

请教怎么回事? [/B]


你试试这个:
create or replace procedure print_insert(v_tname varchar2,v_cbatch number default 0)
/*
        v_tname  要输出sql的表名        作者:xzh2000@hotmail.com
        v_cbatch 输出commit间隔                博客:http://blog.itpub.net/xzh2000
*/
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(8);
                v_count number(6);
        begin
                v_instr := instr(v_row,'(');
                v_ldata := substr(v_row,1,v_instr);
                v_rdata := substr(v_row,v_instr+1);
                v_instr := instr(v_rdata,')');
                v_rdata := substr(v_rdata,1,v_instr-1);

                v_count := 0;
                loop
                        v_instr := instr(v_rdata,',');
                        v_count := v_count + 1;

                        exit when v_instr = 0;

                        v_cname := substr(v_rdata,1,v_instr-1);
                        v_rdata := substr(v_rdata,v_instr+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)||');';
                else
                         v_ldata := v_ldata||','||formatfield(v_tname,v_rdata,v_count)||');';
                end if;
                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||'''';
                else
                        v_name := v_cname;
                end if;
                return v_name;
        end;
/* 求输入表的字段列表 */
        function getfields(v_tname varchar2) return varchar2
        as
         v_fields 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;         
         end loop;
         v_fields := 'select '||''''||'insert into '||v_tname||' values('||''''||'||'||v_fields||'||'||''''||')'||''''||' from '||v_tname;
         return v_fields;
        end;
begin
        execute immediate 'alter session set nls_date_format='||''''||'yyyy-mm-dd hh24:mi:ss'||'''';
  dbms_output.put_line('  *** xzxh2000向你问好! ***  ');

        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;

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2006-02-05 17:25:21
25#
发表于 2005-3-4 11:49 | 只看该作者

xzh2000,你好,还是有错误提示!

我的版本是oracle8.1.5
错误提示:
BEGIN print_insert('www.t_gz',2); END;

*
ERROR 位于第1行:
ORA-00936: 缺少表达式
ORA-06512: 在"WWW.PRINT_INSERT", line 97
ORA-06512: 在line 1

使用道具 举报

回复

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

本版积分规则 发表回复

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