楼主: yulihua49

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

[复制链接]
论坛徽章:
40
授权会员
日期:2009-03-04 17:06:25最佳人气徽章
日期:2013-03-19 17:24:25SQL极客
日期:2013-12-09 14:13:35优秀写手
日期:2013-12-18 09:29:09ITPUB元老
日期:2015-03-04 13:33:34白羊座
日期:2016-03-11 13:49:34乌索普
日期:2017-11-17 11:40:00
21#
发表于 2012-11-14 11:57 | 只看该作者
yulihua49 发表于 2012-11-14 11:26
OCI虽然高效,但使用过于复杂。
你那位同事,自己是高手,但没有传他人。
我们现在包装了,而且开源,使 ...

之前用过pipeline 函数导出数据也非常快,还可以并行
可以测试对比一下,参考如下链接中 a parallel-enabled pipelined function unloader

http://www.oracle-developer.net/display.php?id=429

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
22#
发表于 2012-11-14 12:12 | 只看该作者
oci的确是好东西,太复杂了点,otl_stream简单

使用道具 举报

回复
论坛徽章:
57
SQL极客
日期:2013-12-09 14:13:35秀才
日期:2016-01-21 13:42:39秀才
日期:2016-01-13 12:14:26SQL大赛参与纪念
日期:2016-01-13 10:32:19SQL数据库编程大师
日期:2016-01-13 10:30:43秀才
日期:2015-12-14 14:47:54秀才
日期:2015-10-19 15:50:392015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11优秀写手
日期:2014-11-08 06:00:14
23#
发表于 2012-11-14 14:48 | 只看该作者
newkid 发表于 2012-11-13 23:05
可以,目前只支持DATAPUMP格式。我曾经在ASKTOM问他为什么不支持CSV格式,TOM的回答是可以向ORACLE提出一 ...

可以卸载成文件吗?

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
24#
发表于 2012-11-14 15:39 | 只看该作者
babujie2001 发表于 2012-11-14 11:54
只是感慨一下,20年。。。现在回头向你们学习来了。。。。

膜拜前辈先

使用道具 举报

回复
论坛徽章:
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
25#
发表于 2012-11-15 01:16 | 只看该作者
xgghxkhuang 发表于 2012-11-14 14:48
可以卸载成文件吗?

可以,外部表当然是文件。即CTAS外部表。这个文件只能是DATAPUMP格式。

使用道具 举报

回复
论坛徽章:
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
26#
发表于 2012-11-15 01:17 | 只看该作者
yulihua49 发表于 2012-11-14 10:59
好,那我们握手言和了。
在动态解析数据时,可能其他工具开销都比较大。
oci可以高效解决数据动态解析 ...

我准备用一种高级技术改写你的存储过程,争取这几天吧,看有没办法抽空。

使用道具 举报

回复
论坛徽章:
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
27#
发表于 2012-11-15 01:34 | 只看该作者
yulihua49 发表于 2012-11-14 10:59
好,那我们握手言和了。
在动态解析数据时,可能其他工具开销都比较大。
oci可以高效解决数据动态解析 ...

你也来参加我们的编程比赛怎么样?
http://www.itpub.net/thread-1736930-1-1.html

就用你的C语言,注意咱们可不是拼速度,而是代码量,越小越好。

使用道具 举报

回复
论坛徽章:
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
28#
发表于 2012-11-15 01:39 | 只看该作者
babujie2001 发表于 2012-11-14 11:09
20年前,很牛的同事用OCI完成foxpro 和 oracle的通讯接口,foxpro直接编程oracle....

20年前可能只有版本5或6? 没有记错吧?
他可能就是写了一个接口转换程序把FOXPRO文件转换到ORACLE里面,并不是用FOXPRO访问ORACLE.
我确实在97年写过FOXPRO插入到ORACLE的程序,用的是ODBC。
我写的最后一个FOXPRO程序在2006年光荣退休,总共运行了十年!甚至在我出国后没人维护的情况下还稳定运行了三年!

使用道具 举报

回复
论坛徽章:
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
29#
发表于 2012-11-15 04:28 | 只看该作者
newkid 发表于 2012-11-15 01:17
我准备用一种高级技术改写你的存储过程,争取这几天吧,看有没办法抽空。

新版过程:

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);
BEGIN
         EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYYMMDD HH24:MI:SS''';

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||');
         OPEN c;
         
         LOOP
         FETCH c BULK COLLECT INTO r LIMIT 2000;
         
         FOR i IN 1..r.COUNT LOOP
             L_ROW := ';

         DBMS_SQL.PARSE( L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE );
         DBMS_SQL.DESCRIBE_COLUMNS( L_THECURSOR, L_COLCNT, L_DESCTBL );
         FOR I IN 1 .. L_COLCNT LOOP
             IF i>1 THEN
                lv_sql := lv_sql||'||'''||L_SEPARATOR||'''||';
             END IF;
             lv_sql := lv_sql||'r(i).'||L_DESCTBL(I).COL_NAME;
         END LOOP;
         DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);
         lv_sql := lv_sql||';
             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;
/

你可以调整批量大小,暂定2000行一批。

使用道具 举报

回复
论坛徽章:
90
数据库板块每日发贴之星
日期:2005-04-25 01:01:202014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11马上有车
日期: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:142014年世界杯参赛球队: 美国
日期:2014-06-06 14:24:30马上有对象
日期:2014-10-21 13:39:03
30#
发表于 2012-11-15 09:38 | 只看该作者
导出成csv也可以试试看sqlplus,没准更快呢。
还可以试试看java

使用道具 举报

回复

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

本版积分规则 发表回复

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