楼主: yulihua49

NEWKID:oci确实比存储过程快。

[复制链接]
论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-15 06:00:15问答徽章
日期:2014-02-08 10:20:44马上有车
日期:2014-03-01 22:23:13沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:182016猴年福章
日期:2016-02-23 09:58:34
41#
发表于 2012-11-16 14:37 | 只看该作者
本帖最后由 jowenz 于 2012-11-16 15:36 编辑
newkid 发表于 2012-11-15 22:35
你是怎么调用的?DIRECTORY创建了没有,有没有授权?报的错误信息是什么?

用system用户,报了这个错,ora-06561 ora-06512

不好意思。我自己没设置好。。。DIRECTORY的问题。。


大师能否把字段名也加上来呢。。生成的文件只有数据,没有字段名。。最好还能考虑一上数字(长数字)用excel打开是科学记数法的问题

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44咸鸭蛋
日期:2011-06-10 09:50:32ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26双黄蛋
日期:2012-03-30 10:02:542013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:18
42#
发表于 2012-11-16 15:50 | 只看该作者
yulihua49 发表于 2012-11-16 10:55
程序在前边,不是我写的,也没仔细看。
加载时块操作肯定快,卸载时好像差不多。
你能改出一个,我们 ...

不支持异地写;这是Oracle安全决定的

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
43#
发表于 2012-11-16 22:59 | 只看该作者
yulihua49 发表于 2012-11-16 10:55
程序在前边,不是我写的,也没仔细看。
加载时块操作肯定快,卸载时好像差不多。
你能改出一个,我们 ...

我在29楼不是改了一个?我用了2000行一批,你也可以改大点试试。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
44#
发表于 2012-11-17 06:23 | 只看该作者
jowenz 发表于 2012-11-16 14:37
用system用户,报了这个错,ora-06561 ora-06512

不好意思。我自己没设置好。。。DIRECTORY的问题。。 ...

加字段名很容易嘛?刚才没看见,现在快下班了,等我有空改一下。
excel 里面可以去把列的类型设置为字符串。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
45#
发表于 2012-11-17 06:35 | 只看该作者
带列名输出的版本:

CREATE OR REPLACE PROCEDURE SQL_TO_CSV2
(
          P_QUERY IN VARCHAR2,                        -- PLSQL文
          P_DIR IN VARCHAR2,                          -- 导出的文件放置目录
          P_FILENAME IN VARCHAR2                      -- CSV名
)
IS
          L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
          L_COLCNT NUMBER := 0;
          L_SEPARATOR VARCHAR2(1) := ',';
          L_DESCTBL DBMS_SQL.DESC_TAB;
          P_MAX_LINESIZE NUMBER := 32000;
          lv_sql VARCHAR2(32000);
         
          LV_ROW VARCHAR2(32000);
          LV_HEADER VARCHAR2(32000);
BEGIN
          EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYYMMDD HH24:MI:SS''';

          DBMS_SQL.PARSE( L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE );
          DBMS_SQL.DESCRIBE_COLUMNS( L_THECURSOR, L_COLCNT, L_DESCTBL );
          DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);
         
          LV_HEADER := 'UTL_FILE.put_line(L_OUTPUT,';
          FOR I IN 1 .. L_COLCNT LOOP
              IF i>1 THEN
                 LV_ROW := LV_ROW||'||'''||L_SEPARATOR||'''||';
                 LV_HEADER := LV_HEADER ||'||'''||L_SEPARATOR||'''||';
              END IF;
              LV_ROW := LV_ROW||'r(i).'||L_DESCTBL(I).COL_NAME;
              LV_HEADER := LV_HEADER||''''||L_DESCTBL(I).COL_NAME||'''';
          END LOOP;
          LV_HEADER := LV_HEADER||');';
         
lv_sql := '

DECLARE
          L_OUTPUT UTL_FILE.FILE_TYPE;
          L_ROW Varchar2(32000) := NULL;
    CURSOR c IS '||P_QUERY||';
    TYPE tp_rows IS TABLE OF c%ROWTYPE INDEX BY PLS_INTEGER;
    r tp_rows;
BEGIN
          L_OUTPUT := UTL_FILE.FOPEN('''||P_DIR||''', '''||P_FILENAME||'.tmp'', ''W'', '||P_MAX_LINESIZE||');
          '||LV_HEADER||'
          OPEN c;
         
          LOOP
          FETCH c BULK COLLECT INTO r LIMIT 2000;
         
          FOR i IN 1..r.COUNT LOOP
              L_ROW := '||LV_ROW||';
              UTL_FILE.put_line(L_OUTPUT,L_ROW);

          END LOOP;
              EXIT WHEN c%NOTFOUND;
          END LOOP;
          CLOSE c;

          UTL_FILE.FCLOSE( L_OUTPUT );
EXCEPTION
          WHEN OTHERS THEN
          UTL_FILE.FCLOSE( L_OUTPUT );
          DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
          RAISE;
END;';

     --DBMS_OUTPUT.PUT_LINE(lv_sql);
     EXECUTE IMMEDIATE lv_sql;

          -- UTL_FILE.fremove(P_DIR,to_char(sysdate,'yyyymmdd_')|| P_FILENAME||'.csv');
          -- UTL_FILE.frename(P_DIR,P_FILENAME||'.tmp',P_DIR,to_char(sysdate,'yyyymmdd_')|| P_FILENAME||'.csv');


END;
/

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
46#
 楼主| 发表于 2012-11-19 17:13 | 只看该作者
newkid 发表于 2012-11-17 06:35
带列名输出的版本:

CREATE OR REPLACE PROCEDURE SQL_TO_CSV2

哈哈,刚看见,copy了,拿给某人,明天看结果。

使用道具 举报

回复
论坛徽章:
6
2011新春纪念徽章
日期:2011-01-04 10:35:482011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:222013年新春福章
日期:2013-02-25 14:51:24兰博基尼
日期:2013-11-01 13:10:24
47#
发表于 2012-11-19 23:55 | 只看该作者
newkid 发表于 2012-11-17 06:23
加字段名很容易嘛?刚才没看见,现在快下班了,等我有空改一下。
excel 里面可以去把列的类型设置为字符 ...

CSV 文件双击打开,如是数字超过一定位数(好像15位),就会出现科学记数位,而且是不可还原的
例如:1234567890123456789  会变成1234567890123450000
在excel 里面可以去把列的类型设置为字符,不能解决该 问题。

如果能生成真正的XLS文件就好了。。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
48#
发表于 2012-11-20 00:28 | 只看该作者
jowen 发表于 2012-11-19 23:55
CSV 文件双击打开,如是数字超过一定位数(好像15位),就会出现科学记数位,而且是不可还原的
例如:12 ...

网上说在列数据后面跟一个TAB即CHR(9)就可解决,你可以试试。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
49#
 楼主| 发表于 2012-11-20 13:53 | 只看该作者
本帖最后由 yulihua49 于 2012-11-20 14:00 编辑
yulihua49 发表于 2012-11-19 17:13
哈哈,刚看见,copy了,拿给某人,明天看结果。


报告结果,NEWKID果真身手不凡。
你那个程序是10分55秒完成。
但是我把程序移到数据库服务器上,避免了网络拖累。结果是8分17秒。
还是oci快。
总结一下:
PL/SQL 单条:30分
PL/SQL 批量:10分55秒
PROC*C 异地:32分
oci 异地:12分12秒(比顶楼的程序改进了些)
oci 本地 8分17秒。

卸载3992639行,5985550246字节。

快慢也差不多少,相同数量级吧。

使用道具 举报

回复
论坛徽章:
9
ITPUB元老
日期:2009-12-28 22:11:19ITPUB9周年纪念徽章
日期:2010-10-08 09:31:21ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152012新春纪念徽章
日期:2012-01-04 11:51:222014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
50#
发表于 2012-11-20 16:12 | 只看该作者
收藏

使用道具 举报

回复

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

本版积分规则 发表回复

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