﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-闵毓-随笔分类-数据库心得与体会</title><link>http://www.blogjava.net/shmily432685/category/4005.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 17 Oct 2007 00:40:57 GMT</lastBuildDate><pubDate>Wed, 17 Oct 2007 00:40:57 GMT</pubDate><ttl>60</ttl><item><title>mysql快速批量导入文本数据</title><link>http://www.blogjava.net/shmily432685/archive/2007/10/16/153329.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Tue, 16 Oct 2007 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2007/10/16/153329.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/153329.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2007/10/16/153329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/153329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/153329.html</trackback:ping><description><![CDATA[<p>近日有一文本文件，数据格式是以tab分割。数据量有数千万条数据，需要导入mysql数据库中，通过传统的方式进行拷贝到数据库中，需要花费很多天时间，中间也会出现很多错误，未必能导入成功。<br />
使用：load data local infile "本地路径" into table 表名命令方式进行导入，10w条数据也只需要花费几秒钟时间，可中文无法导入。<br />
仔细分析了一下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;建库时采用utf8编码，表也是utf8编码。对中文应该是支持的。排除数据库的问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;只能从要导入的文本文件考虑，将其编码用ultraEdit转换编码为utf8后，进行导入，成功导入。数据也没有出现错误。&nbsp;</p>
也可采用select * from&nbsp;表名 into outfile "c:\\文件路径";进行查询；进行导出表中的数据为文本文件格式。 <br />
也可以采用select * from&nbsp;表名 into outfile "c:\\stu_t.txt" lines terminated by '\r\n';进行查询，导出。<img src ="http://www.blogjava.net/shmily432685/aggbug/153329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2007-10-16 17:10 <a href="http://www.blogjava.net/shmily432685/archive/2007/10/16/153329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle经常使用到的函数</title><link>http://www.blogjava.net/shmily432685/archive/2006/02/14/30558.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Tue, 14 Feb 2006 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2006/02/14/30558.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/30558.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2006/02/14/30558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/30558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/30558.html</trackback:ping><description><![CDATA[<P class=content style="MARGIN: 4px 2px 0px">PL/SQL单行函数和组函数详解<BR>　函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数，这些函数都可被称为SQL或PL/SQL语句，函数主要分为两大类：<BR><BR>　　 单行函数<BR><BR>　　 组函数 <BR><BR>　　本文将讨论如何利用单行函数以及使用规则。<BR><BR>　　SQL中的单行函数<BR><BR>　　SQL和PL/SQL中自带很多类型的函数，有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据，因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中，例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。<BR>SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)<BR><BR>　　单行函数也可以在其他语句中使用，如update的SET子句，INSERT的VALUES子句，DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数，所以我们的注意力也集中在SELECT语句中。<BR><BR>　　NULL和单行函数<BR><BR>　　在如何理解NULL上开始是很困难的，就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值，算术操作符的任何一个操作数为NULL值，结果均为提个NULL值,这个规则也适合很多函数，只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的，因为他能直接处理NULL值，NVL有两个参数：NVL(x1,x2),x1和x2都式表达式，当x1为null时返回X2,否则返回x1。<BR><BR>　　下面我们看看emp数据表它包含了薪水、奖金两项，需要计算总的补偿<BR>column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2<BR><BR>　　不是简单的将薪水和奖金加起来就可以了，如果某一行是null值那么结果就将是null，比如下面的例子：<BR>update empset salary=(salary+bonus)*1.1<BR><BR>　　这个语句中，雇员的工资和奖金都将更新为一个新的值，但是如果没有奖金，即 salary + null,那么就会得出错误的结论，这个时候就要使用nvl函数来排除null值的影响。<BR>所以正确的语句是：<BR>update empset salary=(salary+nvl(bonus,0)*1.1<BR>单行字符串函数<BR><BR>　　单行字符串函数用于操作字符串数据，他们大多数有一个或多个参数，其中绝大多数返回字符串<BR><BR>　　ASCII()<BR>　　c1是一字符串，返回c1第一个字母的ASCII码，他的逆函数是CHR()<BR>SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122<BR><BR>　　CHR(＜i＞)[NCHAR_CS]<BR>　　i是一个数字，函数返回十进制表示的字符<BR>select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B<BR><BR>　　CONCAT(,)<BR>　　c1,c2均为字符串，函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同<BR>select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda<BR><BR>　　INITCAP()<BR>　　c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号限制。<BR>select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici<BR><BR>　　INSTR(,[,＜i＞[,]])<BR>　　c1,c2均为字符串，i,j为整数。函数返回c2在c1中第j次出现的位置，搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右，i和j的缺省值为1.<BR>select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2<BR><BR>　　INSTRB(,[,i[,j])<BR>　　与INSTR（）函数一样，只是他返回的是字节，对于单字节INSTRB()等于INSTR()<BR><BR>　　LENGTH()<BR>　　c1为字符串，返回c1的长度，如果c1为null，那么将返回null值。<BR>select LENGTH('Ipso Facto') ergo from dualergo10<BR><BR>　　LENGTHb()<BR>　　与LENGTH()一样，返回字节。<BR><BR>　　lower()<BR>　　返回c的小写字符，经常出现在where子串中<BR>select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite<BR><BR>　　LPAD(,＜i＞[,])<BR>　　c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格，参见RPAD。<BR>select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe<BR><BR>　　LTRIM(,)<BR>　　把c1中最左边的字符去掉，使其第一个字符不在c2中，如果没有c2，那么c1就不会改变。<BR>select LTRIM('Mississippi','Mis') from dualLTRppi<BR><BR>　　RPAD(,＜i＞[,]) <BR>　　在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格,其他与LPAD相似<BR><BR>　　RTRIM(,)<BR>　　把c1中最右边的字符去掉，使其第后一个字符不在c2中，如果没有c2，那么c1就不会改变。<BR><BR>　　REPLACE(,[,])<BR>　　c1,c2,c3都是字符串，函数用c3代替出现在c1中的c2后返回。<BR>select REPLACE('uptown','up','down') from dualREPLACEdowntown<BR><BR>　　STBSTR(,＜i＞[,])<BR>　　c1为一字符串，i,j为整数，从c1的第i位开始返回长度为j的子字符串，如果j为空，则直到串的尾部。<BR>select SUBSTR('Message',1,4) from dualSUBSMess<BR><BR>　　SUBSTRB(,＜i＞[,])<BR>　　与SUBSTR大致相同，只是I,J是以字节计算。<BR><BR>　　SOUNDEX()<BR>　　返回与c1发音相似的词<BR>select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250<BR><BR>　　TRANSLATE(,,)<BR>　　将c1中与c2相同的字符以c3代替<BR>select TRANSLATE('fumble','uf','ar') test from dualTEXTramble <BR><BR>　　TRIM([[]] from c3)<BR>　　将c3串中的第一个，最后一个，或者都删除。<BR>select TRIM(' space padded ') trim from dual TRIMspace padded<BR><BR>　　UPPER()<BR>　　返回c1的大写，常出现where子串中<BR>select name from dual where UPPER(name) LIKE 'KI%'NAMEKING<BR>单行数字函数<BR><BR>　　单行数字函数操作数字数据，执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作数和值都是弧度而不是角度，oracle没有提供内建的弧度和角度的转换函数。<BR><BR>　　ABS()<BR>　　返回n的绝对值<BR><BR>　　ACOS()<BR>　　反余玄函数，返回-1到1之间的数。n表示弧度<BR>select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0 <BR><BR>　　ASIN()<BR>　　反正玄函数，返回-1到1，n表示弧度<BR><BR>　　ATAN()<BR>　　反正切函数，返回n的反正切值，n表示弧度。<BR><BR>　　CEIL()<BR>　　返回大于或等于n的最小整数。<BR><BR>　　COS()<BR>　　返回n的余玄值，n为弧度<BR><BR>　　COSH()<BR>　　返回n的双曲余玄值，n 为数字。<BR>select COSH(&lt;1.4&gt;) FROM dualCOSH(1.4)2.15089847<BR><BR>　　EXP()<BR>　　返回e的n次幂，e=2.71828183.<BR><BR>　　FLOOR()<BR>　　返回小于等于N的最大整数。<BR><BR>　　LN()<BR>　　返回N的自然对数，N必须大于0<BR><BR>　　LOG(,)<BR>　　返回以n1为底n2的对数<BR><BR>　　MOD()<BR>　　返回n1除以n2的余数，<BR><BR>　　POWER(,)<BR>　　返回n1的n2次方<BR><BR>　　ROUND(,)<BR>　　返回舍入小数点右边n2位的n1的值，n2的缺省值为0，这回将小数点最接近的整数，如果n2为负数就舍入到小数点左边相应的位上，n2必须是整数。<BR>select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54<BR><BR>　　SIGN()<BR>　　如果n为负数，返回-1,如果n为正数，返回1，如果n=0返回0.<BR><BR>　　SIN（)<BR>　　返回n的正玄值,n为弧度。<BR><BR>　　SINH()<BR>　　返回n的双曲正玄值,n为弧度。<BR><BR>　　SQRT()<BR>　　返回n的平方根,n为弧度<BR><BR>　　TAN（)<BR>　　返回n的正切值,n为弧度<BR><BR>　　TANH()<BR>　　返回n的双曲正切值,n为弧度<BR><BR>　　TRUNC(,)<BR>　　返回截尾到n2位小数的n1的值，n2缺省设置为0，当n2为缺省设置时会将n1截尾为整数，如果n2为负值，就截尾在小数点左边相应的位上。<BR><BR>　　单行日期函数<BR><BR>　　单行日期函数操作DATA数据类型，绝大多数都有DATA数据类型的参数，绝大多数返回的也是DATA数据类型的值。<BR><BR>　　ADD_MONTHS(,＜i＞)<BR>　　返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数，那么数据库将隐式的他转换成整数，将会截去小数点后面的部分。<BR><BR>　　LAST_DAY()<BR>　　函数返回包含日期d的月份的最后一天 <BR><BR>　　MONTHS_BETWEEN(,)<BR>　　返回d1和d2之间月的数目,如果d1和d2的日的日期都相同，或者都使该月的最后一天，那么将返回一个整数，否则会返回的结果将包含一个分数。<BR><BR>　　NEW_TIME(,,)<BR>　　d1是一个日期数据类型，当时区tz1中的日期和时间是d时，返回时区tz2中的日期和时间。tz1和tz2时字符串。<BR><BR>　　NEXT_DAY(,)<BR>　　返回日期d后由dow给出的条件的第一天，dow使用当前会话中给出的语言指定了一周中的某一天，返回的时间分量与d的时间分量相同。<BR>select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004 <BR><BR>　　ROUND([,])<BR>　　将日期d按照fmt指定的格式舍入，fmt为字符串。<BR><BR>　　SYADATE<BR>　　函数没有参数，返回当前日期和时间。<BR><BR>　　TRUNC([,]) <BR>　　返回由fmt指定的单位的日期d.<BR>单行转换函数<BR><BR>　　单行转换函数用于操作多数据类型，在数据类型之间进行转换。<BR><BR>　　CHARTORWID()<BR>　　c 使一个字符串，函数将c转换为RWID数据类型。<BR>SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA') <BR><BR>　　CONVERT(,[,])<BR>　　c尾字符串，dset、sset是两个字符集，函数将字符串c由sset字符集转换为dset字符集，sset的缺省设置为数据库的字符集。<BR><BR>　　HEXTORAW()<BR>　　x为16进制的字符串，函数将16进制的x转换为RAW数据类型。<BR><BR>　　RAWTOHEX()<BR>　　x是RAW数据类型字符串，函数将RAW数据类转换为16进制的数据类型。<BR><BR>　　ROWIDTOCHAR()<BR>　　函数将ROWID数据类型转换为CHAR数据类型。<BR><BR>　　TO_CHAR([[,)<BR>　　x是一个data或number数据类型，函数将x转换成fmt指定格式的char数据类型，如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符，以及货币符号。<BR>NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"<BR><BR>　　TO_DATE([,[,）<BR>　　c表示字符串，fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。<BR><BR>　　TO_MULTI_BYTE()<BR>　　c表示一个字符串，函数将c的担子截字符转换成多字节字符。<BR><BR>　　TO_NUMBER([,[,)<BR>　　c表示字符串，fmt表示一个特殊格式的字符串，函数返回值按照fmt指定的格式显示。nlsparm表示语言，函数将返回c代表的数字。<BR><BR>　　TO_SINGLE_BYTE()<BR>　　将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用<BR><BR>　　其它单行函数<BR><BR>　　BFILENAME( <BR>,)<BR>　　dir是一个directory类型的对象，file为一文件名。函数返回一个空的BFILE位置值指示符，函数用于初始化BFILE变量或者是BFILE列。<BR><BR>　　DECODE(,,[,,,[])<BR>　　x是一个表达式，m1是一个匹配表达式，x与m1比较，如果m1等于x，那么返回r1,否则,x与m2比较，依次类推m3,m4,m5....直到有返回结果。<BR><BR>　　DUMP(,[,[,[,]]])<BR>　　x是一个表达式或字符，fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。<BR><BR>　　EMPTY_BLOB()<BR>　　该函数没有参数，函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。<BR><BR>　　EMPTY_CLOB()<BR>　　该函数没有参数，函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。<BR><BR>　　GREATEST()<BR>　　exp_list是一列表达式，返回其中最大的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，那么返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。<BR><BR>　　LEAST()<BR>　　exp_list是一列表达式，返回其中最小的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，将返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。<BR><BR>　　UID<BR>　　该函数没有参数，返回唯一标示当前数据库用户的整数。<BR><BR>　　USER<BR>　　返回当前用户的用户名<BR><BR>　　USERENV()<BR>　　基于opt返回包含当前会话信息。opt的可选值为：<BR><BR>　　ISDBA　 　　会话中SYSDBA脚色响应，返回TRUE <BR>　　SESSIONID 　返回审计会话标示符<BR>　　ENTRYID 　　返回可用的审计项标示符 <BR>　　INSTANCE　　在会话连接后，返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。<BR>　　LANGUAGE　　返回语言、地域、数据库设置的字符集。<BR>　　LANG　　　　返回语言名称的ISO缩写。<BR>　　TERMINAL　　为当前会话使用的终端或计算机返回操作系统的标示符。<BR><BR>　　VSIZE()<BR>　　x是一个表达式。返回x内部表示的字节数。<BR>SQL中的组函数<BR><BR>　　组函数也叫集合函数，返回基于多个行的单一结果，行的准确数量无法确定，除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是，在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.<BR><BR>　　组（多行）函数<BR><BR>　　与单行函数相比，oracle提供了丰富的基于组的，多行的函数。这些函数可以在select或select的having子句中使用，当用于select子串时常常都和GROUP BY一起使用。<BR><BR>　　AVG([{DISYINCT|ALL}])<BR>　　返回数值的平均值。缺省设置为ALL.<BR>SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413<BR><BR>　　COUNT({*|DISTINCT|ALL} )<BR>　　返回查询中行的数目，缺省设置是ALL,*表示返回所有的行。<BR><BR>　　MAX([{DISTINCT|ALL}])<BR>　　返回选择列表项目的最大值，如果x是字符串数据类型，他返回一个VARCHAR2数据类型，如果X是一个DATA数据类型，返回一个日期，如果X是numeric数据类型，返回一个数字。注意distinct和all不起作用，应为最大值与这两种设置是相同的。<BR><BR>　　MIN([{DISTINCT|ALL}])<BR>　　返回选择列表项目的最小值。<BR><BR>　　STDDEV([{DISTINCT|ALL}])<BR>　　返回选者的列表项目的标准差，所谓标准差是方差的平方根。<BR><BR>　　SUM([{DISTINCT|ALL}])<BR>　　返回选择列表项目的数值的总和。<BR><BR>　　VARIANCE([{DISTINCT|ALL}])<BR>　　返回选择列表项目的统计方差。<BR><BR>　　用GROUP BY给数据分组<BR><BR>　　正如题目暗示的那样组函数就是操作那些已经分好组的数据，我们告诉数据库用GROUP BY怎样给数据分组或者分类，当我们在SELECT语句的SELECT子句中使用组函数时，我们必须把为分组或非常数列放置在GROUP BY子句中，如果没有用group by进行专门处理，那么缺省的分类是将整个结果设为一类。<BR>select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982<BR><BR>　　在这个例子中，我们用state字段分类；如果我们要将结果按照zip_codes排序,可以用ORDER BY语句，ORDER BY子句可以使用列或组函数。<BR>select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982<BR><BR>　　用HAVING子句限制分组数据<BR><BR>　　现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数，组函数只能用于两个子串中，组函数不能用于WHERE子串中，例如下面的查询是错误的：<BR>错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)&gt;10000 GROUP BY sales_clerk<BR><BR>　　这个语句中数据库不知道SUM()是什么，当我们需要指示数据库对行分组，然后限制分组后的行的输出时，正确的方法是使用HAVING语句：<BR>SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)&gt;10000;<BR><BR>　　嵌套函数<BR><BR>　　函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置，函数遵循由内到外，由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。<BR><BR>　　嵌套函数可以包括在组函数中嵌套单行函数，或者组函数嵌套入单行函数或组函数中。比如下面的例子：<BR>SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2 </P><img src ="http://www.blogjava.net/shmily432685/aggbug/30558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2006-02-14 10:45 <a href="http://www.blogjava.net/shmily432685/archive/2006/02/14/30558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH操作linux的weblogic、oracle的指令语法</title><link>http://www.blogjava.net/shmily432685/archive/2005/11/01/17660.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Tue, 01 Nov 2005 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2005/11/01/17660.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/17660.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2005/11/01/17660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/17660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/17660.html</trackback:ping><description><![CDATA[<STRONG><FONT size=5>weblogic</FONT></STRONG><BR>1、建立连接：su-weblogic后根据提示输入密码。<BR>2、进入启动目录<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cd bea<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ls :查看目录下文件。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cd user_projects ：进入配置相关项目目录。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据提示进入相关目录如下：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cd domains<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cd mydomain<BR>3、停止WebLogic服务：./stopWebLogic.sh<BR>4、启动WebLogic服务：./startWebLogic.sh<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后台启动服务：nohup sh startWebLogic.sh &gt;log1026 &amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看启动服务后的日志：tail -f &nbsp;log1026<BR>5、查看文件下的.xml文件，vi 文件名<BR>6、修改文件：insert<BR>7、结束修改：按Esc键后,q,退出，wq保存退出，w保存不退出。<BR><STRONG><FONT size=5>Oracle<BR></FONT></STRONG>1、进入oracle：su - oracle后根据密码提示输入密码。<BR>2、进入sqlplus：sqlplus /nolog<BR>3、连接oracle服务器：connect 用户名/密码<BR><BR><img src ="http://www.blogjava.net/shmily432685/aggbug/17660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2005-11-01 12:05 <a href="http://www.blogjava.net/shmily432685/archive/2005/11/01/17660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle数据库移植时字符集问题的解决</title><link>http://www.blogjava.net/shmily432685/archive/2005/10/28/17185.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Fri, 28 Oct 2005 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2005/10/28/17185.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/17185.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2005/10/28/17185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/17185.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/17185.html</trackback:ping><description><![CDATA[<TABLE class=showinfo style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=0 cellPadding=3 width="100%" align=center border=0>
<TBODY>
<TR>
<TD class=showTitle align=middle>
<P>&nbsp;</P></TD></TR>
<TR>
<TD><FONT size=2>对于oracle数据库之间的移植采用oracle的导入导出工具(import/export)是一个比较好的策略。虽也可以利用第三方软件如sybase 的power designer中的reverse engineering 进行数据库结构重建，然后在进行较复杂的数据导入过程，但对于作业队列、快照等则不得不用手工来创建。而export能将整个数据库、指定用户、指定表和相关的数据字典进行输出，export输出的输出转存二进制文件包括了完全重建所有被选对象所需的命令。 </FONT>
<P><FONT size=2>本人在为某电厂mis(oracle数据库)数据采用oracle的导入导出工具从windows nt平台移植到digital unix平台时遇到的关于字符集的问题和总结出的经验与大家来分享。 </FONT></P>
<P><FONT size=2>1. 移植环境 <BR>原操作系统平台： windows nt <BR>数据库： oracle 8.0.5 for windows nt <BR>服务器：hp netserver lh3 <BR>目标操作系统平台：digital unix alpha v4.0 <BR>数据库：oracle 8.0.4 for digital unix <BR>服务器：alphaserver es40 小型机 </FONT></P>
<P><FONT size=2>2. 数据导出 <BR>在nt服务器上用oracle导出工具进行数据导出,oracle导出工具有命令行和图形界面两种方式。 <BR>本人直接用命令行方式进行数据导出： <BR>c:&gt; exp80 gxmisdba/manager file=c:expdat.dmp log=c:export.log <BR>即将导出指定的用户... <BR>. 正在导出用户gxmisdba的外部函数程序库名称 <BR>. 正在导出用户gxmisdba的对象类型定义 <BR>即将导出gxmisdba的对象 ... <BR>. 正在导出数据库链接 <BR>. 正在导出序号 <BR>. 正在导出群集定义 <BR>. 即将导出gxmisdba的表通过常规路径 ... <BR>. . 正在导出表 　　　　aaaaa 　　　　　　　　　0 行被导出 <BR>. . 正在导出表 　evt_carrier_configuration 　　0 行被导出 <BR>. . 正在导出表 　　　tbl_aj_agks 　　　　　　331 行被导出 <BR>　　. <BR>　　. <BR>　　. <BR>. 正在导出同义词 <BR>. 正在导出视图 <BR>. 正在导出存储的过程 <BR>. 正在导出参考资料一致性约束条件 <BR>. 正在导出触发器 <BR>. 正在导出后期表活动 <BR>. 正在导出快照 <BR>. 正在导出快照日志 <BR>. 正在导出作业队列 <BR>. 正在导出刷新组和子组 <BR>在没有警告的情况下成功终止导出。 </FONT></P>
<P><FONT size=2>3.数据导入 <BR>在nt服务器上通过ftp命令将导出的输出转存二进制文件expdat.dmp(使用binary传输模式)传输至digital unix服务器上。 <BR>用oracle for digital unix 数据导入工具命令行方式进行数据导入 <BR>$imp gxmisdba/manager file=/expdat.dmp full=y log=u01import.log <BR>connected to: oracle8 enterprise edition release 8.0.4.0.0 - production <BR>pl/sql release 8.0.4.0.0 - production <BR>export file created by export:v08.00.05 via conventional path <BR>. importing gxmisdbas objects into gxmisdba <BR>. . importing table 　　"aaaaa" 　　　　　　　　　　　0 rows imported <BR>. . importing table 　"evt_carrier_configuration" 　　0 rows imported <BR>. . importing table 　　"tbl_aj_stk" 　　　　　　　 331 rows imported <BR>imp-00017: following statement failed with oracle error 2437: <BR>"alter table "tbl_kj_jlry" add constraint "pk_tbl_kj_jlry" primary key ("fld_kj_jlry_bh","fld_kj_jlry_xm") using index pctfree 10 initrans 2 maxtrans 255 storage (initial 10240 next 10240 minextents 1 maxextents 2147483645 pctincrease 50 freelists 1 freelist groups 1 buffer_pool default)" <BR>"　　　　　　enable novalidate" <BR>imp-00003: oracle error 2437 encountered <BR>ora-02437: cannot enable (gxmisdba.pk_tbl_kj_jlry) - primary key violated <BR>. <BR>. <BR>. <BR>import terminated successfully with warnings. <BR>数据导入出现20多个以上类似错误，后分析其中报错的"tbl_aj_stk"表，发现"fld_kj_jlry_xm"字段值(关键字组成之一)为中文字符而在digital unix服务器oracle数据库中"fld_kj_jlry_xm"字段值显示的为"????"(在客户端用oracle sql plus查看)，从而造成关键字冲突。 <BR>在客户端oracle sql plus对某行显示"????"的字段值进行修改，如改成中文值”测试”,提交后，用sql语句查看，刚修改的行中显示"????"的字段值变成了”测试”，这说明了digital unin服务器上的oracle数据集可以存储中文字符，但oracle 8.0.4 for digital unin的导入工具imp未能将oracle 8.0.5 for windows nt imp80导出的中文数据进行转换。 </FONT></P>
<P><FONT size=2>4.查看字符集参数 <BR>4.1查看oracle 8.0.5 for windows nt props$内容 <BR>sql&gt; connect sys/change_on_install <BR>sql&gt; col value$ format a40 <BR>sql&gt; select name,value$ from props$; <BR>name　　　　　　　　　　　　　　value$ <BR>--------------------------------------- <BR>dict.base　　　　　　　　　　　 2 <BR>nls_language 　　　　　　　　　 american <BR>nls_territory　　　　　　　　　 america <BR>nls_currency 　　　　　　　　　 $ <BR>nls_iso_currency 　　　　　　　 america <BR>nls_numeric_characters　　　　　., <BR>nls_calendar 　　　　　　　　　 gregorian <BR>nls_date_format 　　　　　　　　dd-mon-yy <BR>nls_date_language 　　　　　　　american <BR>nls_characterset 　　　　　　　 zhs16gbk <BR>nls_sort　　　　　　　　　　　　binary <BR>nls_nchar_characterset　　　　　zhs16gbk <BR>nls_rdbms_version　　　　　　　 8.0.5.0.0 <BR>global_db_name　　　　　　　　　oracle.world <BR>export_views_version　　　　　　7 <BR>已选择15行。 </FONT></P>
<P><FONT size=2>4.2查看oracle 8.0.4 for digital unin 的props$内容 <BR>sql&gt; connect sys/change_on_install <BR>sql&gt; col value$ format a40 <BR>sql&gt; select name,value$ from props$; <BR>name　　　　　　　　　　　　　　value$ <BR>--------------------------------------- <BR>dict.base 　　　　　　　　　　　2 <BR>nls_language 　　　　　　　　　 american <BR>nls_territory 　　　　　　　　　america <BR>nls_currency 　　　　　　　　　 $ <BR>nls_iso_currency 　　　　　　　 america <BR>nls_numeric_characters 　　　　 ., <BR>nls_calendar 　　　　　　　　　 gregorian <BR>nls_date_format 　　　　　　　　dd-mon-yy <BR>nls_date_language 　　　　　　　american <BR>nls_characterset 　　　　　　　 zhs16cgb231280 <BR>nls_sort 　　　　　　　　　　　 binary <BR>nls_nchar_characterset 　　　　 zhs16cgb231280 <BR>nls_rdbms_version 　　　　　　　8.0.4.0.0 <BR>global_db_name 　　　　　　　　 orcl.world <BR>export_views_version　　　　　　7 <BR>15 rows selected. <BR>发现oracle 8.0.4 for digital unin 采用了oracle在digital unix环境下建议的中文字符集zhs16cgb231280,两者的字符集不同，于是本人就在digital unin服务器上重新安装oracle，选择了与nt上同样的字符集zhs16gbk(中国简体汉字16位国标库)。安装完成后，通过查看props$的内容，确认了oracle 8.0.4 for digital unin和oracle 8.0.5 for windows nt的字符集一致。于是用oracle 8.0.4 for digital unin的导入工具imp重新进行数据导入，但还是报同样的错误，问题还未得到解决。 </FONT></P>
<P><FONT size=2>5.问题解决办法 <BR>后来本人发现在oracle 8.0.5 for windows nt的服务器(或装有oracle 8.0.5 for windows 95/98的工作站)上直接用oracle 8.0.5 for windows nt的导入工具imp80远程对oracle 8.0.4 for digital unin数据库进行数据导入，问题竟得到解决。 <BR>5.1在nt的服务器上，修改tnsnames.ora(或通过oracle net8 easy config)设置数据库连接字符串gxmis(可自行设定)指向oracle 8.0.4 for digital unin服务器。 </FONT></P>
<P><FONT size=2>5.2在nt的服务器上进行数据远程导入 <BR>c:&gt;imp80 gxmisdba/manager@gxmis file=c:expdat.dmpfull=y log=c:import.log </FONT></P>
<P><FONT size=2>已连接到：oracle8 enterprise edition release 8.0.4.0.0 - production <BR>pl/sql release 8.0.4.0.0 - production <BR>经由常规路径导出由export:v08.00.05创建的文件 <BR>. 正在将gxmisdba的对象导入到 gxmisdba <BR>. . 正在导入表 "aaaaa" 0行被导入 <BR>. . 正在导入表 "evt_carrier_configuration" 0行被导入 <BR>. . 正在导入表 "tbl_aj_agks" 331行被导入 <BR>. <BR>. <BR>. <BR>准备启用约束条件... <BR>成功终止导入 </FONT></P>
<P><FONT size=2>5.3把oracle 8.0.4 for digital unin字符集重新又改成zhs16cgb231280,进行数据远程导入测试，数据也同样地导入成功。说明zhs16cgb231280字符集可以兼容zhs16gbk字符集。 </FONT></P>
<P><FONT size=2>6.经验总结 <BR>6.1在oracle 8.0.4 for digital unin服务器上(字符集zhs16gbk)用8.0.4 for digital unin的导出工具exp将已正常(即可存储和显示中文)的数据库导出。 <BR>$ exp gxmisdba/manager file=/u01/expdat.dmp log=/u01/export.log <BR>显示成功导出。 <BR>在用oracle 8.0.4 for digital unin的导入工具imp进行导入 <BR>$imp gxmisdba/manager file=/u01/expdat.dmp full=y log=u01import.log <BR>错误又重现。 </FONT></P>
<P><FONT size=2>6.2在nt服务器上通过ftp命令将在oracle 8.0.4 for digital unin服务器上刚导出的输出转存二进制文件expdat.dmp下载至nt服务器上，用imp80进行远程导入。 <BR>c:&gt;imp80 gxmisdba/manager@gxmis file=c:expdat.dmp full=y log=c:import.log <BR>已连接到：oracle8 enterprise edition release 8.0.4.0.0 – production <BR>pl/sql release 8.0.4.0.0 – production <BR>imp-00016: 不支持要求的字符集转换（从类型1到852） <BR>imp-00000: 未成功终止导入 </FONT></P>
<P><FONT size=2>6.3在nt服务器上对digital unin服务器上的数据进行远程导出(备份) <BR>c:&gt;exp80 gxmisdba/manager@gxmis file=c:expdat.dmp log=c:export.log <BR>显示成功导出。再进行远程导入 <BR>c:&gt;imp80 gxmisdba/manager@gxmis file=c:expdat.dmp full=y log=c:import.log <BR>显示成功导入。通过客户端oracle sql plus查看中文显示正常。 <BR>从而说明在oracle 8.0.4 for digital unin服务器上对含有中文的数据库的数据移植、备份、数据恢复不要用oracle 8.0.4 for digital unin本身自带的导入导出工具imp,exp，应使用能进行中文导入导出的工具，如imp80,exp80。 </FONT></P></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/shmily432685/aggbug/17185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2005-10-28 15:41 <a href="http://www.blogjava.net/shmily432685/archive/2005/10/28/17185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>改变数据库字符集的方法</title><link>http://www.blogjava.net/shmily432685/archive/2005/10/20/16113.html</link><dc:creator>闵毓</dc:creator><author>闵毓</author><pubDate>Thu, 20 Oct 2005 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/shmily432685/archive/2005/10/20/16113.html</guid><wfw:comment>http://www.blogjava.net/shmily432685/comments/16113.html</wfw:comment><comments>http://www.blogjava.net/shmily432685/archive/2005/10/20/16113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shmily432685/comments/commentRss/16113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shmily432685/services/trackbacks/16113.html</trackback:ping><description><![CDATA[oracle 数据库具有国际化的支持能力, 主要通过字符集等 NLS(National Language Support)  参数设置来实现对不同国家语言环境的支持。其中数据库的字符集是在数据库创建的阶段, 即 create database 语句中指定的，数据库一经建立，字符集就没法改变了，除非重建。我们最常用的字符集设置通常为 zhs16cgb231280(国标2312字库) 和 ZHS16GBK(方正 GBK 字库)。GBK是在GB2312-80标准基础上的内码扩展规范，使用了双字节编码方案，其编码范围从8140至FEFE（剔除xx7F），共23940个码位，共收录了21003个汉字，完全兼容国标GB2312-80标准(只实现了6763个汉字)。 <BR><BR>在项目开发和维护过程中我们经常会遇见下面的情况, 使用 ZHS16CGB231280 字符集的oracle 系统中，姓名中出现的很多疑难汉字无法正常显示（显示为 ??）。<BR><BR>    遇见这种情况以往最常见的处理方法是导出数据(exp), 用 ZHS16GBK 字符集重建数据库，最后再导入(imp)数据。但这个过程对于一个大型数据库来说很漫长和痛苦。这里给大家介绍一个比较快速简单的方法，几分钟就能实现字符集转换。这里以 oracle9i为例(8i中的操作略有不同)。<BR><BR>1.        作为 oracle 用户登录数据库服务器<BR><BR>2.        停止监听程序<BR>                   $lsnrctl stop<BR>                   或<BR>                   $lsnrctl stop  listener名称<BR><BR>3.        作为 sysdba 登录数据库, 并检查目前的数据库字符集设置<BR>                   sqlplus /nolog<BR>                   connect /as sysdba<BR>                   select value$ from props$ where name ='NLS_CHARACTERSET';<BR><BR>如果上述查询结果为 ZHS16CGB231280, 则进行如下操作:<BR><BR>4.        保存下列数据库配置参数的原始设置<BR>             show parameter job_queue_processes<BR>             show parameter aq_tm_processes<BR><BR>5.        关闭数据库服务,重新启动后修改数据库字符集, 并关闭数据库<BR>              shutdown immediate<BR>              startup mount<BR>              alter system enable restricted session;<BR>              alter database open;<BR>              alter system set job_queue_processes = 0;<BR>              alter system set aq_tm_processes = 0;<BR>              alter database character set internal_use zhs16gbk;<BR>              shutdown immediate<BR><BR>6.        重新启动数据库服务,恢复 job_queue_processes设置<BR>             startup<BR>             alter system set job_queue_processes=原始设置;<BR>             alter system set aq_tm_processes=原始设置;<BR>             exit<BR><BR>7.        启动监听程序<BR>             $lsnrctl start<BR>             或<BR>             $lsnrctl start  listener名称<BR><BR>8.        修改客户端 NLS_LANG 设置<BR>             windows 客户端在注册表中修改 NLS_LANG 参数:<BR>             nls_lang=”American_america.zhs16gbk”<BR><BR>    注意，这里要指出的是, 字符集间的转换可能会造成数据库信息破坏，如把 ZHS16GBK 的oracle 数据库转换为 zhs16cgb231280, 其中的疑难汉字就会变成同样的??, 有时甚至造成主键重复活违反唯一索引等问题。可能很少有人知道, Oracle 其实提供了一个应用程序 csscan, 可以用来检测字符集转换后数据库的内容是否会被破坏。要使用 csscan 程序必须先以 sysdba 的身份执行 $ORACLE_HOME/rdbms/admin 目录下的 csminst.sql。csscan help=y 可以得到关于 csscan 命令使用方法的帮助。<BR><img src ="http://www.blogjava.net/shmily432685/aggbug/16113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shmily432685/" target="_blank">闵毓</a> 2005-10-20 12:34 <a href="http://www.blogjava.net/shmily432685/archive/2005/10/20/16113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>