??xml version="1.0" encoding="utf-8" standalone="yes"?>
函数是一U有零个或多个参数ƈ且有一个返回值的E序。在SQL中Oracle内徏了一pd函数Q这些函数都可被UCؓSQL或PL/SQL语句Q函C要分Z大类Q?/p>
单行函数 l函?/p>
本文讨论如何利用单行函C及用规则?/p>
SQL中的单行函数 SQL和PL/SQL中自带很多类型的函数Q有字符、数字、日期、{换、和混合型等多种函数用于处理单行数据Q因此这些都可被l称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY{子句中Q例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX{单行函数?/p>
SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename) 单行函数也可以在其他语句中用,如update的SET子句QINSERT的VALUES子句QDELET的WHERE子句,认证考试特别注意在SELECT语句中用这些函敎ͼ所以我们的注意力也集中在SELECT语句中?/p>
NULL和单行函?/p>
在如何理解NULL上开始是很困隄Q就是一个很有经验的Z然对此感到困惑。NULLDCZ个未知数据或者一个空|术操作W的M一个操作数为NULL|l果均ؓ提个NULL?q个规则也适合很多函数Q只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了 NULL参数时能够返回非NULL倹{在q些中NVL函数时最重要的,因ؓ他能直接处理NULL|NVL有两个参敎ͼNVL(x1,x2),x1和x2 都式表达式,当x1为null时返回X2,否则q回x1?/p>
下面我们看看emp数据表它包含了薪水、奖金两,需要计ȝ补偿 column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2 不是单的薪水和奖金加v来就可以了,如果某一行是null值那么结果就是nullQ比如下面的例子Q?/p>
update empset salary=(salary+bonus)*1.1 q个语句中,雇员的工资和奖金都将更新Z个新的|但是如果没有奖金Q即 salary + null,那么׃得出错误的结论,q个时候就要用nvl函数来排除null值的影响?/p>
所以正的语句是: update empset salary=(salary+nvl(bonus,0)*1.1 单行字符串函?/p>
单行字符串函数用于操作字W串数据Q他们大多数有一个或多个参数Q其中绝大多数返回字W串 ASCII() c1是一字符Ԍq回c1W一个字母的ASCII码,他的逆函数是CHR() SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122 CHR(QiQ?[NCHAR_CS] i是一个数字,函数q回十进制表C的字符 select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B CONCAT(,) c1,c2均ؓ字符Ԍ函数c2q接到c1的后面,如果c1为null,返回c2.如果c2为null,则返回c1Q如果c1、c2都ؓnullQ则q回null。他和操作符||q回的结果相?/p>
select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda INITCAP() c1Z字符丌Ӏ函数将每个单词的第一个字母大写其它字母小写返回。单词由I格Q控制字W,标点W号限制?/p>
select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici INSTR(,[,QiQ[,]]) c1,c2均ؓ字符Ԍi,j为整数。函数返回c2在c1中第jơ出现的位置Q搜索从c1的第i个字W开始。当没有发现需要的字符时返?,如果i敎ͼ那么搜烦从叛_左进行,但是位置的计还是从左到叻Ii和j的缺省gؓ1. 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 INSTRB(,[,i[,j]) 与INSTRQ)函数一P只是他返回的是字节,对于单字节INSTRB(){于INSTR() LENGTH() c1为字W串Q返回c1的长度,如果c1为nullQ那么将q回null倹{?/p>
select LENGTH('Ipso Facto') ergo from dualergo10 LENGTHb() 与LENGTH()一Pq回字节?/p>
lower() q回c的小写字W,l常出现在where子串?/p>
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite LPAD(,QiQ[,]) c1,c2均ؓ字符Ԍi为整数。在c1的左侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空|参见RPAD?/p>
select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe LTRIM(,) 把c1中最左边的字W去掉,使其W一个字W不在c2中,如果没有c2Q那么c1׃会改变?/p>
select LTRIM('Mississippi','Mis') from dualLTRppi RPAD(,QiQ[,]) 在c1的右侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空?其他与LPAD怼 RTRIM(,) 把c1中最双的字W去掉,使其W后一个字W不在c2中,如果没有c2Q那么c1׃会改变?/p>
REPLACE(,[,]) c1,c2,c3都是字符Ԍ函数用c3代替出现在c1中的c2后返回?/p>
select REPLACE('uptown','up','down') from dualREPLACEdowntown STBSTR(,QiQ[,]) c1Z字符Ԍi,j为整敎ͼ从c1的第i位开始返回长度ؓj的子字符Ԍ如果j为空Q则直到串的N?/p>
select SUBSTR('Message',1,4) from dualSUBSMess SUBSTRB(,QiQ[,]) 与SUBSTR大致相同Q只是I,J是以字节计算?/p>
SOUNDEX() q回与c1发音怼的词 select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250 TRANSLATE(,,) c1中与c2相同的字W以c3代替 select TRANSLATE('fumble','uf','ar') test from dualTEXTramble TRIM([[]] from c3) c3串中的第一个,最后一个,或者都删除?/p>
select TRIM(' space padded ') trim from dual TRIMspace padded UPPER() q回c1的大写,常出现where子串?/p>
select name from dual where UPPER(name) LIKE 'KI%'NAMEKING 单行数字函数 单行数字函数操作数字数据Q执行数学和术q算。所有函数都有数字参数ƈq回数字倹{所有三角函数的操作数和值都是弧度而不是角度,oracle没有提供内徏的弧度和角度的{换函数?/p>
ABS() q回n的绝对?/p>
ACOS() 反余玄函敎ͼq回-1?之间的数。n表示弧度 select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0 ASIN() 反正玄函敎ͼq回-1?Qn表示弧度 ATAN() 反正切函敎ͼq回n的反正切|n表示弧度?/p>
CEIL() q回大于或等于n的最整数?/p>
COS() q回n的余玄|n为弧?/p>
COSH() q回n的双曲余玄|n 为数字?/p>
select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847 EXP() q回e的nơ幂Qe=2.71828183. FLOOR() q回于{于N的最大整数?/p>
LN() q回N的自然对敎ͼN必须大于0 LOG(,) q回以n1为底n2的对?/p>
MOD() q回n1除以n2的余敎ͼ POWER(,) q回n1的n2ơ方 ROUND(,) q回舍入数点右边n2位的n1的|n2的缺省gؓ0Q这回将数Ҏ接近的整敎ͼ如果n2数就舍入到小数点左边相应的位上,n2必须是整数?/p>
select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54 SIGN() 如果n敎ͼq回-1,如果n为正敎ͼq回1Q如果n=0q回0. SINQ? q回n的正玄?n为弧度?/p>
SINH() q回n的双曲正玄?n为弧度?/p>
SQRT() q回n的^Ҏ,n为弧?/p>
TANQ? q回n的正切?n为弧?/p>
TANH() q回n的双曲正切?n为弧?/p>
TRUNC(,) q回截尾到n2位小数的n1的|n2~省讄?Q当n2为缺省设|时会将n1截尾为整敎ͼ如果n2|截֜数点左边相应的位上?/p>
单行日期函数 单行日期函数操作DATA数据cdQ绝大多数都有DATA数据cd的参敎ͼl大多数q回的也是DATA数据cd的倹{?/p>
ADD_MONTHS(,QiQ? q回日期d加上i个月后的l果。i可以使Q意整数。如果i是一个小敎ͼ那么数据库将隐式的他转换成整敎ͼ会截去数点后面的部分?/p>
LAST_DAY() 函数q回包含日期d的月份的最后一?/p>
MONTHS_BETWEEN(,) q回d1和d2之间月的数目,如果d1和d2的日的日期都相同Q或者都使该月的最后一天,那么返回一个整敎ͼ否则会返回的l果包含一个分数?/p>
NEW_TIME(,,) d1是一个日期数据类型,当时区tz1中的日期和时间是dӞq回时区tz2中的日期和时间。tz1和tz2时字W串?/p>
NEXT_DAY(,) q回日期d后由dowl出的条件的W一天,dow使用当前会话中给出的语言指定了一周中的某一天,q回的时间分量与d的时间分量相同?/p>
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 ROUND([,]) 日期d按照fmt指定的格式舍入,fmt为字W串?/p>
SYADATE 函数没有参数Q返回当前日期和旉?/p>
TRUNC([,]) q回由fmt指定的单位的日期d. 单行转换函数 单行转换函数用于操作多数据类型,在数据类型之间进行{换?/p>
CHARTORWID() c 使一个字W串Q函数将c转换为RWID数据cd?/p>
SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA') CONVERT(,[,]) c֭W串Qdset、sset是两个字W集Q函数将字符串c由sset字符集{换ؓdset字符集,sset的缺省设|ؓ数据库的字符集?/p>
HEXTORAW() x?6q制的字W串Q函数将16q制的x转换为RAW数据cd?/p>
RAWTOHEX() x是RAW数据cd字符Ԍ函数RAW数据c{换ؓ16q制的数据类型?/p>
ROWIDTOCHAR() 函数ROWID数据cd转换为CHAR数据cd?/p>
TO_CHAR([[,) x是一个data或number数据cdQ函数将x转换成fmt指定格式的char数据cdQ如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制q回的月份和日䆾所使用的语a。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定数位和千分位的分隔W,以及货币W号?/p>
NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string" TO_DATE([,[,Q?/p>
c表示字符Ԍfmt表示一U特D格式的字符丌Ӏ返回按照fmt格式昄的c,nlsparm表示使用的语a。函数将字符串c转换成date数据cd?/p>
TO_MULTI_BYTE() c表示一个字W串Q函数将c的担子截字符转换成多字节字符?/p>
TO_NUMBER([,[,) c表示字符Ԍfmt表示一个特D格式的字符Ԍ函数q回值按照fmt指定的格式显C。nlsparm表示语言Q函数将q回c代表的数字?/p>
TO_SINGLE_BYTE() 字W串c中得多字节字W{化成{h的单字节字符。该函数仅当数据库字W集同时包含单字节和多字节字W时才?/p>
其它单行函数 BFILENAME( ,) dir是一个directorycd的对象,fileZ文g名。函数返回一个空的BFILE位置值指C符Q函数用于初始化BFILE变量或者是BFILE列?/p>
DECODE(,,[,,,[]) x是一个表辑ּQm1是一个匹配表辑ּQx与m1比较Q如果m1{于xQ那么返回r1,否则,x与m2比较Q依ơ类推m3,m4,m5....直到有返回结果?/p>
DUMP(,[,[,[,]]]) x是一个表辑ּ或字W,fmt表示8q制?0q制?6q制、或则单字符。函数返回包含了有关x的内部表CZ息的VARCHAR2cd的倹{如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回?/p>
EMPTY_BLOB() 该函数没有参敎ͼ函数q回 一个空的BLOB位置指示W。函数用于初始化一个BLOB变量或BLOB列?/p>
EMPTY_CLOB() 该函数没有参敎ͼ函数q回 一个空的CLOB位置指示W。函数用于初始化一个CLOB变量或CLOB列?/p>
GREATEST() exp_list是一列表辑ּQ返回其中最大的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,那么q回的结果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?/p>
LEAST() exp_list是一列表辑ּQ返回其中最的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,返回的l果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?/p>
UID 该函数没有参敎ͼq回唯一标示当前数据库用L整数?/p>
USER q回当前用户的用户名 USERENV() Zoptq回包含当前会话信息。opt的可选gؓQ?/p>
ISDBA 会话中SYSDBA脚色响应Q返回TRUE SESSIONID q回审计会话标示WENTRYID q回可用的审计项标示W?/p>
INSTANCE 在会话连接后Q返回实例标C符。该值只用于q行Parallel 服务器ƈ且有 多个实例的情况下使用?/p>
LANGUAGE q回语言、地域、数据库讄的字W集?/p>
LANG q回语言名称的ISO~写?/p>
TERMINAL 为当前会话用的l端或计机q回操作pȝ的标C符?/p>
VSIZE() x是一个表辑ּ。返回x内部表示的字节数?/p>
SQL中的l函?/p>
l函C叫集合函敎ͼq回Z多个行的单一l果Q行的准数量无法确定,除非查询被执行ƈ且所有的l果都被包含在内。与单行函数不同的是Q在解析时所有的行都是已知的。由于这U差别ɾl函C单行函数有在要求和行Z有微的差异. l(多行Q函?/p>
与单行函数相比,oracle提供了丰富的Zl的Q多行的函数。这些函数可以在select或select的having子句中用,当用于select子串时常帔R和GROUP BY一起用?/p>
AVG([{DISYINCT|ALL}]) q回数值的q_倹{缺省设|ؓALL. 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 COUNT({*|DISTINCT|ALL} ) q回查询中行的数目,~省讄是ALL,*表示q回所有的行?/p>
MAX([{DISTINCT|ALL}]) q回选择列表目的最大|如果x是字W串数据cdQ他q回一个VARCHAR2数据cdQ如果X是一个DATA数据cdQ返回一个日期,如果X是numeric数据cdQ返回一个数字。注意distinct和all不v作用Q应为最大gq两U设|是相同的?/p>
MIN([{DISTINCT|ALL}]) q回选择列表目的最倹{?/p>
STDDEV([{DISTINCT|ALL}]) q回选者的列表目的标准差Q所谓标准差是方差的qx栏V?/p>
SUM([{DISTINCT|ALL}]) q回选择列表目的数值的d?/p>
VARIANCE([{DISTINCT|ALL}]) q回选择列表目的统计方差?/p>
用GROUP BYl数据分l?/p>
正如题目暗示的那L函数是操作那些已经分好l的数据Q我们告诉数据库用GROUP BY怎样l数据分l或者分c,当我们在SELECT语句的SELECT子句中用组函数Ӟ我们必须把ؓ分组或非常数列放|在GROUP BY子句中,如果没有用group byq行专门处理Q那么缺省的分类是将整个l果设ؓ一cR?/p>
select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982 在这个例子中Q我们用state字段分类Q如果我们要结果按照zip_codes排序,可以用ORDER BY语句QORDER BY子句可以使用列或l函数?/p>
select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982 用HAVING子句限制分组数据 现在你已l知道了在查询的SELECT语句和ORDER BY子句中用主函数Q组函数只能用于两个子串中,l函C能用于WHERE子串中,例如下面的查询是错误的: 错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk q个语句中数据库不知道SUM()是什么,当我们需要指C数据库对行分组Q然后限制分l后的行的输出时Q正的Ҏ是用HAVING语句Q?/p>
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000; 嵌套函数 函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可l承的执行过E。但函数的优先权只是Z位置Q函数遵循由内到外,由左到右的原则。嵌套技术一般用于象DECODEq样的能被用于逻辑判断语句IF....THEN...ELSE的函数?
]]>
岭澳核电有限公司
黄福?
---- ORACLE数据库作为大型数据库理pȝQ近q来一直占有世界上高端数据库的最大䆾额,其强大而完善的数据库管理功能,以及ORACLE公司推陈出新的不断努力,一直成为IT业界瞩目的焦炏V岭x늫的数据库q_采用了ORACLE7.3作ؓ后端q_Q前端选择了ORACLE公司的DEVELOPER 2000 及DESIGNER 2000作ؓ开发工P采用了目前流行的CLIENT/SERVER模式。本人在ORACLEpȝ的开发中Q就ORACLE的整套开发工hZ些自q体会Q供同行参考?
---- 一. ORACLE SQL PLUS 使用技?
---- ①查N复记?
SELECT DRAWING,DSNO FROM EM5_PIPE_PREFAB
WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5
_PIPE_PREFAB D
WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
EM5_PIPE_PREFAB.DSNO=D.DSNO);
---- 执行上述SQL语句后就可以昄所有DRAWING和DSNO相同且重复的记录?
---- 删除重复记录:
DELETE FROM EM5_PIPE_PREFAB
WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5
_PIPE_PREFAB D
WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
EM5_PIPE_PREFAB.DSNO=D.DSNO);
---- 执行上述SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录?
---- ?快速编译所有视?
---- 当在把数据库倒入到新的服务器上后(数据库重?Q需要将视图重新~译一遍,因ؓ该表I间视图到其它表I间的表的连接会出现问题Q可以利用PL/SQL的语aҎ,快速编译?
SQL >SPOOL ON.SQL
SQL >SELECT ‘ALTER VIEW ‘||TNAME||?br />COMPILE;?FROM TAB;
SQL >SPOOL OFF
然后执行ON.SQL卛_?br />SQL >@ON.SQL
当然Q授权和创徏同义词也可以快速进行,如:
SQL >SELECT ‘GRANT SELECT ON ?br />||TNAME||?TO USERNAME;?FROM TAB;
SQL >SELECT ‘CREATE SYNONYM
‘||TNAME||?FOR USERNAME.’||TNAME||??FROM TAB;
?用外联接提高表连接的查询速度
在作表连?常用于视?Ӟ怋用以下方法来查询数据:
SELECT PAY_NO, PROJECT_NAME
FROM A
WHERE A.PAY_NO NOT IN (SELECT PAY_
NO FROM B WHERE VALUE >=120000);
---- 但是若表A?0000条记录,表B?0000条记录,则要用掉30分钟才能查完Q主要因为NOT IN要进行一条一条的比较Q共需?0000*10000ơ比较后Q才能得到结果。该用外联接后,可以~短?分左右的旉:
SELECT PAY_NO,PROJECT_NAME
FROM A,B
WHERE A.PAY_NO=B.PAY_NO(+)
AND B.PAY_NO IS NULL
AND B.VALUE >=12000;
---- ?怎样d文本型操作系l文?
---- 在PL/SQL 3.3以上的版本中QUTL_FILE包允许用户通过PL/SQLd操作pȝ文g。如下:
DECALRE
FILE_HANDLE UTL_FILE.FILE_TYPE;
BEGIN
FILE_HANDLE:=UTL_FILE.FOPEN(
‘C:\?’TEST.TXT?’A?;
UTL_FILE.PUT_LINE(FILE_HANDLE,?br />HELLO,IT’S A TEST TXT FILE?;
UTL_FILE.FCLOSE(FILE_HANDLE);
END;
---- 相关UTL_FILE数据库包详细信息可以参见相关资料?br />
---- ?怎样在数据库触发器中使用列的新g旧?
---- 在数据库触发器中几乎L要用触发器的列|如果某条语句需要某列修改前的|使用:OLD可以了Q用某列修改后的新|?NEW可以了。如:OLD.DEPT_NO,:NEW.DEPT_NO?
---- ?ORACLE DEVELOPER 2000使用技巧:
---- ?改变FORM(FMX模块)q行时的Runform4.5的题?
---- DEVELOPER2000中FMX默认题头为:Developer/2000 Forms Runtime for Windows 95 / NT 你可以改己定义的标题,
---- 1. 在FormU触发器中添加触发WHEN-NEW-FORM-INSTANCE
---- 2. 在此触发器中写如下代码:
set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT
SYSTEM Ƣ迎使用');
---- ?如何隐藏菜单中的window选项:
---- 在创q菜单Ӟ最后选项Lwindow,下面介绍如何L?
---- 1. 创徏一个Menu
---- 2. 在Menu中徏立一个Item,命名为WINDOW?
---- 3. 讄该Item属性如?
----
Menu Item Type:Magic
Command Type:Null
Magic Item:Window
Lable:为空
---- ?怎样创徏动态下拉列表List
---- Developer 2000 中的列表是通过讄相关属性而完成数据项的列表设|的Q但那只是静态的Q有时你惌某项成ؓ动态的列表Q随输入数据的改变而改变,需要动手去~个程序。下面详l介l怎样d:
---- 有块EBOP_CABLE_ACCOUNTQ下有SPECIFICATION数据,当一q入该模块时Q就SPECIFICATION在数据库中存储的值动态显C出来,先在Form4.5中徏立一个PRCEDUREQ命名ؓDYN_LIST:
PROCEDURE DYN_LIST IS
CURSOR C1 IS
SELECT DISTINCT(SPECIFICATION)
FROM EBOP_CABLE_ACCOUNT;
CNT NUMBER;
i NUMBER;
TNAME EBOP_CABLE_
ACCOUNT.SPECIFICATION%TYPE;
BEGIN
CLEAR_LIST('EBOP_CABLE_
ACCOUNT.SPECIFICATION');
SELECT COUNT(DISTINCT
(SPECIFICATION)) INTO CNT FROM EBOP
_CABLE_ACCOUNT;
open C1;
FOR i IN 1..CNT LOOP
FETCH C1 INTO TNAME;
EXIT WHEN C1%NOTFOUND
OR C1%NOTFOUND IS NULL;
ADD_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT
.SPECIFICATION',i,TNAME,TNAME);
END LOOP;
DELETE_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);
CLOSE C1;
END;
然后在FORM的WHEN-NEW
-FORM-INSTANCE触发子中加入一行:
DYN_LIST;
---- q样一q入该FMXQ就会动态刷新该列表。除此之外,SPECIFICATION数据Ҏ为列表项?
---- ?当显C多条记录且数据特别多Ӟ如何l织录入及显C界?
---- 如上图所C,PRN代码及设备代码在d1(CONTENT?上,其它数据在d2(STACK?上,所有数据项Z个表的列或一个块的数据项。在拉动水^滚动条时或用TAB或敲回R键时Q将看到全部数据V这U排布方法适用于数据项特别多又xC多条记录时用。主要制作顺序ؓQ先建立两个dQ画?(CONTENT?Q画?(STACK?Q然后徏立块Q选画布时用画?Q这h有项都显C在d1上,然后选中除PRN代码及设备代码之外的所有数据项Q选TOOLS菜单下的PROPERTIES选项Q将q些数据的CANVAS属性选ؓd2(STACK?Q然后调整整体位|就可以了?
---- ?如何在FORM的受限触发子中提交保存数?
---- 在FORM中很多触发子是不能用COMMIT WORK语句的,当你在该触发子中使用了UPDATEQDELETE{操作ƈ想立卛_盘时Q就需要COMMIT WORK语句了。首先在服务器端建立DB_SQL_COMMITq个q程(采用ORACLE7.3数据?Q?
PROCEDURE DB_SQL_COMMIT IS
source_cursor integer;
ignore integer;
V7 NUMBER :=2;
BEGIN
source_cursor:=dbms_sql.open_cursor;
dbms_sql.parse(source_cursor,'COMMIT WORK',V7);
ignore:=dbms_sql.execute(source_cursor);
DBMS_SQL.CLOSE_CURSOR(source_cursor);
END;
---- 然后在FORM中该触发子中调用q程DB_SQL_COMMIT;可以了Q当然你可以Ҏ自己需要将该过E加入参敎ͼq样通过参数可以得到执行DML语句的权限?br />
?如何在FORM中实现某数据自动按记录序号加一操作
---- 讑֝名ؓVO,要操作的数据ؓVO_ID,在该块中建立块触发子WHEN-CREATE- RECORDQ加入如下代码:
:VO_ID:=:System.Trigger_Record;
---- q样每当生成新记录时VO_ID׃自动加一了?
---- ?如何在一个FORM中调用另一个FORMQ或在一个块中调用另一个块时显C特定的记录有时用户会要求在调用另一个FORMӞ只显C相关的记录QD例如下,在一个FORM的块中有一个按钮,在按钮触发子中加入如下代码:
DECLARE
PM
PARAMLIST;
BEGIN
PM:=GET_PARAMETER_LIST('PM');
IF NOT ID_NULL(PM) THEN
DESTROY_PARAMETER_LIST('PM');
END IF;
PM:=CREATE_PARAMETER_LIST('PM');
......................
ADD_PARAMETER(PM,'THE_WHERE',
TEXT_PARAMETER,'EM_NAME=''EM4''
AND EM_PROJECT_NAME=''支架预制''');
OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);
ENDQ?br />---- 其中EM_NAMEQEM_PROJECT_NAME为本FORM某块的数据项QPAYMENT调用的FORM模块。这样通过传递参数列表就可以得到惌的结果。在FORM PAYMENT.FMB中,建立一参数THE_WHEREQCHAR型,?000Q然后在PAYMENT.FMB中徏立FORMU触发子WHEN-NEW-FORM-INSTANCEQ在该触发子中加入以下语句:
IF :PARAMETER.THE_WHERE IS NOT NULL THEN
SET_BLOCK_PROPERTY('PAYMENT',
DEFAULT_WHERE,:PARAMETER.THE_WHERE);
END IF;
---- 其中PAYMENT昄的块Q这样通过参数传递就得到惌的某些特定条件的数据了?
---- ?在FORM中当有主从块Ӟq箋输入记录如何避免被不断的提示保存Q?
---- 每输入一条主记录和若q条该主记录的从记录后,此时再导航到d输下一条记录,FORM׃提示你是否要保存记录Q而你q不希望FORM提示Q让它自动保存,此时你可以到Program Units中找到过EPROCEDURE Clear_All_Master_DetailsQ然后在q个q程中找到语?
Clear_Block(ASK_COMMIT);
---- 其改ؓClear_Block(DO_COMMIT);可以了?
---- ?在Report开始时选择排序?
---- 在报表开始的Parameter Form中选择报表按哪个数据项排序Q?
---- 1. 先在USER PARAMETER 中创建SORT参数Qؓ字符型,?0?
---- 2. 初始值选’责L?然后这四个D入到DATA SELECTION中,形成列表?
---- 3. 然后处理QUERY中的SQL语句:
select CHARGER,FCO_NO,EM_NAME,FCO
_NO,DESCRIPTION, FCR_POINT
from FCR_MAIN
ORDER BY DECODE(:SORT,'责Q?,CHARGER,'FCO?,
FCO_NO,'FCR?,FCR_NO,'FCR?,EM_NAME)
---- ?在Developer 2000中如何读写操作系l文?
---- 在用Developer 2000的开发工具开发应用程序时Q经常碰到需要读写外部文件的问题Q可以用ORACLE 带的包TEXT_IO来完成这w求。例?
DECLARE
IN_FILE TEXT_IO.FILE_TYPE;
OUT_FILE TEXT_IO.FILE_TYPE;
LINE_BUFER VARCHAR2(80);
/*若不用IN_FILE,可以各字段联接在一赯值给此变?/
BEGIN
IN_FILE:=TEXT_IO.FOPEN
(‘C:\TEMP\TEST1.TXT?’r?;
OUT_FILE:=TEXT_IO.FOPEN
(‘C:\TEMP\TEST2.TXT?’w+?;
LOOP
TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);
TEXT_IO.PUT(LINE_BUFER);
TEXT_IO.NEW_LINE;
TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);
END LOOP;
EXCEPTION
WHEN no_data_found THEN
TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....?;
TEXT_IO.FCLOSE(IN_FILE);
TEXT_IO.FCLOSE(OUT_FILE);
END;
---- ?数据库管?
---- ?在删除一个表中的全部数据ӞM用TRUNCATE TABLE 表名;因ؓ用DROP TABLEQDELETE * FROM 表名ӞTABLESPACE表空间该表的占用I间q未释放Q反复几ơDROPQDELETE操作后,该TABLESPACE上百兆的I间p耗光了?
---- ?数据库文件的UdҎ
---- 当想数据库文gUd到另外一个目录下Ӟ可以用ALTER DATABASE命o来移?比ALTER TABLESPACE适用性强)Q?
---- 1. 使用SERVER MANAGER关闭实例.
SVRMGR > connect internal;
SVRMGR > shutdown;
SVRMGR >exit;
---- 2. 使用操作pȝ命o来移动数据库文g位置(假设q里操作pȝ为SOLARIS 2.6). 在UNIX中用 mv命o可以把文件移动到新的位置Q?
#mv /ora13/orarun/document.dbf /ora12/orarun
---- 3. 装蝲数据库ƈ用alter database命o来改变数据库中的文g?
SVRMGR > connect internal;
SVRMGR > startup mount RUN73;
SVRMGR > alter database rename file
> ? ora13/orarun/document.dbf?br />> ? ora12/orarun/document.dbf?
---- 4. 启动实例.
SVRMGR > alter database open;
---- (huangfutong@china.com)
---- ORACLE数据库开发经验ȝ
Oracle分两大块Q一块是开发,一块是理。开发主要是写写存储q程、触发器什么的Q还有就是用Oracle的Develop工具做form。有点类gE序员,需要有较强的逻辑思维和创造能力,个h觉得会比较辛苦,是青春饭Q管理则需要对Oracle数据库的原理有深ȝ认识Q有全局操纵的能力和紧密的思维Q责任较大,因ؓ一个小的失误就会down掉整个数据库Q相对前者来_后者更看重l验?
因ؓ数据库管理的责Q重大Q很公司愿意请一个刚刚接触Oracle的hȝ理数据库。对于刚刚毕业的q轻人来_可以先选择做开发,有一定经验后转型Q去做数据库的管理。当Ӟq个q是要看Z的实际情冉|定?/p>
二、学习方?/strong>
我的Ҏ很简单,是Q看书、思考、写W记、做实验、再思考、再写笔记?/p>
看完理论的东西,自己静下心来xQ多问自己几个ؓ什么,然后把所学和所想的知识点做个笔讎ͼ在想不通或有疑问的时候,做做实验,x怎么会这P同样的,把实验的l果C来。思考和做实验是Z深入的了解这个知识点。而做W记的过E,也是理清自己思\的过E?
学习的过E是使一个问题由模糊到清晎ͼ再由清晰到模p的q程。而每ơ的改变都代表着你又学到了一个新的知识点?
学习的过E也是从点到U,从线到网Q从|到面的q程。当点变成线的时候,你会有总豁然开朗的感觉。当|到面的时候,你就是高手了?/p>
很多|友Q特别是初学的hQ一到问题拿到论坛上来问Q在问前Q你有没有查q书Q自己有没有研究q,有没有搜索一下论坛?q就叫思维惰性。由别h来回{你的问题,会让你在短时间内不费劲地弄懂q个知识点,然而通过自己的努力去研究它,不但会更深入的了解这个知识点Q更重要的是在研I的q程会提高你解决问题和分析问题的能力。ȝ来说Q没有钻研的学习态度Q不学什么东西,都不会成功的?
当然Q初学的人很多时候是因ؓ遇到问题Ӟ无从下手Q也不知道去哪里找资料,才会到论坛上提问题的。但我认为,在提问的时候,是不是可以问别h是如何分析这个问题?从哪里可以找到相关的资料Q而不是这个问题的{案是什么?授h以鱼不如授h以渔?/p>
下面我讲下我处理问题的过E?/p>
首先要知道Oracle的官方网站:www.oracle.com q里有Oracle的各U版本的数据库、应用工具和权威的官Ҏ档。其ơ,q要知道http://metalink.oracle.com/q里是买了Oracle服务或是oracle的合作伙伴才可以q去的,里面有很多权威的解决Ҏ和补丁。然后就是一些著名网站:asktom.oracle.com www.orafaq.net, www.dbazine.com。这里有很多l验之谈?/p>
遇到问题了。如果是概念上的问题Q第一旉可以找tahiti.oracle.comQ这里会l你最详细的解释。如果在q行的过E中Z什么错误。可以去metalink看看。如果是想知道事务的处理的经验之谈。可以去asktom。当然。这里只是相对而言?/p>
三、Oracle的体p?/strong> 1、物理结构(由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成) 控制文gQ包含维护和验证数据库完整性的必要信息、例如,控制文g用于识别数据文g和重做日志文Ӟ一个数据库臛_需要一个控制文? 数据文gQ存储数据的文g. 重做日志文gQ含Ҏ据库所做的更改记录Q这样万一出现故障可以启用数据恢复。一个数据库臛_需要两个重做日志文? 参数文gQ定义Oracle例程的特性,例如它包含调整SGA中一些内存结构大的参数. 归档文gQ是重做日志文g的脱机副本,q些副本可能对于从介质失败中q行恢复很必要? 密码文gQ认证哪些用h权限启动和关闭Oracle例程. 表空_是数据库中的基本逻辑l构Q一pd数据文g的集合?br /> D:是对象在数据库中占用的空? SGAQ是用于存储数据库信息的内存区,该信息ؓ数据库进E所׃n。它包含Oracle 服务器的数据和控制信?它是在Oracle服务器所ȝ的计机的实际内存中得以分配Q如果实际内存不够再往虚拟内存中写? PGAQ包含单个服务器q程或单个后台进E的数据和控制信息,与几个进E共享的SGA 正相反PGA 是只被一个进E用的区域QPGA 在创E时分配在终止进E时回收. 4、后台进E(数据写进E、日志写q程、系l监控、进E监控、检查点q程、归档进E、服务进E、用戯E) 数据写进E:负责更改的数据从数据库~冲区高速缓存写入数据文? 5、Oracle例程QOracle例程由SGA内存l构和用于管理数据库的后台进E组成。例E一ơ只能打开和用一个数据库? 6、SCN(System ChangeNumber)Q系l改变号Q一个由pȝ内部l护的序列号。当pȝ需要更新的时候自动增加,他是pȝ中维持数据的一致性和序恢复的重要标志?/p> 四、深入学? 理Q可以考OCP证书Q对Oracle先有一个系l的学习Q然后看Oracle Concepts、Oracle online document,对oracle的原理会有更深入的了解,同时可以开始进行一些专题的研究如:RMAN、RAS、STATSPACT、DATAGUARD、TUNING、BACKUP&RECOVER{等?/p> 开发:对于惛_Oracle开发的Q在了解完Oracle基本的体pȝ构之后,可以重点xPL/SQL及Oracle的开发工兯一部分。PL/SQL主要是包括怎么写SQL语句Q怎么使用Oracle本n的函敎ͼ怎么写存储过E、存储函数、触发器{?Oracle的开发工具主要就是Oracle自己的Developer SuiteQOracle Forms Developer and Reports Developerq些Q,学会如何熟练使用q些工具?br />
Oracle的体pd庞大Q要学习它,首先要了解Oracle的框架。在q里Q简要的讲一下Oracle的架构,让初学者对Oracle有一个整体的认识?/p>
2、逻辑l构Q表I间、段、区、块Q?/p>
区:是ؓ数据一ơ性预留的一个较大的存储I间.
块:ORACLE最基本的存储单位,在徏立数据库的时候指?
3、内存分配(SGA和PGAQ?/p>
日志写进E:重做日志缓冲区中的更改写入在线重做日志文g
pȝ监控Q检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢?br /> q程监控Q负责在一个Oracle q程p|时清理资?
查点q程Q负责在每当~冲区高速缓存中的更Ҏ久地记录在数据库中时,更新控制文g和数据文件中的数据库状态信息?
归档q程Q在每次日志切换时把已满的日志组q行备䆾或归?
服务q程Q用戯E服务?
用户q程Q在客户端,负责用LSQL语句传递给服务q程Qƈ从服务器D|回查询数据?
]]>