﻿<?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>C++博客-Cpp Fans-随笔分类-DataBase</title><link>http://www.cppblog.com/threesh/category/2974.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 May 2008 16:26:35 GMT</lastBuildDate><pubDate>Tue, 27 May 2008 16:26:35 GMT</pubDate><ttl>60</ttl><item><title>PL/SQL单行函数和组函数详解</title><link>http://www.cppblog.com/threesh/archive/2007/03/26/20595.html</link><dc:creator>Cpp Fans</dc:creator><author>Cpp Fans</author><pubDate>Mon, 26 Mar 2007 03:04:00 GMT</pubDate><guid>http://www.cppblog.com/threesh/archive/2007/03/26/20595.html</guid><wfw:comment>http://www.cppblog.com/threesh/comments/20595.html</wfw:comment><comments>http://www.cppblog.com/threesh/archive/2007/03/26/20595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/threesh/comments/commentRss/20595.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/threesh/services/trackbacks/20595.html</trackback:ping><description><![CDATA[
		<div class="cnt">
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">
				</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数，这些函数都可被称为SQL或PL/SQL语句，函数主要分为两大类：</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　 单行函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　 组函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　本文将讨论如何利用单行函数以及使用规则。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SQL中的单行函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SQL和PL/SQL中自带很多类型的函数，有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据，因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中，例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　单行函数也可以在其他语句中使用，如update的SET子句，INSERT的VALUES子句，DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数，所以我们的注意力也集中在SELECT语句中。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　NULL和单行函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　在如何理解NULL上开始是很困难的，就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值，算术操作符的任何一个操作数为NULL值，结果均为提个NULL值,这个规则也适合很多函数，只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了 NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的，因为他能直接处理NULL值，NVL有两个参数：NVL(x1,x2),x1和x2 都式表达式，当x1为null时返回X2,否则返回x1。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　下面我们看看emp数据表它包含了薪水、奖金两项，需要计算总的补偿</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　不是简单的将薪水和奖金加起来就可以了，如果某一行是null值那么结果就将是null，比如下面的例子：</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">update empset salary=(salary+bonus)*1.1</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　这个语句中，雇员的工资和奖金都将更新为一个新的值，但是如果没有奖金，即 salary + null,那么就会得出错误的结论，这个时候就要使用nvl函数来排除null值的影响。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">所以正确的语句是：</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">update empset salary=(salary+nvl(bonus,0)*1.1</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">单行字符串函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　单行字符串函数用于操作字符串数据，他们大多数有一个或多个参数，其中绝大多数返回字符串</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　ASCII()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c1是一字符串，返回c1第一个字母的ASCII码，他的逆函数是CHR()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　CHR(＜i＞)[NCHAR_CS]</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　i是一个数字，函数返回十进制表示的字符</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　CONCAT(,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c1,c2均为字符串，函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　INITCAP()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号限制。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　INSTR(,[,＜i＞[,]])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c1,c2均为字符串，i,j为整数。函数返回c2在c1中第j次出现的位置，搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右，i和j的缺省值为1.</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">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</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　INSTRB(,[,i[,j])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　与INSTR（）函数一样，只是他返回的是字节，对于单字节INSTRB()等于INSTR()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　LENGTH()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c1为字符串，返回c1的长度，如果c1为null，那么将返回null值。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select LENGTH('Ipso Facto') ergo from dualergo10</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　LENGTHb()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　与LENGTH()一样，返回字节。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　lower()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回c的小写字符，经常出现在where子串中</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　LPAD(,＜i＞[,])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格，参见RPAD。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　LTRIM(,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　把c1中最左边的字符去掉，使其第一个字符不在c2中，如果没有c2，那么c1就不会改变。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select LTRIM('Mississippi','Mis') from dualLTRppi</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　RPAD(,＜i＞[,])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格,其他与LPAD相似</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　RTRIM(,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　把c1中最右边的字符去掉，使其第后一个字符不在c2中，如果没有c2，那么c1就不会改变。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　REPLACE(,[,])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c1,c2,c3都是字符串，函数用c3代替出现在c1中的c2后返回。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select REPLACE('uptown','up','down') from dualREPLACEdowntown</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　STBSTR(,＜i＞[,])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c1为一字符串，i,j为整数，从c1的第i位开始返回长度为j的子字符串，如果j为空，则直到串的尾部。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select SUBSTR('Message',1,4) from dualSUBSMess</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SUBSTRB(,＜i＞[,])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　与SUBSTR大致相同，只是I,J是以字节计算。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SOUNDEX()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回与c1发音相似的词</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TRANSLATE(,,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　将c1中与c2相同的字符以c3代替</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select TRANSLATE('fumble','uf','ar') test from dualTEXTramble</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TRIM([[]] from c3)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　将c3串中的第一个，最后一个，或者都删除。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select TRIM(' space padded ') trim from dual TRIMspace padded</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　UPPER()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回c1的大写，常出现where子串中</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select name from dual where UPPER(name) LIKE 'KI%'NAMEKING</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">单行数字函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　单行数字函数操作数字数据，执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作数和值都是弧度而不是角度，oracle没有提供内建的弧度和角度的转换函数。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　ABS()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回n的绝对值</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　ACOS()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　反余玄函数，返回-1到1之间的数。n表示弧度</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　ASIN()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　反正玄函数，返回-1到1，n表示弧度</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　ATAN()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　反正切函数，返回n的反正切值，n表示弧度。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　CEIL()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回大于或等于n的最小整数。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　COS()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回n的余玄值，n为弧度</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　COSH()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回n的双曲余玄值，n 为数字。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select COSH(&lt;1.4&gt;) FROM dualCOSH(1.4)2.15089847</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　EXP()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回e的n次幂，e=2.71828183.</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　FLOOR()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回小于等于N的最大整数。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　LN()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回N的自然对数，N必须大于0</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　LOG(,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回以n1为底n2的对数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　MOD()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回n1除以n2的余数，</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　POWER(,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回n1的n2次方</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　ROUND(,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回舍入小数点右边n2位的n1的值，n2的缺省值为0，这回将小数点最接近的整数，如果n2为负数就舍入到小数点左边相应的位上，n2必须是整数。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SIGN()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　如果n为负数，返回-1,如果n为正数，返回1，如果n=0返回0.</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SIN（)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回n的正玄值,n为弧度。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SINH()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回n的双曲正玄值,n为弧度。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SQRT()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回n的平方根,n为弧度</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TAN（)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回n的正切值,n为弧度</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TANH()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回n的双曲正切值,n为弧度</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TRUNC(,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回截尾到n2位小数的n1的值，n2缺省设置为0，当n2为缺省设置时会将n1截尾为整数，如果n2为负值，就截尾在小数点左边相应的位上。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　单行日期函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　单行日期函数操作DATA数据类型，绝大多数都有DATA数据类型的参数，绝大多数返回的也是DATA数据类型的值。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　ADD_MONTHS(,＜i＞)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数，那么数据库将隐式的他转换成整数，将会截去小数点后面的部分。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　LAST_DAY()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　函数返回包含日期d的月份的最后一天</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　MONTHS_BETWEEN(,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回d1和d2之间月的数目,如果d1和d2的日的日期都相同，或者都使该月的最后一天，那么将返回一个整数，否则会返回的结果将包含一个分数。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　NEW_TIME(,,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　d1是一个日期数据类型，当时区tz1中的日期和时间是d时，返回时区tz2中的日期和时间。tz1和tz2时字符串。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　NEXT_DAY(,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回日期d后由dow给出的条件的第一天，dow使用当前会话中给出的语言指定了一周中的某一天，返回的时间分量与d的时间分量相同。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">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</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　ROUND([,])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　将日期d按照fmt指定的格式舍入，fmt为字符串。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SYADATE</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　函数没有参数，返回当前日期和时间。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TRUNC([,])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回由fmt指定的单位的日期d.</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">单行转换函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　单行转换函数用于操作多数据类型，在数据类型之间进行转换。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　CHARTORWID()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c 使一个字符串，函数将c转换为RWID数据类型。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　CONVERT(,[,])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c尾字符串，dset、sset是两个字符集，函数将字符串c由sset字符集转换为dset字符集，sset的缺省设置为数据库的字符集。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　HEXTORAW()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　x为16进制的字符串，函数将16进制的x转换为RAW数据类型。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　RAWTOHEX()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　x是RAW数据类型字符串，函数将RAW数据类转换为16进制的数据类型。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　ROWIDTOCHAR()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　函数将ROWID数据类型转换为CHAR数据类型。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TO_CHAR([[,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　x是一个data或number数据类型，函数将x转换成fmt指定格式的char数据类型，如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符，以及货币符号。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TO_DATE([,[,）</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c表示字符串，fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TO_MULTI_BYTE()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c表示一个字符串，函数将c的担子截字符转换成多字节字符。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TO_NUMBER([,[,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　c表示字符串，fmt表示一个特殊格式的字符串，函数返回值按照fmt指定的格式显示。nlsparm表示语言，函数将返回c代表的数字。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TO_SINGLE_BYTE()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　其它单行函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　BFILENAME(</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">,)</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　dir是一个directory类型的对象，file为一文件名。函数返回一个空的BFILE位置值指示符，函数用于初始化BFILE变量或者是BFILE列。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　DECODE(,,[,,,[])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　x是一个表达式，m1是一个匹配表达式，x与m1比较，如果m1等于x，那么返回r1,否则,x与m2比较，依次类推m3,m4,m5....直到有返回结果。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　DUMP(,[,[,[,]]])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　x是一个表达式或字符，fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　EMPTY_BLOB()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　该函数没有参数，函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　EMPTY_CLOB()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　该函数没有参数，函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　GREATEST()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　exp_list是一列表达式，返回其中最大的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，那么返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　LEAST()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　exp_list是一列表达式，返回其中最小的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，将返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　UID</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　该函数没有参数，返回唯一标示当前数据库用户的整数。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　USER</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回当前用户的用户名</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　USERENV()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　基于opt返回包含当前会话信息。opt的可选值为：</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　ISDBA　 　　会话中SYSDBA脚色响应，返回TRUE</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SESSIONID 　返回审计会话标示符ENTRYID 　　返回可用的审计项标示符</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　INSTANCE　　在会话连接后，返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　LANGUAGE　　返回语言、地域、数据库设置的字符集。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　LANG　　　　返回语言名称的ISO缩写。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　TERMINAL　　为当前会话使用的终端或计算机返回操作系统的标示符。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　VSIZE()</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　x是一个表达式。返回x内部表示的字节数。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">SQL中的组函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　组函数也叫集合函数，返回基于多个行的单一结果，行的准确数量无法确定，除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是，在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　组（多行）函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　与单行函数相比，oracle提供了丰富的基于组的，多行的函数。这些函数可以在select或select的having子句中使用，当用于select子串时常常都和GROUP BY一起使用。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　AVG([{DISYINCT|ALL}])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回数值的平均值。缺省设置为ALL.</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">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</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　COUNT({*|DISTINCT|ALL} )</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回查询中行的数目，缺省设置是ALL,*表示返回所有的行。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　MAX([{DISTINCT|ALL}])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回选择列表项目的最大值，如果x是字符串数据类型，他返回一个VARCHAR2数据类型，如果X是一个DATA数据类型，返回一个日期，如果X是numeric数据类型，返回一个数字。注意distinct和all不起作用，应为最大值与这两种设置是相同的。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　MIN([{DISTINCT|ALL}])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回选择列表项目的最小值。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　STDDEV([{DISTINCT|ALL}])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回选者的列表项目的标准差，所谓标准差是方差的平方根。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　SUM([{DISTINCT|ALL}])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回选择列表项目的数值的总和。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　VARIANCE([{DISTINCT|ALL}])</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　返回选择列表项目的统计方差。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　用GROUP BY给数据分组</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　正如题目暗示的那样组函数就是操作那些已经分好组的数据，我们告诉数据库用GROUP BY怎样给数据分组或者分类，当我们在SELECT语句的SELECT子句中使用组函数时，我们必须把为分组或非常数列放置在GROUP BY子句中，如果没有用group by进行专门处理，那么缺省的分类是将整个结果设为一类。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　在这个例子中，我们用state字段分类；如果我们要将结果按照zip_codes排序,可以用ORDER BY语句，ORDER BY子句可以使用列或组函数。</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　用HAVING子句限制分组数据</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数，组函数只能用于两个子串中，组函数不能用于WHERE子串中，例如下面的查询是错误的：</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)&gt;10000 GROUP BY sales_clerk</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　这个语句中数据库不知道SUM()是什么，当我们需要指示数据库对行分组，然后限制分组后的行的输出时，正确的方法是使用HAVING语句：</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)&gt;10000;</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　嵌套函数</p>
				<p style="FONT-SIZE: 9pt; MARGIN: 0in">　　函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置，函数遵循由内到外，由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。 </p>
		</div>
<img src ="http://www.cppblog.com/threesh/aggbug/20595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/threesh/" target="_blank">Cpp Fans</a> 2007-03-26 11:04 <a href="http://www.cppblog.com/threesh/archive/2007/03/26/20595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]ORACLE数据库开发经验 </title><link>http://www.cppblog.com/threesh/archive/2006/12/04/15974.html</link><dc:creator>Cpp Fans</dc:creator><author>Cpp Fans</author><pubDate>Mon, 04 Dec 2006 07:09:00 GMT</pubDate><guid>http://www.cppblog.com/threesh/archive/2006/12/04/15974.html</guid><wfw:comment>http://www.cppblog.com/threesh/comments/15974.html</wfw:comment><comments>http://www.cppblog.com/threesh/archive/2006/12/04/15974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/threesh/comments/commentRss/15974.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/threesh/services/trackbacks/15974.html</trackback:ping><description><![CDATA[
		<p>
				<font face="verdana, arial, helvetica" size="2">
						<span class="javascript" id="text21204" style="FONT-SIZE: 12px">
								<a href="http://www2.ccw.com.cn/tips/9911/110402_04.asp" target="_blank">http://www2.ccw.com.cn/tips/9911/110402_04.asp</a>
								<br />
								<br />岭澳核电有限公司 <br />黄福同 <br />---- ORACLE数据库作为大型数据库管理系统，近年来一直占有世界上高端数据库的最大份额，其强大而完善的数据库管理功能，以及ORACLE公司推陈出新的不断努力，一直成为IT业界瞩目的焦点。岭澳核电站的数据库平台采用了ORACLE7.3作为后端平台，前端选择了ORACLE公司的DEVELOPER 2000 及DESIGNER 2000作为开发工具，采用了目前流行的CLIENT/SERVER模式。本人在ORACLE系统的开发中，就ORACLE的整套开发工具提出一些自己的体会，供同行参考。 <br /><br />---- 一. ORACLE SQL PLUS 使用技巧: <br /><br />---- ①查找重复记录: <br /><br />SELECT DRAWING,DSNO FROM EM5_PIPE_PREFAB<br />WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5<br />_PIPE_PREFAB D<br />WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND <br />EM5_PIPE_PREFAB.DSNO=D.DSNO);<br />---- 执行上述SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录。 <br />---- 删除重复记录: <br /><br />DELETE FROM EM5_PIPE_PREFAB <br />WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5<br />_PIPE_PREFAB D<br />WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND <br />EM5_PIPE_PREFAB.DSNO=D.DSNO);<br />---- 执行上述SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录。 <br />---- ② 快速编译所有视图 <br /><br />---- 当在把数据库倒入到新的服务器上后(数据库重建)，需要将视图重新编译一遍，因为该表空间视图到其它表空间的表的连接会出现问题，可以利用PL/SQL的语言特性，快速编译。 <br /><br />SQL &gt;SPOOL ON.SQL<br />SQL &gt;SELECT ‘ALTER VIEW ‘||TNAME||’<br />COMPILE;’ FROM TAB;<br />SQL &gt;SPOOL OFF<br />然后执行ON.SQL即可。<br />SQL &gt;@ON.SQL<br />当然，授权和创建同义词也可以快速进行，如：<br />SQL &gt;SELECT ‘GRANT SELECT ON ’<br />||TNAME||’ TO USERNAME;’ FROM TAB;<br />SQL &gt;SELECT ‘CREATE SYNONYM <br />‘||TNAME||’ FOR USERNAME.’||TNAME||’;’ FROM TAB;<br /><br />③ 用外联接提高表连接的查询速度<br />在作表连接(常用于视图)时，常使用以下方法来查询数据:<br />SELECT PAY_NO, PROJECT_NAME<br />FROM A<br />WHERE A.PAY_NO NOT IN (SELECT PAY_<br />NO FROM B WHERE VALUE &gt;=120000);<br />---- 但是若表A有10000条记录，表B有10000条记录，则要用掉30分钟才能查完，主要因为NOT IN要进行一条一条的比较，共需要10000*10000次比较后，才能得到结果。该用外联接后，可以缩短到1分左右的时间: <br />SELECT PAY_NO,PROJECT_NAME <br />FROM A,B<br />WHERE A.PAY_NO=B.PAY_NO(+)<br />AND B.PAY_NO IS NULL <br />AND B.VALUE &gt;=12000;<br />---- ④ 怎样读写文本型操作系统文件 <br />---- 在PL/SQL 3.3以上的版本中，UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下： <br /><br />DECALRE<br />FILE_HANDLE UTL_FILE.FILE_TYPE;<br />BEGIN<br />FILE_HANDLE:=UTL_FILE.FOPEN(<br />‘C:\’,’TEST.TXT’,’A’);<br />UTL_FILE.PUT_LINE(FILE_HANDLE,’<br />HELLO,IT’S A TEST TXT FILE’);<br />UTL_FILE.FCLOSE(FILE_HANDLE);<br />END;<br />---- 相关UTL_FILE数据库包详细信息可以参见相关资料。<br /><br /></span>
				</font>
		</p>
		<p>
				<font face="verdana, arial, helvetica" size="2">
						<span class="javascript" id="text21205" style="FONT-SIZE: 12px">---- ⑤ 怎样在数据库触发器中使用列的新值与旧值 <br /><br />---- 在数据库触发器中几乎总是要使用触发器基表的列值，如果某条语句需要某列修改前的值，使用:OLD就可以了，使用某列修改后的新值，用:NEW就可以了。如:OLD.DEPT_NO,:NEW.DEPT_NO。 <br /><br />---- 二.ORACLE DEVELOPER 2000使用技巧： <br /><br />---- ① 改变FORM(FMX模块)运行时的Runform4.5的题头: <br /><br />---- DEVELOPER2000中FMX默认题头为：Developer/2000 Forms Runtime for Windows 95 / NT 你可以改为自己定义的标题, <br /><br />---- 1. 在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE <br /><br />---- 2. 在此触发器中写如下代码： <br /><br />set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT<br />SYSTEM 欢迎使用');<br />---- ② 如何隐藏菜单中的window选项: <br />---- 在创建自己的菜单时，最后选项总有window项，下面介绍如何去掉它, <br /><br />---- 1. 创建一个Menu <br /><br />---- 2. 在Menu中建立一个Item,命名为WINDOW。 <br /><br />---- 3. 设置该Item属性如下: <br /><br />----<br /><br />Menu Item Type:Magic <br />Command Type:Null <br />Magic Item:Window <br />Lable:为空<br /><br />---- ③ 怎样创建动态下拉列表List <br />---- Developer 2000 中的列表是通过设置相关属性而完成数据项的列表设置的，但那只是静态的，有时你想让某项成为动态的列表，随输入数据的改变而改变，就需要动手去编个小程序。下面详细介绍怎样去做: <br /><br />---- 有块EBOP_CABLE_ACCOUNT，下有SPECIFICATION数据项，当一进入该模块时，就将SPECIFICATION项在数据库中存储的值动态显示出来，先在Form4.5中建立一个PRCEDURE，命名为DYN_LIST: <br /><br />PROCEDURE DYN_LIST IS<br />CURSOR C1 IS <br />SELECT DISTINCT(SPECIFICATION) <br />FROM EBOP_CABLE_ACCOUNT;<br />CNT NUMBER;<br />i NUMBER; <br />TNAME EBOP_CABLE_<br />ACCOUNT.SPECIFICATION%TYPE;<br />BEGIN<br />CLEAR_LIST('EBOP_CABLE_<br />ACCOUNT.SPECIFICATION');<br />SELECT COUNT(DISTINCT<br />(SPECIFICATION)) INTO CNT FROM EBOP<br />_CABLE_ACCOUNT;<br />open C1;<br />FOR i IN 1..CNT LOOP<br />FETCH C1 INTO TNAME;<br />EXIT WHEN C1%NOTFOUND <br />OR C1%NOTFOUND IS NULL;<br />ADD_LIST_ELEMENT<br />('EBOP_CABLE_ACCOUNT<br />.SPECIFICATION',i,TNAME,TNAME);<br />END LOOP;<br />DELETE_LIST_ELEMENT<br />('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);<br />CLOSE C1;<br />END;<br />然后在FORM的WHEN-NEW<br />-FORM-INSTANCE触发子中加入一行：<br />DYN_LIST;<br />---- 这样一进入该FMX，就会动态刷新该列表。除此之外，SPECIFICATION数据项改为列表项。 <br />---- ④ 当显示多条记录且数据项特别多时，如何组织录入及显示界面: <br /><br />---- 如上图所示，PRN代码及设备代码在画布1(CONTENT型)上，其它数据项在画布2(STACK型)上，所有数据项为一个表的列或一个块的数据项。在拉动水平滚动条时或用TAB或敲回车键时，将看到全部数据项。这种排布方法适用于数据项特别多又想显示多条记录时用。主要制作顺序为：先建立两个画布，画布1(CONTENT型)，画布2(STACK型)，然后建立块，选画布时用画布1，这样所有项都显示在画布1上，然后选中除PRN代码及设备代码之外的所有数据项，选TOOLS菜单下的PROPERTIES选项，将这些数据项的CANVAS属性选为画布2(STACK型)，然后调整整体位置就可以了。 <br /><br />---- ⑤ 如何在FORM的受限触发子中提交保存数据 <br /><br />---- 在FORM中很多触发子是不能用COMMIT WORK语句的，当你在该触发子中使用了UPDATE，DELETE等操作并想立即存盘时，就需要COMMIT WORK语句了。首先在服务器端建立DB_SQL_COMMIT这个过程(采用ORACLE7.3数据库)， <br /><br />PROCEDURE DB_SQL_COMMIT IS<br />source_cursor integer;<br />ignore integer;<br />V7 NUMBER :=2;<br />BEGIN<br />source_cursor:=dbms_sql.open_cursor;<br />dbms_sql.parse(source_cursor,'COMMIT WORK',V7);<br />ignore:=dbms_sql.execute(source_cursor);<br />DBMS_SQL.CLOSE_CURSOR(source_cursor);<br />END;<br />---- 然后在FORM中该触发子中调用过程DB_SQL_COMMIT;就可以了，当然你可以根据自己需要将该过程加入参数，这样通过参数可以得到执行DML语句的权限。<br /><br /> ⑥ 如何在FORM中实现某数据项自动按记录序号加一操作 <br /><br />---- 设块名为VO,要操作的数据项为VO_ID,在该块中建立块级触发子WHEN-CREATE- RECORD，加入如下代码： <br /><br />:VO_ID:=:System.Trigger_Record;<br />---- 这样每当生成新记录时VO_ID就会自动加一了。 <br />---- ⑦ 如何在一个FORM中调用另一个FORM，或在一个块中调用另一个块时显示特定的记录有时用户会要求在调用另一个FORM时，只显示相关的记录，举例如下，在一个FORM的块中有一个按钮，在按钮触发子中加入如下代码： <br /><br />DECLARE<br />PM <br />PARAMLIST;<br />BEGIN<br />PM:=GET_PARAMETER_LIST('PM');<br />IF NOT ID_NULL(PM) THEN<br />DESTROY_PARAMETER_LIST('PM');<br />END IF;<br />PM:=CREATE_PARAMETER_LIST('PM');<br />......................<br />ADD_PARAMETER(PM,'THE_WHERE',<br />TEXT_PARAMETER,'EM_NAME=''EM4'' <br />AND EM_PROJECT_NAME=''支架预制''');<br />OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);<br />END；<br />---- 其中EM_NAME，EM_PROJECT_NAME为本FORM某块的数据项，PAYMENT为要调用的FORM模块。这样通过传递参数列表就可以得到想要的结果。在FORM PAYMENT.FMB中，建立一参数THE_WHERE，CHAR型，长1000，然后在PAYMENT.FMB中建立FORM级触发子WHEN-NEW-FORM-INSTANCE，在该触发子中加入以下语句： <br />IF :PARAMETER.THE_WHERE IS NOT NULL THEN<br />SET_BLOCK_PROPERTY('PAYMENT',<br />DEFAULT_WHERE,:PARAMETER.THE_WHERE);<br />END IF;<br />---- 其中PAYMENT为要显示的块，这样通过参数传递就得到想要的某些特定条件的数据了。 <br />---- ⑧ 在FORM中当有主从块时，连续输入记录如何避免被不断的提示保存： <br /><br />---- 每输入一条主记录和若干条该主记录的从记录后，此时再导航到主块输下一条记录，FORM就会提示你是否要保存记录，而你并不希望FORM提示，让它自动保存，此时你可以到Program Units中找到过程PROCEDURE Clear_All_Master_Details，然后在这个过程中找到语句 <br /><br />Clear_Block(ASK_COMMIT); <br />---- 将其改为Clear_Block(DO_COMMIT);就可以了。 <br />---- ⑨ 在Report开始时选择排序项: <br /><br />---- 在报表开始的Parameter Form中选择报表按哪个数据项排序， <br /><br />---- 1. 先在USER PARAMETER 中创建SORT参数，为字符型，长20。 <br /><br />---- 2. 初始值选’责任方’,然后将这四个值输入到DATA SELECTION中，形成列表。 <br /><br />---- 3. 然后处理QUERY中的SQL语句: <br /><br />select CHARGER,FCO_NO,EM_NAME,FCO<br />_NO,DESCRIPTION, FCR_POINT <br />from FCR_MAIN <br />ORDER BY DECODE(:SORT,'责任方',CHARGER,'FCO号',<br />FCO_NO,'FCR号',FCR_NO,'FCR号',EM_NAME)<br /><br /></span>
				</font>
		</p>
		<p>
				<font face="verdana, arial, helvetica" size="2">
						<span class="javascript" id="text21207" style="FONT-SIZE: 12px">---- ⑩ 在Developer 2000中如何读写操作系统文件 <br />---- 在用Developer 2000的开发工具开发应用程序时，经常碰到需要读写外部文件的问题，可以用ORACLE 带的包TEXT_IO来完成这项需求。例如: <br /><br />DECLARE<br />IN_FILE TEXT_IO.FILE_TYPE;<br />OUT_FILE TEXT_IO.FILE_TYPE;<br />LINE_BUFER VARCHAR2(80); <br />/*若不用IN_FILE,可以将各字段联接在一起赋值给此变量*/<br />BEGIN<br />IN_FILE:=TEXT_IO.FOPEN<br />(‘C:\TEMP\TEST1.TXT’,’r’);<br />OUT_FILE:=TEXT_IO.FOPEN<br />(‘C:\TEMP\TEST2.TXT’,’w+’);<br />LOOP<br />TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);<br />TEXT_IO.PUT(LINE_BUFER);<br />TEXT_IO.NEW_LINE;<br />TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);<br />END LOOP;<br />EXCEPTION<br />WHEN no_data_found THEN<br />TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....’);<br />TEXT_IO.FCLOSE(IN_FILE);<br />TEXT_IO.FCLOSE(OUT_FILE);<br />END;<br />---- 三.数据库管理 <br /><br />---- ① 在删除一个表中的全部数据时，须使用TRUNCATE TABLE 表名;因为用DROP TABLE，DELETE * FROM 表名时，TABLESPACE表空间该表的占用空间并未释放，反复几次DROP，DELETE操作后，该TABLESPACE上百兆的空间就被耗光了。 <br /><br />---- ② 数据库文件的移动方法 <br /><br />---- 当想将数据库文件移动到另外一个目录下时，可以用ALTER DATABASE命令来移动(比ALTER TABLESPACE适用性强)： <br /><br />---- 1. 使用SERVER MANAGER关闭实例. <br /><br />SVRMGR &gt; connect internal;<br />SVRMGR &gt; shutdown;<br />SVRMGR &gt;exit;<br />---- 2. 使用操作系统命令来移动数据库文件位置(假设这里操作系统为SOLARIS 2.6). 在UNIX中用 mv命令可以把文件移动到新的位置， <br /><br />#mv /ora13/orarun/document.dbf /ora12/orarun<br />---- 3. 装载数据库并用alter database命令来改变数据库中的文件名. <br />SVRMGR &gt; connect internal;<br />SVRMGR &gt; startup mount RUN73;<br />SVRMGR &gt; alter database rename file<br />&gt; ‘/ ora13/orarun/document.dbf’<br />&gt; ‘/ ora12/orarun/document.dbf’;<br />---- 4. 启动实例. <br /><br />SVRMGR &gt; alter database open;<br />---- (huangfutong@china.com) <br /><br />---- ORACLE数据库开发经验总结</span>
				</font>
		</p>
<img src ="http://www.cppblog.com/threesh/aggbug/15974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/threesh/" target="_blank">Cpp Fans</a> 2006-12-04 15:09 <a href="http://www.cppblog.com/threesh/archive/2006/12/04/15974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Oracle的入门心得</title><link>http://www.cppblog.com/threesh/archive/2006/11/07/14766.html</link><dc:creator>Cpp Fans</dc:creator><author>Cpp Fans</author><pubDate>Tue, 07 Nov 2006 01:59:00 GMT</pubDate><guid>http://www.cppblog.com/threesh/archive/2006/11/07/14766.html</guid><wfw:comment>http://www.cppblog.com/threesh/comments/14766.html</wfw:comment><comments>http://www.cppblog.com/threesh/archive/2006/11/07/14766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/threesh/comments/commentRss/14766.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/threesh/services/trackbacks/14766.html</trackback:ping><description><![CDATA[        Oracle的体系太庞大了，对于初学者来说，难免会有些无从下手的感觉，什么都想学，结果什么都学不好，所以把学习经验共享一下，希望让刚刚入门的人对Oracle有一个总体的认识，少走一些弯路。 
<p><strong>        一、定位</strong></p><p>        Oracle分两大块，一块是开发，一块是管理。开发主要是写写存储过程、触发器什么的，还有就是用Oracle的Develop工具做form。有点类似于程序员，需要有较强的逻辑思维和创造能力，个人觉得会比较辛苦，是青春饭；管理则需要对Oracle数据库的原理有深刻的认识，有全局操纵的能力和紧密的思维，责任较大，因为一个小的失误就会down掉整个数据库，相对前者来说，后者更看重经验。 </p><p>        因为数据库管理的责任重大，很少公司愿意请一个刚刚接触Oracle的人去管理数据库。对于刚刚毕业的年轻人来说，可以先选择做开发，有一定经验后转型，去做数据库的管理。当然，这个还是要看人个的实际情况来定。</p><p><strong>       二、学习方法</strong></p><p>       我的方法很简单，就是：看书、思考、写笔记、做实验、再思考、再写笔记。</p><p>        看完理论的东西，自己静下心来想想，多问自己几个为什么，然后把所学和所想的知识点做个笔记；在想不通或有疑问的时候，就做做实验，想想怎么会这样，同样的，把实验的结果记下来。思考和做实验是为了深入的了解这个知识点。而做笔记的过程，也是理清自己思路的过程。 </p><p>        学习的过程是使一个问题由模糊到清晰，再由清晰到模糊的过程。而每次的改变都代表着你又学到了一个新的知识点。 </p><p>        学习的过程也是从点到线，从线到网，从网到面的过程。当点变成线的时候，你会有总豁然开朗的感觉。当网到面的时候，你就是高手了。</p><p>         很多网友，特别是初学的人，一碰到问题就拿到论坛上来问，在问前，你有没有查过书，自己有没有研究过，有没有搜索一下论坛？这就叫思维惰性。由别人来回答你的问题，会让你在短时间内不费劲地弄懂这个知识点，然而通过自己的努力去研究它，不但会更深入的了解这个知识点，更重要的是在研究的过程会提高你解决问题和分析问题的能力。总的来说，没有钻研的学习态度，不管学什么东西，都不会成功的。 </p><p>        当然，初学的人很多时候是因为遇到问题时，无从下手，也不知道去哪里找资料，才会到论坛上提问题的。但我认为，在提问的时候，是不是可以问别人是如何分析这个问题？从哪里可以找到相关的资料？而不是这个问题的答案是什么？授人以鱼不如授人以渔。</p><p>        下面我讲下我处理问题的过程</p><p>        首先要知道Oracle的官方网站：www.oracle.com 这里有Oracle的各种版本的数据库、应用工具和权威的官方文档。其次，还要知道http://metalink.oracle.com/这里是买了Oracle服务或是oracle的合作伙伴才可以进去的，里面有很多权威的解决方案和补丁。然后就是一些著名网站：asktom.oracle.com www.orafaq.net, www.dbazine.com。这里有很多经验之谈。</p><p>        遇到问题了。如果是概念上的问题，第一时间可以找tahiti.oracle.com，这里会给你最详细的解释。如果在运行的过程中出了什么错误。可以去metalink看看。如果是想知道事务的处理的经验之谈。可以去asktom。当然。这里只是相对而言。</p><p><strong>       三、Oracle的体系</strong><br />        Oracle的体系很庞大，要学习它，首先要了解Oracle的框架。在这里，简要的讲一下Oracle的架构，让初学者对Oracle有一个整体的认识。</p><p>     1、物理结构（由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成） </p><p>        控制文件：包含维护和验证数据库完整性的必要信息、例如，控制文件用于识别数据文件和重做日志文件，一个数据库至少需要一个控制文件.</p><p>        数据文件：存储数据的文件.</p><p>        重做日志文件：含对数据库所做的更改记录，这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件.</p><p>        参数文件：定义Oracle例程的特性，例如它包含调整SGA中一些内存结构大小的参数.</p><p>        归档文件：是重做日志文件的脱机副本，这些副本可能对于从介质失败中进行恢复很必要。 </p><p>       密码文件：认证哪些用户有权限启动和关闭Oracle例程.</p><p><br />        2、逻辑结构（表空间、段、区、块）</p><p>        表空间：是数据库中的基本逻辑结构，一系列数据文件的集合。<br />        段：是对象在数据库中占用的空间.<br />        区：是为数据一次性预留的一个较大的存储空间.<br />        块：ORACLE最基本的存储单位，在建立数据库的时候指定.</p><p><br />       3、内存分配（SGA和PGA）</p><p>        SGA：是用于存储数据库信息的内存区，该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配，如果实际内存不够再往虚拟内存中写。 </p><p>        PGA：包含单个服务器进程或单个后台进程的数据和控制信息，与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域，PGA 在创建进程时分配在终止进程时回收.</p><p>        4、后台进程（数据写进程、日志写进程、系统监控、进程监控、检查点进程、归档进程、服务进程、用户进程）</p><p>        数据写进程：负责将更改的数据从数据库缓冲区高速缓存写入数据文件 <br />        日志写进程：将重做日志缓冲区中的更改写入在线重做日志文件 <br />        系统监控：检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复<br />        进程监控：负责在一个Oracle 进程失败时清理资源 <br />        检查点进程：负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。 <br />       归档进程：在每次日志切换时把已满的日志组进行备份或归档 <br />       服务进程：用户进程服务。 <br />       用户进程：在客户端，负责将用户的SQL语句传递给服务进程，并从服务器段拿回查询数据。 </p><p>        5、Oracle例程：Oracle例程由SGA内存结构和用于管理数据库的后台进程组成。例程一次只能打开和使用一个数据库。 </p><p>        6、SCN(System ChangeNumber)：系统改变号，一个由系统内部维护的序列号。当系统需要更新的时候自动增加，他是系统中维持数据的一致性和顺序恢复的重要标志。</p><p><strong>       四、深入学习 </strong></p><p>        管理：可以考OCP证书，对Oracle先有一个系统的学习，然后看Oracle Concepts、Oracle online document,对oracle的原理会有更深入的了解，同时可以开始进行一些专题的研究如：RMAN、RAS、STATSPACT、DATAGUARD、TUNING、BACKUP&amp;RECOVER等等。</p><p>        开发：对于想做Oracle开发的，在了解完Oracle基本的体系结构之后，可以重点关注PL/SQL及Oracle的开发工具这一部分。PL/SQL主要是包括怎么写SQL语句，怎么使用Oracle本身的函数，怎么写存储过程、存储函数、触发器等。 Oracle的开发工具主要就是Oracle自己的Developer Suite（Oracle Forms Developer and Reports Developer这些），学会如何熟练使用这些工具。<br /></p><p><br /></p><img src ="http://www.cppblog.com/threesh/aggbug/14766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/threesh/" target="_blank">Cpp Fans</a> 2006-11-07 09:59 <a href="http://www.cppblog.com/threesh/archive/2006/11/07/14766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>