<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Read ERN &#187; 导出</title>
	<atom:link href="http://www.readern.com/tag/%e5%af%bc%e5%87%ba/feed" rel="self" type="application/rss+xml" />
	<link>http://www.readern.com</link>
	<description>生命不息折腾不止</description>
	<lastBuildDate>Sat, 31 Dec 2011 16:18:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[重发]Pro*C实现导出Oracle表为文本文件</title>
		<link>http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html</link>
		<comments>http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html#comments</comments>
		<pubDate>Wed, 09 Sep 2009 00:49:32 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[导出]]></category>
		<category><![CDATA[文本文件]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=157</guid>
		<description><![CDATA[旧文重发，原文刊载于2006年6月8日。 近日工作需要，要大批量导出数据，开始用SQL*Plus的SPOOL功能。结果老是提示“xrealloc: cannot reallocate XXX bytes”。而且每次发生的时间还不同，有时候是到文件1G就出错，有时候是2G多出错。怀疑是32位Linux问题，换到Solaris 8上还是如故。客户端都是9201的，到Metalink上搜索没有结果。郁闷之余到Oracle-l上发了个邮件，收到一位高手的指点，说可能是内存泄露问题，SQL*Plus的开发人员估计也不会想到有人会导出如此大量数据。在邮件往复之间，那位高手提醒可以用UTL_FILE来导出。忽然想起Tom的两本书里都有提到用PL/SQL来导出，于是翻出书里的那个网址http://asktom.oracle.com/~tkyte/flat/index.html，进去一看，PL/SQL的效率比SQL*Plus要高，缺点是生成的文件必须在主机上。SQL*Plus可以调整arraysize来提高效率（当然经我实践大数据量时还有内存泄露之虞）。Pro*C是高效的方法，缺点是需要写程序、编译。 硬着头皮看Pro*C咯，好在Tom给了原始代码，抓下来放到一台Linux的机器上proc报错，应该是proc配置include库的问题，找到一个makefile，倒是没啥问题了，但是最后链接失败，报无法识别&#8217;sqlca&#8217;。到网上一搜，和我一样晕的人还有，要修改代码，多include进，但是看Tom的帖子似乎没提到这个问题，不知道为什么。 下面是修改后的源代码，我顺便在里面修改了会话的一些参数，以处理中文和时间格式： #include #include #include #include #define MAX_VNAME_LEN     30 #define MAX_INAME_LEN     30 static char *   USERID = NULL; static char *   SQLSTMT = NULL; static char *   ARRAY_SIZE = "10"; #define vstrcpy( a, b ) \ (strcpy( a.arr, b ), a.len = strlen( a.arr ), a.arr) EXEC SQL [...]]]></description>
			<content:encoded><![CDATA[<p>旧文重发，原文刊载于<a href="http://yaoyp.spaces.live.com/blog/cns!AC5FD97B8A549660!777.entry" target="_blank">2006年6月8日</a>。</p>
<p>近日工作需要，要大批量导出数据，开始用SQL*Plus的SPOOL功能。结果老是提示“xrealloc: cannot reallocate XXX bytes”。而且每次发生的时间还不同，有时候是到文件1G就出错，有时候是2G多出错。怀疑是32位Linux问题，换到Solaris 8上还是如故。客户端都是9201的，到Metalink上搜索没有结果。郁闷之余到Oracle-l上发了个邮件，收到一位高手的指点，说可能是内存泄露问题，SQL*Plus的开发人员估计也不会想到有人会导出如此大量数据。在邮件往复之间，那位高手提醒可以用UTL_FILE来导出。忽然想起Tom的两本书里都有提到用PL/SQL来导出，于是翻出书里的那个网址http://asktom.oracle.com/~tkyte/flat/index.html，进去一看，PL/SQL的效率比SQL*Plus要高，缺点是生成的文件必须在主机上。SQL*Plus可以调整arraysize来提高效率（当然经我实践大数据量时还有内存泄露之虞）。Pro*C是高效的方法，缺点是需要写程序、编译。<br />
硬着头皮看Pro*C咯，好在Tom给了原始代码，抓下来放到一台Linux的机器上proc报错，应该是proc配置include库的问题，找到一个makefile，倒是没啥问题了，但是最后链接失败，报无法识别&#8217;sqlca&#8217;。到网上一搜，和我一样晕的人还有，要修改代码，多include进，但是看Tom的帖子似乎没提到这个问题，不知道为什么。<br />
下面是修改后的源代码，我顺便在里面修改了会话的一些参数，以处理中文和时间格式：</p>
<p><span id="more-157"></span></p>
<pre>#include

#include

#include

#include

#define MAX_VNAME_LEN     30

#define MAX_INAME_LEN     30

static char *   USERID = NULL;

static char *   SQLSTMT = NULL;

static char *   ARRAY_SIZE = "10";

#define vstrcpy( a, b ) \

(strcpy( a.arr, b ), a.len = strlen( a.arr ), a.arr)

EXEC SQL INCLUDE SQLCA;

EXEC SQL INCLUDE sqlda;

extern SQLDA *sqlald();

extern void   sqlclu();

static void die( char * msg )

{

fprintf( stderr, "%s\n", msg );

exit(1);

}

/*

this array contains a default mapping

I am using to constrain the

lengths of returned columns.  It is mapping,

for example, the Oracle

NUMBER type (type code = 2) to be 45 characters

long in a string.

*/

static int lengths[] =

{ -1, 0, 45, 0, 0, 0, 0, 0, 2000, 0, 0,

18, 25, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 512, 2000 };

static void process_parms( argc, argv )

int    argc;

char *    argv[];

{

int    i;

for( i = 1; i &lt; argc; i++ )

{

if ( !strncmp( argv[i], "userid=", 7 ) )

USERID = argv[i]+7;

else

if ( !strncmp( argv[i], "sqlstmt=", 8 ) )

SQLSTMT = argv[i]+8;

else

if ( !strncmp( argv[i], "arraysize=", 10 ) )

ARRAY_SIZE = argv[i]+10;

else

{

fprintf( stderr,

"usage: %s %s %s\n",

argv[0],

"userid=xxx/xxx sqlstmt=query ",

"arraysize=\n" );

exit(1);

}

}

if ( USERID == NULL  || SQLSTMT == NULL )

{

fprintf( stderr,

"usage: %s %s %s\n",

argv[0],

"userid=xxx/xxx sqlstmt=query ",

"arraysize=\n" );

exit(1);

}

}

static void sqlerror_hard()

{

EXEC SQL WHENEVER SQLERROR CONTINUE;

fprintf(stderr,"\nORACLE error detected:");

fprintf(stderr,"\n% .70s \n", sqlca.sqlerrm.sqlerrmc);

EXEC SQL ROLLBACK WORK RELEASE;

exit(1);

}

static SQLDA * process_1(char * sqlstmt, int array_size )

{

SQLDA *    select_dp;

int     i;

int        j;

int        null_ok;

int        precision;

int        scale;

int        size = 10;

fprintf( stderr, "Unloading '%s'\n", sqlstmt );

fprintf( stderr, "Array size = %d\n", array_size );

EXEC SQL WHENEVER SQLERROR DO sqlerror_hard();

EXEC SQL PREPARE S FROM :sqlstmt;

EXEC SQL DECLARE C CURSOR FOR S;

if ((select_dp = sqlald(size,MAX_VNAME_LEN,MAX_INAME_LEN))

== NULL )

die( "Cannot allocate  memory for select descriptor." );

select_dp-&gt;N = size;

EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;

if ( !select_dp-&gt;F ) return NULL;

if (select_dp-&gt;F &lt; 0)     {         size = -select_dp-&gt;F;

sqlclu( select_dp );

if ((select_dp =

sqlald (size, MAX_VNAME_LEN, MAX_INAME_LEN))

== NULL )

die( "Cannot allocate  memory for descriptor." );

EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;

}

select_dp-&gt;N = select_dp-&gt;F;

for (i = 0; i &lt; select_dp-&gt;N; i++)

select_dp-&gt;I[i] = (short *) malloc(sizeof(short) *

array_size );

for (i = 0; i &lt; select_dp-&gt;F; i++)

{

sqlnul (&amp;(select_dp-&gt;T[i]),

&amp;(select_dp-&gt;T[i]), &amp;null_ok);

if ( select_dp-&gt;T[i] &lt;                      sizeof(lengths)/sizeof(lengths[0]) )         {             if ( lengths[select_dp-&gt;T[i]] )

select_dp-&gt;L[i]  = lengths[select_dp-&gt;T[i]];

else select_dp-&gt;L[i] += 5;

}

else select_dp-&gt;L[i] += 5;

select_dp-&gt;T[i] = 5;

select_dp-&gt;V[i] = (char *)malloc( select_dp-&gt;L[i] *

array_size );

for( j = MAX_VNAME_LEN-1;

j &gt; 0 &amp;&amp; select_dp-&gt;S[i][j] == ' ';

j--);

fprintf (stderr,

"%s%.*s", i?",":"", j+1, select_dp-&gt;S[i]);

}

fprintf( stderr, "\n" );

EXEC SQL OPEN C;

return select_dp;

}

static void process_2( SQLDA * select_dp, int array_size )

{

int    last_fetch_count;

int        row_count = 0;

short    ind_value;

char    * char_ptr;

int    i,

j;

for ( last_fetch_count = 0;

;

last_fetch_count = sqlca.sqlerrd[2] )

{

EXEC SQL FOR :array_size FETCH C

USING DESCRIPTOR select_dp;

for( j=0; j &lt; sqlca.sqlerrd[2]-last_fetch_count; j++ )

{

for (i = 0; i &lt; select_dp-&gt;F; i++)

{

ind_value = *(select_dp-&gt;I[i]+j);

char_ptr  = select_dp-&gt;V[i] +

(j*select_dp-&gt;L[i]);

printf( "%s%s", i?",":"",

ind_value?"(null)":char_ptr );

}

row_count++;

printf( "\n" );

}

if ( sqlca.sqlcode &gt; 0 ) break;

}

sqlclu(select_dp);

EXEC SQL CLOSE C;

EXEC SQL COMMIT WORK;

fprintf( stderr, "%d rows extracted\n", row_count );

}

main( argc, argv )

int    argc;

char *    argv[];

{

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR   oracleid[50];

EXEC SQL END DECLARE SECTION;

SQLDA    * select_dp;

process_parms( argc, argv );

/* Connect to ORACLE. */

vstrcpy( oracleid, USERID );

EXEC SQL WHENEVER SQLERROR DO sqlerror_hard();

EXEC SQL CONNECT <img src='http://www.readern.com/wordpress/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> racleid;

fprintf(stderr, "\nConnected to ORACLE as user: %s\n\n",

oracleid.arr);

EXEC SQL ALTER SESSION

SET NLS_DATE_FORMAT = 'YYYYMMDDHH24:MI:SS';

EXEC SQL ALTER SESSION

SET NLS_LANGUAGE = "SIMPLIFIED CHINESE";

select_dp = process_1( SQLSTMT, atoi(ARRAY_SIZE) );

process_2( select_dp , atoi(ARRAY_SIZE));

/* Disconnect from ORACLE. */

EXEC SQL COMMIT WORK RELEASE;

exit(0);

}</pre>
<p>顺便附上我的makefile，在RHEL AS3上用的：</p>
<pre>
CC=gcc
LD=ld
OBJ=obj/

##########数据库编译选项###########
PROCFLAGS=unsafe_null=yes dynamic=ansi mode=oracle dbms=V8 parse=full\
release_cursor=no sqlcheck=SEMANTICS ireclen=512 include=./.\
sys_include=/usr/include sys_include=/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/include \
def_sqlcode=yes

INCL=-I/usr/include -I./. -I${ORACLE_HOME}/precomp/public
BIN_LIBS= -lc -L${ORACLE_HOME}/lib -lclntsh

##########编译规则################
.SUFFIXES: .pc .o .c
.c.o:
${CC} -g -c $*.c ${INCL}

.pc.o:
proc $(PROCFLAGS) iname=$*.pc
$(CC) -g -c $*.c ${INCL}
rm -f $*.c $*.lis

all:unload

unload:unload.o
rm -f $@
${CC} -o $@ unload.o  \
$(BIN_LIBS)

#########################################################
#编译公用目标文件
#########################################################

########清理目标文件###########################
clean:
rm -f *.o *.lis
</pre>
<p>编译以后生成unload程序，执行如下：</p>
<pre>
unload userid=XXX/XXX sqlstmt='select * from dual' arraysize=100&gt;XXX.DAT
</pre>
<p>这样DAT文件里就是数据了。</p>
<p>经我测试，在数据库主机上，30分钟导出了7GB的文件，强啊！效率上可以调整的一个是arraysize参数，这个一般100-200都可以，更大的除非你IO超强，不然也没有意义；另一个是所谓并行，其实这个C程序也就是执行SELECT语句，因此将原表改为PARALLEL就可以充分利用系统资源了^_^。</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html">Permalink</a> |
<a href="http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html&title=[重发]Pro*C实现导出Oracle表为文本文件">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/oracle" rel="tag">Oracle</a>, <a href="http://www.readern.com/tag/%e5%af%bc%e5%87%ba" rel="tag">导出</a>, <a href="http://www.readern.com/tag/%e6%96%87%e6%9c%ac%e6%96%87%e4%bb%b6" rel="tag">文本文件</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/export-oracle-table-to-flat-text-in-proc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Mobile同步利器——SyncMate</title>
		<link>http://www.readern.com/syncmate.html</link>
		<comments>http://www.readern.com/syncmate.html#comments</comments>
		<pubDate>Tue, 30 Jun 2009 06:49:06 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[咬口苹果]]></category>
		<category><![CDATA[MAC OS X]]></category>
		<category><![CDATA[USB]]></category>
		<category><![CDATA[wifi]]></category>
		<category><![CDATA[Windows Mobile]]></category>
		<category><![CDATA[同步]]></category>
		<category><![CDATA[导入]]></category>
		<category><![CDATA[导出]]></category>
		<category><![CDATA[软件推荐]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=93</guid>
		<description><![CDATA[用上了苹果的本子，却还无法把手机换成iPhone，谁让它没CDMA制式的呢？自然也就没有了进一步体验苹果产品整合性的机会。不过咱们Windows Mobile的机器也可以和MAC OS X同步哦，我的要求很简单，能保持通讯录就好，但是SyncMate这款软件还能做得更多。 第一步自然是下载SyncMate进行安装。SyncMate是一个免费软件，也有收费的Expert版本。Expert版本就增加了与更多软件（包括iTunes等）的直接同步功能。不过后面我会提到，其实iTunes可以自己调用通讯录等的，所以免费版本已经满足我了。 安装之后第一次的连接，需要通过USB。启动程序以后，把你的手机插上USB线连接电脑，记得在手机上选择ActiveSync模式，此时你的电脑可能会识别到一个新的网络接口，这是因为手机支持Modem功能，能够让你的电脑通过它上网。现在可以忽略。等待片刻以后会发现你的手机提示你安装软件，这就是SyncMate的客户端了。 客户端装上以后就可以点程序里的Connect了，下面就看图吧。 上图就是选择同步通讯录，可以选择双向同步（此时会提示你如何同步），也可以选择电脑至手机或手机至电脑单向。点击“Sync Now”就开始同步了。完成之后打开你电脑的“地址簿”应该就可以看到信息啦。其中包括了人名、电话、公司等多种信息。 顺便说一句，如果你需要同步到你的iPhone/iPod Touch里，那打开iTunes，选择同步地址簿就可以了。地址簿本身也支持导出vCard等等，还是比较强大的。另外SyncMate也支持同步日程、书签等等。 其实也有其他更强大的软件实现Windows Mobile手机的管理，不过这个免费的我觉得也够用了。希望你喜欢。 © ern for Read ERN, 2009. &#124; Permalink &#124; No comment &#124; Add to del.icio.us Post tags: MAC OS X, USB, wifi, Windows Mobile, 同步, 导入, 导出, 软件推荐 Feed enhanced by Better Feed from Ozh]]></description>
			<content:encoded><![CDATA[<p>用上了苹果的本子，却还无法把手机换成iPhone，谁让它没CDMA制式的呢？自然也就没有了进一步体验苹果产品整合性的机会。不过咱们Windows Mobile的机器也可以和MAC OS X同步哦，我的要求很简单，能保持通讯录就好，但是SyncMate这款软件还能做得更多。</p>
<p>第一步自然是<a href="http://mac.eltima.com/sync-mac.html" target="_blank">下载SyncMate</a>进行安装。SyncMate是一个免费软件，也有收费的Expert版本。Expert版本就增加了与更多软件（包括iTunes等）的直接同步功能。不过后面我会提到，其实iTunes可以自己调用通讯录等的，所以免费版本已经满足我了。</p>
<p>安装之后第一次的连接，需要通过USB。启动程序以后，把你的手机插上USB线连接电脑，记得在手机上选择ActiveSync模式，此时你的电脑可能会识别到一个新的网络接口，这是因为手机支持Modem功能，能够让你的电脑通过它上网。现在可以忽略。等待片刻以后会发现你的手机提示你安装软件，这就是SyncMate的客户端了。</p>
<p>客户端装上以后就可以点程序里的Connect了，下面就看图吧。</p>
<p><a class="tt-flickr" href="http://www.flickr.com/photos/yaoyp/3797530623"><img class="tt-flickr" src="http://farm3.static.flickr.com/2522/3797530623_0d8e29aba8.jpg" alt="SyncMate1" width="500" height="405" /></a></p>
<p><a class="tt-flickr" href="http://www.flickr.com/photos/yaoyp/3797530811"><img class="tt-flickr" src="http://farm3.static.flickr.com/2653/3797530811_5212bccf4d.jpg" alt="SyncMate2" width="500" height="401" /></a></p>
<p>上图就是选择同步通讯录，可以选择双向同步（此时会提示你如何同步），也可以选择电脑至手机或手机至电脑单向。点击“Sync Now”就开始同步了。完成之后打开你电脑的“地址簿”应该就可以看到信息啦。其中包括了人名、电话、公司等多种信息。</p>
<p>顺便说一句，如果你需要同步到你的iPhone/iPod Touch里，那打开iTunes，选择同步地址簿就可以了。地址簿本身也支持导出vCard等等，还是比较强大的。另外SyncMate也支持同步日程、书签等等。</p>
<p>其实也有其他更强大的软件实现Windows Mobile手机的管理，不过这个免费的我觉得也够用了。希望你喜欢。</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/syncmate.html">Permalink</a> |
<a href="http://www.readern.com/syncmate.html#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/syncmate.html&title=Windows Mobile同步利器——SyncMate">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/mac-os-x" rel="tag">MAC OS X</a>, <a href="http://www.readern.com/tag/usb" rel="tag">USB</a>, <a href="http://www.readern.com/tag/wifi" rel="tag">wifi</a>, <a href="http://www.readern.com/tag/windows-mobile" rel="tag">Windows Mobile</a>, <a href="http://www.readern.com/tag/%e5%90%8c%e6%ad%a5" rel="tag">同步</a>, <a href="http://www.readern.com/tag/%e5%af%bc%e5%85%a5" rel="tag">导入</a>, <a href="http://www.readern.com/tag/%e5%af%bc%e5%87%ba" rel="tag">导出</a>, <a href="http://www.readern.com/tag/%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90" rel="tag">软件推荐</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/syncmate.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQLDeveloper的一些bug</title>
		<link>http://www.readern.com/sqldeveloper-bugs-and-tricks.html</link>
		<comments>http://www.readern.com/sqldeveloper-bugs-and-tricks.html#comments</comments>
		<pubDate>Wed, 06 May 2009 13:18:53 +0000</pubDate>
		<dc:creator>ern</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[SQLDeveloper]]></category>
		<category><![CDATA[导入]]></category>
		<category><![CDATA[导出]]></category>

		<guid isPermaLink="false">http://www.readern.com/?p=52</guid>
		<description><![CDATA[虽然不搞数据库了，不过最近做些分析的时候还是祭出了Oracle这把牛刀，顺便用了下Oracle的这款官方工具。我用的最新版本是1.5.4，出乎意料的强大。唯一不好是基于Java的，对大数据量导入导出想必是不行的（除非有超大内存做后盾）。过程中也发现了不少bug，不过到官方论坛瞄了瞄，还是有开发人员重视的。 导出结果为Excel（XLS文件）可能遇到ORA－00936。似乎问题是出在解析语句上，如果你的SELECT中存在比如a.*的别名前缀，那么就会触发这个bug。暂时的解决方法有两个，一是重写你的语句，去掉别名前缀（两表关联时候有点麻烦了）；再就是把你的结果建成一张表，到时候直接导出表就可以了。 与中文输入法偶有冲突。在用QIM，如果进入SQLDeveloper时是英文输入，打开程序才切换到中文输入，似乎就一切OK；如果打开前就是中文输入，很大机会只能输入英文了，无法输入中文。 导入Excel文件时要注意，首行可以冻结，但是不能筛选，否则认不到整个表格。 不支持导入导出LONG一类的字段。这个大概算功能问题吧，倒也不能完全说是bug。 另外还有一个始终萦绕非Windows系统的字符集问题。在我的MAC OS X 10.5.6上推荐保存导出的Excel和SQL脚本为UTF－8，否则和文本编辑器（比如TextWrangler）可能有些冲突。导出的UTF－8文件在Windows Office 2007是可以正常打开的。 © ern for Read ERN, 2009. &#124; Permalink &#124; No comment &#124; Add to del.icio.us Post tags: bug, excel, export, import, Oracle, SQLDeveloper, 导入, 导出 Feed enhanced by Better Feed from Ozh]]></description>
			<content:encoded><![CDATA[<p>虽然不搞数据库了，不过最近做些分析的时候还是祭出了Oracle这把牛刀，顺便用了下Oracle的这款官方工具。我用的最新版本是1.5.4，出乎意料的强大。唯一不好是基于Java的，对大数据量导入导出想必是不行的（除非有超大内存做后盾）。过程中也发现了不少bug，不过到<a href="http://forums.oracle.com/forums/forum.jspa?forumID=260" target="_blank">官方论坛</a>瞄了瞄，还是有开发人员重视的。</p>
<ol>
<li>导出结果为Excel（XLS文件）可能遇到ORA－00936。似乎问题是出在解析语句上，如果你的SELECT中存在比如a.*的别名前缀，那么就会触发这个bug。暂时的解决方法有两个，一是重写你的语句，去掉别名前缀（两表关联时候有点麻烦了）；再就是把你的结果建成一张表，到时候直接导出表就可以了。</li>
<li>与中文输入法偶有冲突。在用QIM，如果进入SQLDeveloper时是英文输入，打开程序才切换到中文输入，似乎就一切OK；如果打开前就是中文输入，很大机会只能输入英文了，无法输入中文。</li>
<li>导入Excel文件时要注意，首行可以冻结，但是不能筛选，否则认不到整个表格。</li>
<li>不支持导入导出LONG一类的字段。这个大概算功能问题吧，倒也不能完全说是bug。</li>
</ol>
<p>另外还有一个始终萦绕非Windows系统的字符集问题。在我的MAC OS X 10.5.6上推荐保存导出的Excel和SQL脚本为UTF－8，否则和文本编辑器（比如TextWrangler）可能有些冲突。导出的UTF－8文件在Windows Office 2007是可以正常打开的。</p>
<hr />
<p><small>© ern for <a href="http://www.readern.com">Read ERN</a>, 2009. |
<a href="http://www.readern.com/sqldeveloper-bugs-and-tricks.html">Permalink</a> |
<a href="http://www.readern.com/sqldeveloper-bugs-and-tricks.html#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.readern.com/sqldeveloper-bugs-and-tricks.html&title=SQLDeveloper的一些bug">del.icio.us</a>
<br/>
Post tags: <a href="http://www.readern.com/tag/bug" rel="tag">bug</a>, <a href="http://www.readern.com/tag/excel" rel="tag">excel</a>, <a href="http://www.readern.com/tag/export" rel="tag">export</a>, <a href="http://www.readern.com/tag/import" rel="tag">import</a>, <a href="http://www.readern.com/tag/oracle" rel="tag">Oracle</a>, <a href="http://www.readern.com/tag/sqldeveloper" rel="tag">SQLDeveloper</a>, <a href="http://www.readern.com/tag/%e5%af%bc%e5%85%a5" rel="tag">导入</a>, <a href="http://www.readern.com/tag/%e5%af%bc%e5%87%ba" rel="tag">导出</a><br/>
</small></p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.readern.com/sqldeveloper-bugs-and-tricks.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

