﻿<?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-清睛仪明-文章分类-Oracle</title><link>http://www.blogjava.net/msmary/category/26457.html</link><description>书山有路勤为径，学海无涯苦作舟</description><language>zh-cn</language><lastBuildDate>Sat, 26 Nov 2011 15:13:37 GMT</lastBuildDate><pubDate>Sat, 26 Nov 2011 15:13:37 GMT</pubDate><ttl>60</ttl><item><title>优化查询SQL语句</title><link>http://www.blogjava.net/msmary/articles/330160.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Sun, 29 Aug 2010 04:51:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/330160.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/330160.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/330160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/330160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/330160.html</trackback:ping><description><![CDATA[<p>1.已知employee表数据如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp; EMPNO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPNAME&nbsp;&nbsp;&nbsp; DEPT<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Z3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 张三&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 销售部<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 李四&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 销售部<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; W5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 王五&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 技术部<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Z6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 赵六&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;技术部<br />
&nbsp;&nbsp;&nbsp; 要得到如下结果:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPNO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPNAME&nbsp;&nbsp;&nbsp;&nbsp; DEPT</p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Z3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 张三&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 销售部<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 李四&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 销售部<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; W5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 王五&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 技术部<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Z6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 赵六&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;技术部<br />
&nbsp;&nbsp;&nbsp; 其SQL如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select row_number() over(partition by dept order by empno) as num,empno,empname,dept from employee;<br />
<br />
2.一成绩表中，求出只要有一门及以上的课程不及格的同学<br />
&nbsp;&nbsp;&nbsp;&nbsp; select sno,sname from grades group by sno having min(score) &lt; 60;
<img src ="http://www.blogjava.net/msmary/aggbug/330160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2010-08-29 12:51 <a href="http://www.blogjava.net/msmary/articles/330160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Instead of Trigger的用法</title><link>http://www.blogjava.net/msmary/articles/298265.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Wed, 14 Oct 2009 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/298265.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/298265.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/298265.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/298265.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/298265.html</trackback:ping><description><![CDATA[<p>1. instead of trigger 是基于视图建立的,不能建在表上,为什么要建在视图上,一般的视图如果其数据来源一个表并且包含该表的主键,就可以对视图进行DML操作.另外一种情况是从多个表查询出来的.这样我们就不能对视图进行操作了,也就是只能查询.instead of trigger可以解决建在多表上视图的更新操作.<br />
2.下面我们就来实例操作:<br />
a.先建表,简单点就三个分别是学生表,课程表,学生选课表<br />
CREATE TABLE STUDENT<br />
(<br />
&nbsp;&nbsp; CODE&nbsp; VARCHAR2(5),<br />
&nbsp;&nbsp; LNAME VARCHAR2(200)<br />
)<br />
CREATE TABLE COURSE<br />
(<br />
&nbsp;&nbsp;&nbsp; CODE&nbsp; VARCHAR2(5),<br />
&nbsp;&nbsp;&nbsp; CNAME VARCHAR2(30)<br />
)<br />
CREATE TABLE ST_CR<br />
(<br />
&nbsp;&nbsp; STUDENT VARCHAR2(5),<br />
&nbsp;&nbsp; COURSE&nbsp; VARCHAR2(5),<br />
&nbsp;&nbsp; GRADE&nbsp;&nbsp; NUMBER<br />
)<br />
--表的约束<br />
ALTER TABLE STUDENT ADD CONSTRAINT STUDENT$PK PRIMARY KEY(CODE);<br />
ALTER TABLE COURSE ADD CONSTRAINT COURSE$PK PRIMARY KEY(CODE);<br />
ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$PK PRIMARY KEY(STUDENT, COURSE);<br />
ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$FK$STUDENT FOREIGN KEY(STUDENT) REFERENCES STUDENT(CODE);<br />
ALTER TABLE ST_CR ADD CONSTRAINT ST_CR$FK$COURSE FOREIGN KEY(COURSE) REFERENCES COURSE(CODE);<br />
<br />
b.基于这三个表的视图<br />
CREATE OR REPLACE VIEW STUDENT_STATUS AS<br />
&nbsp;&nbsp; SELECT S.CODE S_CODE, S.LNAME STUDENT, C.CODE C_CODE, C.CNAME COURSE, SC.GRADE GRADE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM STUDENT S, COURSE C, ST_CR SC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE S.CODE = SC.STUDENT<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND C.CODE = SC.COURSE<br />
<br />
c.基于视图的触发器<br />
CREATE OR REPLACE TRIGGER TRI_STCR INSTEAD OF INSERT ON STUDENT_STATUS<br />
&nbsp;&nbsp; FOR EACH ROW<br />
DECLARE<br />
&nbsp; W_ACTION VARCHAR2(1);<br />
BEGIN<br />
&nbsp; IF&nbsp;&nbsp;&nbsp; INSERTING THEN<br />
&nbsp;&nbsp;&nbsp; W_ACTION := 'I';<br />
&nbsp; ELSE<br />
&nbsp;&nbsp;&nbsp; RAISE PROGRAM_ERROR;<br />
&nbsp; END IF;<br />
&nbsp;&nbsp;&nbsp; INSERT INTO STUDENT(CODE, LNAME) VALUES(:NEW.S_CODE,:NEW.STUDENT);<br />
&nbsp;&nbsp;&nbsp; INSERT INTO COURSE(CODE, CNAME) VALUES(:NEW.C_CODE, :NEW.COURSE);<br />
&nbsp;&nbsp;&nbsp; INSERT INTO ST_CR(STUDENT, COURSE, GRADE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES(:NEW.S_CODE, :NEW.C_CODE, :NEW.GRADE);<br />
END;<br />
<br />
d.对视图执行数据插入<br />
INSERT INTO STUDENT_STATUS(S_CODE, STUDENT, C_CODE, COURSE, GRADE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUES('001','Mike','EN','English',86);</p>
<p>可以看到每个表各有一条数据已经插入.</p>
<img src ="http://www.blogjava.net/msmary/aggbug/298265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2009-10-14 17:51 <a href="http://www.blogjava.net/msmary/articles/298265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle的动态语句</title><link>http://www.blogjava.net/msmary/articles/297527.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Fri, 09 Oct 2009 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/297527.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/297527.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/297527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/297527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/297527.html</trackback:ping><description><![CDATA[testing on pl/sql developer<br />
/************************/<br />
DECLARE<br />
&nbsp; W_ORDSEQ NUMBER := 5465;<br />
&nbsp; W_ORDNO&nbsp; VARCHAR2(30);<br />
&nbsp; W_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(30) := 'M001';<br />
BEGIN<br />
&nbsp;&nbsp; EXECUTE IMMEDIATE 'SELECT ORDNO FROM ORD WHERE ORDSEQ = :P_ORDSEQ AND ORDTY=:P_ORDTY' INTO W_ORDNO USING W_ORDSEQ,W_TYPE;<br />
&nbsp;&nbsp; DBMS_OUTPUT.put_LINE(W_ORDNO);<br />
END;<br />
<img src ="http://www.blogjava.net/msmary/aggbug/297527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2009-10-09 14:07 <a href="http://www.blogjava.net/msmary/articles/297527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多行显示为一行</title><link>http://www.blogjava.net/msmary/articles/285976.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Wed, 08 Jul 2009 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/285976.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/285976.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/285976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/285976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/285976.html</trackback:ping><description><![CDATA[SELECT MAX(DECODE(COL,'1',CODE,'')),MAX(DECODE(COL,'2',CODE,'')) FROM (<br />
SELECT CODE,LNAME,CNAME,PROGUNIT,ROW_NUMBER() OVER(PARTITION BY PROGUNIT ORDER BY PROGUNIT) COL FROM ORDTY WHERE PROGUNIT='SMP')
<img src ="http://www.blogjava.net/msmary/aggbug/285976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2009-07-08 21:55 <a href="http://www.blogjava.net/msmary/articles/285976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle分析函数</title><link>http://www.blogjava.net/msmary/articles/284118.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 25 Jun 2009 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/284118.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/284118.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/284118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/284118.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/284118.html</trackback:ping><description><![CDATA[Oracle从8.1.6开始提供分析函数，分析函数用于计算基于组的某种聚合值，它和聚合函数的不同之处是对于每个组返回多行，而聚合函数对于每个组只返回一行。
<p><font size="2"></font></p>
<br />
<p><font size="2">下面例子中使用的表来自Oracle自带的HR用户下的表，如果没有安装该用户，可以在SYS用户下运行$ORACLE_HOME/demo/schema/human_resources/hr_main.sql来创建。</font></p>
<p><font size="2">除本文内容外，你还可参考：<br />
ROLLUP与CUBE <a href="http://xsb.itpub.net/post/419/29159">http://xsb.itpub.net/post/419/29159</a><br />
<font size="2">分析函数使用例子介绍：<a href="http://xsb.itpub.net/post/419/44634">http://xsb.itpub.net/post/419/44634</a></font></font></p>
<p><font size="2">本文如果未指明，缺省是在HR用户下运行例子。<br />
开窗函数的的理解：<br />
开窗函数指定了分析函数工作的数据窗口大小，这个数据窗口大小可能会随着行的变化而变化，举例如下：<br />
over（order by salary） 按照salary排序进行累计，order by是个默认的开窗函数<br />
over（partition by deptno）按照部门分区<br />
over（order by salary range between 50 preceding and 150 following）<br />
每行对应的数据窗口是之前行幅度值不超过50，之后行幅度值不超过150<br />
over（order by salary rows between 50 preceding and 150 following）<br />
每行对应的数据窗口是之前50行，之后150行<br />
over（order by salary rows between unbounded preceding and unbounded following）<br />
每行对应的数据窗口是从第一行到最后一行，等效：<br />
over（order by salary range between unbounded preceding and unbounded following）</font></p>
<p><font size="2">主要参考资料：《expert one-on-one》 Tom Kyte 《Oracle9i SQL Reference》第6章<br />
<br />
<font size="2">1).AVG <br />
功能描述：用于计算一个组和数据窗口内表达式的平均值。<br />
SAMPLE：下面的例子中列c_mavg计算员工表中每个员工的平均薪水报告，该平均值由当前员工和与之具有相同经理的前一个和后一个三者的平均数得来；</font> </p>
<p><font size="2">SELECT manager_id, last_name, hire_date, salary,<br />
AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date <br />
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg<br />
FROM employees;</font></p>
<p><font size="2">MANAGER_ID LAST_NAME HIRE_DATE SALARY C_MAVG<br />
---------- ------------------------- --------- ---------- ----------<br />
100 Kochhar 21-SEP-89 17000 17000<br />
100 De Haan 13-JAN-93 17000 15000<br />
100 Raphaely 07-DEC-94 11000 11966.6667<br />
100 Kaufling 01-MAY-95 7900 10633.3333<br />
100 Hartstein 17-FEB-96 13000 9633.33333<br />
100 Weiss 18-JUL-96 8000 11666.6667<br />
100 Russell 01-OCT-96 14000 11833.3333</font></p>
<p><font size="2">2).CORR <br />
功能描述：返回一对表达式的相关系数，它是如下的缩写：<br />
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))<br />
从统计上讲，相关性是变量之间关联的强度，变量之间的关联意味着在某种程度<br />
上一个变量的值可由其它的值进行预测。通过返回一个-1~1之间的一个数, 相关<br />
系数给出了关联的强度，0表示不相关。<br />
SAMPLE：下例返回1998年月销售收入和月单位销售的关系的累积系数（本例在SH用户下运行）</font></p>
<p><font size="2">SELECT t.calendar_month_number,<br />
CORR (SUM(s.amount_sold), SUM(s.quantity_sold))<br />
OVER (ORDER BY t.calendar_month_number) as CUM_CORR<br />
FROM sales s, times t<br />
WHERE s.time_id = t.time_id AND calendar_year = 1998<br />
GROUP BY t.calendar_month_number<br />
ORDER BY t.calendar_month_number;</font></p>
<p><font size="2">CALENDAR_MONTH_NUMBER CUM_CORR<br />
--------------------- ----------<br />
1<br />
2 1<br />
3 .994309382<br />
4 .852040875<br />
5 .846652204<br />
6 .871250628<br />
7 .910029803<br />
8 .917556399<br />
9 .920154356<br />
10 .86720251<br />
11 .844864765<br />
12 .903542662</font></p>
<p><br />
<font size="2">3).COVAR_POP <br />
功能描述：返回一对表达式的总体协方差。<br />
SAMPLE：下例CUM_COVP返回定价和最小产品价格的累积总体协方差</font></p>
<p><font size="2">SELECT product_id, supplier_id,<br />
COVAR_POP(list_price, min_price) <br />
OVER (ORDER BY product_id, supplier_id) AS CUM_COVP,<br />
COVAR_SAMP(list_price, min_price)<br />
OVER (ORDER BY product_id, supplier_id) AS CUM_COVS <br />
FROM product_information p<br />
WHERE category_id = 29<br />
ORDER BY product_id, supplier_id;</font></p>
<p><font size="2">PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS<br />
---------- ----------- ---------- ----------<br />
1774 103088 0<br />
1775 103087 1473.25 2946.5<br />
1794 103096 1702.77778 2554.16667<br />
1825 103093 1926.25 2568.33333<br />
2004 103086 1591.4 1989.25<br />
2005 103086 1512.5 1815<br />
2416 103088 1475.97959 1721.97619<br />
.<br />
.</font></p>
<p><br />
<font size="2">4).COVAR_SAMP <br />
功能描述：返回一对表达式的样本协方差<br />
SAMPLE：下例CUM_COVS返回定价和最小产品价格的累积样本协方差</font></p>
<p><font size="2">SELECT product_id, supplier_id,<br />
COVAR_POP(list_price, min_price) <br />
OVER (ORDER BY product_id, supplier_id) AS CUM_COVP,<br />
COVAR_SAMP(list_price, min_price)<br />
OVER (ORDER BY product_id, supplier_id) AS CUM_COVS <br />
FROM product_information p<br />
WHERE category_id = 29<br />
ORDER BY product_id, supplier_id;</font></p>
<p><font size="2">PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS<br />
---------- ----------- ---------- ----------<br />
1774 103088 0<br />
1775 103087 1473.25 2946.5<br />
1794 103096 1702.77778 2554.16667<br />
1825 103093 1926.25 2568.33333<br />
2004 103086 1591.4 1989.25<br />
2005 103086 1512.5 1815<br />
2416 103088 1475.97959 1721.97619<br />
.<br />
.</font></p>
<p><br />
<font size="2">5).COUNT <br />
功能描述：对一组内发生的事情进行累积计数，如果指定*或一些非空常数，count将对所有行计数，如果指定一个表达式，count返回表达式非空赋值的计数，当有相同值出现时，这些相等的值都会被纳入被计算的值；可以使用DISTINCT来记录去掉一组中完全相同的数据后出现的行数。<br />
SAMPLE：下面例子中计算每个员工在按薪水排序中当前行附近薪水在[n-50,n+150]之间的行数，n表示当前行的薪水<br />
例如，Philtanker的薪水2200，排在他之前的行中薪水大于等于2200-50的有1行，排在他之后的行中薪水小于等于2200＋150的行没有，所以count计数值cnt3为2（包括自己当前行）；cnt2值相当于小于等于当前行的SALARY值的所有行数</font></p>
<p><font size="2">SELECT last_name, salary, COUNT(*) OVER () AS cnt1,<br />
COUNT(*) OVER (ORDER BY salary) AS cnt2,<br />
COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING<br />
AND 150 FOLLOWING) AS cnt3 FROM employees;</font></p>
<p><font size="2">LAST_NAME SALARY CNT1 CNT2 CNT3<br />
------------------------- ---------- ---------- ---------- ----------<br />
Olson 2100 107 1 3<br />
Markle 2200 107 3 2<br />
Philtanker 2200 107 3 2<br />
Landry 2400 107 5 8<br />
Gee 2400 107 5 8<br />
Colmenares 2500 107 11 10<br />
Patel 2500 107 11 10<br />
.<br />
.</font></p>
<p><br />
<font size="2">6).CUME_DIST <br />
功能描述：计算一行在组中的相对位置，CUME_DIST总是返回大于0、小于或等于1的数，该数表示该行在N行中的位置。例如，在一个3行的组中，返回的累计分布值为1/3、2/3、3/3<br />
SAMPLE：下例中计算每个工种的员工按薪水排序依次累积出现的分布百分比</font></p>
<p><font size="2">SELECT job_id, last_name, salary, CUME_DIST() <br />
OVER (PARTITION BY job_id ORDER BY salary) AS cume_dist<br />
FROM employees WHERE job_id LIKE 'PU%';</font></p>
<p><font size="2">JOB_ID LAST_NAME SALARY CUME_DIST<br />
---------- ------------------------- ---------- ----------<br />
PU_CLERK Colmenares 2500 .2<br />
PU_CLERK Himuro 2600 .4<br />
PU_CLERK Tobias 2800 .6<br />
PU_CLERK Baida 2900 .8<br />
PU_CLERK Khoo 3100 1<br />
PU_MAN Raphaely 11000 1</font></p>
<p><br />
<font size="2">7).DENSE_RANK <br />
功能描述：根据ORDER BY子句中表达式的值，从查询返回的每一行，计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序，然后给每一行赋一个号，从而形成一个序列，该序列从1开始，往后累加。每次ORDER BY表达式的值发生变化时，该序列也随之增加。有同样值的行得到同样的数字序号（认为null时相等的）。密集的序列返回的时没有间隔的数<br />
SAMPLE：下例中计算每个员工按部门分区再按薪水排序，依次出现的序列号（注意与RANK函数的区别）</font></p>
<p><font size="2">SELECT d.department_id , e.last_name, e.salary, DENSE_RANK() <br />
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank<br />
FROM employees e, departments d<br />
WHERE e.department_id = d.department_id<br />
AND d.department_id IN ('60', '90'); </font></p>
<p><font size="2">DEPARTMENT_ID LAST_NAME SALARY DRANK<br />
------------- ------------------------- ---------- ----------<br />
60 Lorentz 4200 1<br />
60 Austin 4800 2<br />
60 Pataballa 4800 2<br />
60 Ernst 6000 3<br />
60 Hunold 9000 4<br />
90 Kochhar 17000 1<br />
90 De Haan 17000 1<br />
90 King 24000 2</font></p>
<p><br />
<font size="2">8).FIRST <br />
功能描述：从DENSE_RANK返回的集合中取出排在最前面的一个值的行（可能多行，因为值可能相等），因此完整的语法需要在开始处加上一个集合函数以从中取出记录<br />
SAMPLE：下面例子中DENSE_RANK按部门分区，再按佣金commission_pct排序，FIRST取出佣金最低的对应的所有行，然后前面的MAX函数从这个集合中取出薪水最低的值；LAST取出佣金最高的对应的所有行，然后前面的MIN函数从这个集合中取出薪水最高的值<br />
SELECT last_name, department_id, salary,<br />
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)<br />
OVER (PARTITION BY department_id) "Worst",<br />
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)<br />
OVER (PARTITION BY department_id) "Best"<br />
FROM employees <br />
WHERE department_id in (20,80) <br />
ORDER BY department_id, salary;</font></p>
<p><font size="2">LAST_NAME DEPARTMENT_ID SALARY Worst Best<br />
------------------------- ------------- ---------- ---------- ----------<br />
Fay 20 6000 6000 13000<br />
Hartstein 20 13000 6000 13000<br />
Kumar 80 6100 6100 14000<br />
Banda 80 6200 6100 14000<br />
Johnson 80 6200 6100 14000<br />
Ande 80 6400 6100 14000<br />
Lee 80 6800 6100 14000<br />
Tuvault 80 7000 6100 14000<br />
Sewall 80 7000 6100 14000<br />
Marvins 80 7200 6100 14000<br />
Bates 80 7300 6100 14000<br />
.<br />
.<br />
.</font></p>
<p><br />
<font size="2">9).FIRST_VALUE <br />
功能描述：返回组中数据窗口的第一个值。<br />
SAMPLE：下面例子计算按部门分区按薪水排序的数据窗口的第一个值对应的名字，如果薪水的第一个值有多个，则从多个对应的名字中取缺省排序的第一个名字</font></p>
<p><font size="2">SELECT department_id, last_name, salary, FIRST_VALUE(last_name)<br />
OVER (PARTITION BY department_id ORDER BY salary ASC ) AS lowest_sal<br />
FROM employees <br />
WHERE department_id in(20,30);</font></p>
<p><font size="2">DEPARTMENT_ID LAST_NAME SALARY LOWEST_SAL<br />
------------- ------------------------- ---------- --------------<br />
20 Fay 6000 Fay<br />
20 Hartstein 13000 Fay<br />
30 Colmenares 2500 Colmenares<br />
30 Himuro 2600 Colmenares<br />
30 Tobias 2800 Colmenares<br />
30 Baida 2900 Colmenares<br />
30 Khoo 3100 Colmenares<br />
30 Raphaely 11000 Colmenares</font></p>
<p><br />
<font size="2">10).LAG <br />
功能描述：可以访问结果集中的其它行而不用进行自连接。它允许去处理游标，就好像游标是一个数组一样。在给定组中可参考当前行之前的行，这样就可以从组中与当前行一起选择以前的行。Offset是一个正整数，其默认值为1，若索引超出窗口的范围，就返回默认值（默认返回的是组中第一行），其相反的函数是LEAD<br />
SAMPLE：下面的例子中列prev_sal返回按hire_date排序的前1行的salary值</font></p>
<p><font size="2">SELECT last_name, hire_date, salary,<br />
LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal<br />
FROM employees<br />
WHERE job_id = 'PU_CLERK';</font></p>
<p><font size="2">LAST_NAME HIRE_DATE SALARY PREV_SAL<br />
------------------------- ---------- ---------- ----------<br />
Khoo 18-5月 -95 3100 0<br />
Tobias 24-7月 -97 2800 3100<br />
Baida 24-12月-97 2900 2800<br />
Himuro 15-11月-98 2600 2900<br />
Colmenares 10-8月 -99 2500 2600</font></p>
<p><br />
<font size="2">11).LAST <br />
功能描述：从DENSE_RANK返回的集合中取出排在最后面的一个值的行（可能多行，因为值可能相等），因此完整的语法需要在开始处加上一个集合函数以从中取出记录<br />
SAMPLE：下面例子中DENSE_RANK按部门分区，再按佣金commission_pct排序，FIRST取出佣金最低的对应的所有行，然后前面的MAX函数从这个集合中取出薪水最低的值；LAST取出佣金最高的对应的所有行，然后前面的MIN函数从这个集合中取出薪水最高的值<br />
SELECT last_name, department_id, salary,<br />
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)<br />
OVER (PARTITION BY department_id) "Worst",<br />
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)<br />
OVER (PARTITION BY department_id) "Best"<br />
FROM employees <br />
WHERE department_id in (20,80) <br />
ORDER BY department_id, salary;</font></p>
<p><font size="2">LAST_NAME DEPARTMENT_ID SALARY Worst Best<br />
------------------------- ------------- ---------- ---------- ----------<br />
Fay 20 6000 6000 13000<br />
Hartstein 20 13000 6000 13000<br />
Kumar 80 6100 6100 14000<br />
Banda 80 6200 6100 14000<br />
Johnson 80 6200 6100 14000<br />
Ande 80 6400 6100 14000<br />
Lee 80 6800 6100 14000<br />
Tuvault 80 7000 6100 14000<br />
Sewall 80 7000 6100 14000<br />
Marvins 80 7200 6100 14000<br />
Bates 80 7300 6100 14000<br />
.<br />
12).LAST_VALUE <br />
功能描述：返回组中数据窗口的最后一个值。<br />
SAMPLE：下面例子计算按部门分区按薪水排序的数据窗口的最后一个值对应的名字，如果薪水的最后一个值有多个，则从多个对应的名字中取缺省排序的最后一个名字<br />
SELECT department_id, last_name, salary, LAST_VALUE(last_name)<br />
OVER(PARTITION BY department_id ORDER BY salary) AS highest_sal<br />
FROM employees <br />
WHERE department_id in(20,30);</font></p>
<p><font size="2">DEPARTMENT_ID LAST_NAME SALARY HIGHEST_SAL<br />
------------- ------------------------- ---------- ------------<br />
20 Fay 6000 Fay<br />
20 Hartstein 13000 Hartstein<br />
30 Colmenares 2500 Colmenares<br />
30 Himuro 2600 Himuro<br />
30 Tobias 2800 Tobias<br />
30 Baida 2900 Baida<br />
30 Khoo 3100 Khoo<br />
30 Raphaely 11000 Raphaely</font></p>
<p><br />
<font size="2">13).LEAD <br />
功能描述：LEAD与LAG相反，LEAD可以访问组中当前行之后的行。Offset是一个正整数，其默认值为1，若索引超出窗口的范围，就返回默认值（默认返回的是组中第一行）<br />
SAMPLE：下面的例子中每行的"NextHired"返回按hire_date排序的下一行的hire_date值</font></p>
<p><font size="2">SELECT last_name, hire_date, <br />
LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS "NextHired" <br />
FROM employees WHERE department_id = 30;</font></p>
<p><font size="2">LAST_NAME HIRE_DATE NextHired<br />
------------------------- --------- ---------<br />
Raphaely 07-DEC-94 18-MAY-95<br />
Khoo 18-MAY-95 24-JUL-97<br />
Tobias 24-JUL-97 24-DEC-97<br />
Baida 24-DEC-97 15-NOV-98<br />
Himuro 15-NOV-98 10-AUG-99<br />
Colmenares 10-AUG-99</font></p>
<p><br />
<font size="2">14).MAX <br />
功能描述：在一个组中的数据窗口中查找表达式的最大值。<br />
SAMPLE：下面例子中dept_max返回当前行所在部门的最大薪水值</font></p>
<p><font size="2">SELECT department_id, last_name, salary, <br />
MAX(salary) OVER (PARTITION BY department_id) AS dept_max<br />
FROM employees WHERE department_id in (10,20,30);</font></p>
<p><font size="2">DEPARTMENT_ID LAST_NAME SALARY DEPT_MAX<br />
------------- ------------------------- ---------- ----------<br />
10 Whalen 4400 4400<br />
20 Hartstein 13000 13000<br />
20 Fay 6000 13000<br />
30 Raphaely 11000 11000<br />
30 Khoo 3100 11000<br />
30 Baida 2900 11000<br />
30 Tobias 2800 11000<br />
30 Himuro 2600 11000<br />
30 Colmenares 2500 11000</font></p>
<p><br />
<font size="2">15).MIN <br />
功能描述：在一个组中的数据窗口中查找表达式的最小值。<br />
SAMPLE：下面例子中dept_min返回当前行所在部门的最小薪水值</font></p>
<p><font size="2">SELECT department_id, last_name, salary, <br />
MIN(salary) OVER (PARTITION BY department_id) AS dept_min<br />
FROM employees WHERE department_id in (10,20,30);</font></p>
<p><font size="2">DEPARTMENT_ID LAST_NAME SALARY DEPT_MIN<br />
------------- ------------------------- ---------- ----------<br />
10 Whalen 4400 4400<br />
20 Hartstein 13000 6000<br />
20 Fay 6000 6000<br />
30 Raphaely 11000 2500<br />
30 Khoo 3100 2500<br />
30 Baida 2900 2500<br />
30 Tobias 2800 2500<br />
30 Himuro 2600 2500<br />
30 Colmenares 2500 2500</font></p>
<p><br />
<font size="2">16).NTILE <br />
功能描述：将一个组分为"表达式"的散列表示，例如，如果表达式=4，则给组中的每一行分配一个数（从1到4），如果组中有20行，则给前5行分配1，给下5行分配2等等。如果组的基数不能由表达式值平均分开，则对这些行进行分配时，组中就没有任何percentile的行数比其它percentile的行数超过一行，最低的percentile是那些拥有额外行的percentile。例如，若表达式=4，行数=21，则percentile=1的有5行，percentile=2的有5行等等。<br />
SAMPLE：下例中把6行数据分为4份</font></p>
<p><font size="2">SELECT last_name, salary, <br />
NTILE(4) OVER (ORDER BY salary DESC) AS quartile FROM employees<br />
WHERE department_id = 100;</font></p>
<p><font size="2">LAST_NAME SALARY QUARTILE<br />
------------------------- ---------- ----------<br />
Greenberg 12000 1<br />
Faviet 9000 1<br />
Chen 8200 2<br />
Urman 7800 2<br />
Sciarra 7700 3<br />
Popp 6900 4</font></p>
<p><br />
<font size="2">17).PERCENT_RANK <br />
功能描述：和CUME_DIST（累积分配）函数类似，对于一个组中给定的行来说，在计算那行的序号时，先减1，然后除以n-1（n为组中所有的行数）。该函数总是返回0～1（包括1）之间的数。<br />
SAMPLE：下例中如果Khoo的salary为2900，则pr值为0.6，因为RANK函数对于等值的返回序列值是一样的</font></p>
<p><font size="2">SELECT department_id, last_name, salary, <br />
PERCENT_RANK() <br />
OVER (PARTITION BY department_id ORDER BY salary) AS pr<br />
FROM employees<br />
WHERE department_id &lt; 50<br />
ORDER BY department_id,salary;</font></p>
<p><font size="2">DEPARTMENT_ID LAST_NAME SALARY PR<br />
------------- ------------------------- ---------- ----------<br />
10 Whalen 4400 0<br />
20 Fay 6000 0<br />
20 Hartstein 13000 1<br />
30 Colmenares 2500 0<br />
30 Himuro 2600 0.2<br />
30 Tobias 2800 0.4<br />
30 Baida 2900 0.6<br />
30 Khoo 3100 0.8<br />
30 Raphaely 11000 1<br />
40 Mavris 6500 0</font></p>
<p><br />
<font size="2">18).PERCENTILE_CONT <br />
功能描述：返回一个与输入的分布百分比值相对应的数据值，分布百分比的计算方法见函数PERCENT_RANK，如果没有正好对应的数据值，就通过下面算法来得到值：<br />
RN = 1+ (P*(N-1)) 其中P是输入的分布百分比值，N是组内的行数<br />
CRN = CEIL(RN) FRN = FLOOR(RN)<br />
if (CRN = FRN = RN) then <br />
(value of expression from row at RN)<br />
else<br />
(CRN - RN) * (value of expression for row at FRN) +<br />
(RN - FRN) * (value of expression for row at CRN)<br />
注意：本函数与PERCENTILE_DISC的区别在找不到对应的分布值时返回的替代值的计算方法不同</font></p>
<p><font size="2">SAMPLE：在下例中，对于部门60的Percentile_Cont值计算如下：<br />
P=0.7 N=5 RN =1+ (P*(N-1)=1+(0.7*(5-1))=3.8 CRN = CEIL(3.8)=4 <br />
FRN = FLOOR(3.8)=3 <br />
（4 - 3.8）* 4800 + (3.8 - 3) * 6000 = 5760</font></p>
<p><font size="2">SELECT last_name, salary, department_id,<br />
PERCENTILE_CONT(0.7) WITHIN GROUP (ORDER BY salary) <br />
OVER (PARTITION BY department_id) "Percentile_Cont",<br />
PERCENT_RANK() <br />
OVER (PARTITION BY department_id ORDER BY salary) "Percent_Rank"<br />
FROM employees WHERE department_id IN (30, 60);</font></p>
<p><font size="2">LAST_NAME SALARY DEPARTMENT_ID Percentile_Cont Percent_Rank<br />
------------------------- ---------- ------------- --------------- ------------<br />
Colmenares 2500 30 3000 0<br />
Himuro 2600 30 3000 0.2<br />
Tobias 2800 30 3000 0.4<br />
Baida 2900 30 3000 0.6<br />
Khoo 3100 30 3000 0.8<br />
Raphaely 11000 30 3000 1<br />
Lorentz 4200 60 5760 0<br />
Austin 4800 60 5760 0.25<br />
Pataballa 4800 60 5760 0.25<br />
Ernst 6000 60 5760 0.75<br />
Hunold 9000 60 5760 1</font></p>
<p><br />
<font size="2">19).PERCENTILE_DISC <br />
功能描述：返回一个与输入的分布百分比值相对应的数据值，分布百分比的计算方法见函数CUME_DIST，如果没有正好对应的数据值，就取大于该分布值的下一个值。<br />
注意：本函数与PERCENTILE_CONT的区别在找不到对应的分布值时返回的替代值的计算方法不同</font></p>
<p><font size="2">SAMPLE：下例中0.7的分布值在部门30中没有对应的Cume_Dist值，所以就取下一个分布值0.83333333所对应的SALARY来替代</font></p>
<p><font size="2">SELECT last_name, salary, department_id,<br />
PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary )<br />
OVER (PARTITION BY department_id) "Percentile_Disc",<br />
CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary) "Cume_Dist"<br />
FROM employees <br />
WHERE department_id in (30, 60);</font></p>
<p><font size="2">LAST_NAME SALARY DEPARTMENT_ID Percentile_Disc Cume_Dist<br />
------------------------- ---------- ------------- --------------- ----------<br />
Colmenares 2500 30 3100 .166666667<br />
Himuro 2600 30 3100 .333333333<br />
Tobias 2800 30 3100 .5<br />
Baida 2900 30 3100 .666666667<br />
Khoo 3100 30 3100 .833333333<br />
Raphaely 11000 30 3100 1<br />
Lorentz 4200 60 6000 .2<br />
Austin 4800 60 6000 .6<br />
Pataballa 4800 60 6000 .6<br />
Ernst 6000 60 6000 .8<br />
Hunold 9000 60 6000 1</font></p>
<p><br />
<font size="2">20).RANK <br />
功能描述：根据ORDER BY子句中表达式的值，从查询返回的每一行，计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序，然后给每一行赋一个号，从而形成一个序列，该序列从1开始，往后累加。每次ORDER BY表达式的值发生变化时，该序列也随之增加。有同样值的行得到同样的数字序号（认为null时相等的）。然而，如果两行的确得到同样的排序，则序数将随后跳跃。若两行序数为1，则没有序数2，序列将给组中的下一行分配值3，DENSE_RANK则没有任何跳跃。<br />
SAMPLE：下例中计算每个员工按部门分区再按薪水排序，依次出现的序列号（注意与DENSE_RANK函数的区别）</font></p>
<p><font size="2">SELECT d.department_id , e.last_name, e.salary, RANK() <br />
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank<br />
FROM employees e, departments d<br />
WHERE e.department_id = d.department_id<br />
AND d.department_id IN ('60', '90');</font></p>
<p><font size="2">DEPARTMENT_ID LAST_NAME SALARY DRANK<br />
------------- ------------------------- ---------- ----------<br />
60 Lorentz 4200 1<br />
60 Austin 4800 2<br />
60 Pataballa 4800 2<br />
60 Ernst 6000 4<br />
60 Hunold 9000 5<br />
90 Kochhar 17000 1<br />
90 De Haan 17000 1<br />
90 King 24000 3</font></p>
<p><br />
<font size="2">21).RATIO_TO_REPORT <br />
功能描述：该函数计算expression/(sum(expression))的值，它给出相对于总数的百分比，即当前行对sum(expression)的贡献。<br />
SAMPLE：下例计算每个员工的工资占该类员工总工资的百分比</font></p>
<p><font size="2">SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr<br />
FROM employees<br />
WHERE job_id = 'PU_CLERK';</font></p>
<p><font size="2">LAST_NAME SALARY RR<br />
------------------------- ---------- ----------<br />
Khoo 3100 .223021583<br />
Baida 2900 .208633094<br />
Tobias 2800 .201438849<br />
Himuro 2600 .18705036<br />
Colmenares 2500 .179856115</font></p>
<p><br />
<font size="2">22).REGR_ (Linear Regression) Functions <br />
功能描述：这些线性回归函数适合最小二乘法回归线，有9个不同的回归函数可使用。<br />
REGR_SLOPE：返回斜率，等于COVAR_POP(expr1, expr2) / VAR_POP(expr2)<br />
REGR_INTERCEPT：返回回归线的y截距，等于<br />
AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)<br />
REGR_COUNT：返回用于填充回归线的非空数字对的数目<br />
REGR_R2：返回回归线的决定系数，计算式为：<br />
If VAR_POP(expr2) = 0 then return NULL<br />
If VAR_POP(expr1) = 0 and VAR_POP(expr2) != 0 then return 1<br />
If VAR_POP(expr1) &gt; 0 and VAR_POP(expr2 != 0 then <br />
return POWER(CORR(expr1,expr),2)<br />
REGR_AVGX：计算回归线的自变量(expr2)的平均值，去掉了空对(expr1, expr2)后，等于AVG(expr2)<br />
REGR_AVGY：计算回归线的应变量(expr1)的平均值，去掉了空对(expr1, expr2)后，等于AVG(expr1)<br />
REGR_SXX： 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr2)<br />
REGR_SYY： 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr1)<br />
REGR_SXY: 返回值等于REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)</font></p>
<p><font size="2">（下面的例子都是在SH用户下完成的）<br />
SAMPLE 1：下例计算1998年最后三个星期中两种产品（260和270）在周末的销售量中已开发票数量和总数量的累积斜率和回归线的截距</font></p>
<p><font size="2">SELECT t.fiscal_month_number "Month", t.day_number_in_month "Day", <br />
REGR_SLOPE(s.amount_sold, s.quantity_sold) <br />
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_SLOPE,<br />
REGR_INTERCEPT(s.amount_sold, s.quantity_sold) <br />
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_ICPT <br />
FROM sales s, times t<br />
WHERE s.time_id = t.time_id <br />
AND s.prod_id IN (270, 260)<br />
AND t.fiscal_year=1998 <br />
AND t.fiscal_week_number IN (50, 51, 52)<br />
AND t.day_number_in_week IN (6,7)<br />
ORDER BY t.fiscal_month_desc, t.day_number_in_month;</font></p>
<p><font size="2">Month Day CUM_SLOPE CUM_ICPT<br />
---------- ---------- ---------- ----------<br />
12 12 -68 1872<br />
12 12 -68 1872<br />
12 13 -20.244898 1254.36735<br />
12 13 -20.244898 1254.36735<br />
12 19 -18.826087 1287<br />
12 20 62.4561404 125.28655<br />
12 20 62.4561404 125.28655<br />
12 20 62.4561404 125.28655<br />
12 20 62.4561404 125.28655<br />
12 26 67.2658228 58.9712313<br />
12 26 67.2658228 58.9712313<br />
12 27 37.5245541 284.958221<br />
12 27 37.5245541 284.958221<br />
12 27 37.5245541 284.958221</font></p>
<p><font size="2">SAMPLE 2：下例计算1998年4月每天的累积交易数量</font></p>
<p><font size="2">SELECT UNIQUE t.day_number_in_month,<br />
REGR_COUNT(s.amount_sold, s.quantity_sold) <br />
OVER (PARTITION BY t.fiscal_month_number ORDER BY t.day_number_in_month)<br />
"Regr_Count"<br />
FROM sales s, times t<br />
WHERE s.time_id = t.time_id <br />
AND t.fiscal_year = 1998 AND t.fiscal_month_number = 4;</font></p>
<p><font size="2">DAY_NUMBER_IN_MONTH Regr_Count<br />
------------------- ----------<br />
1 825<br />
2 1650<br />
3 2475<br />
4 3300<br />
.<br />
.<br />
.<br />
26 21450<br />
30 22200</font></p>
<p><font size="2">SAMPLE 3：下例计算1998年每月销售量中已开发票数量和总数量的累积回归线决定系数</font></p>
<p><font size="2">SELECT t.fiscal_month_number,<br />
REGR_R2(SUM(s.amount_sold), SUM(s.quantity_sold))<br />
OVER (ORDER BY t.fiscal_month_number) "Regr_R2"<br />
FROM sales s, times t<br />
WHERE s.time_id = t.time_id<br />
AND t.fiscal_year = 1998<br />
GROUP BY t.fiscal_month_number<br />
ORDER BY t.fiscal_month_number;</font></p>
<p><font size="2">FISCAL_MONTH_NUMBER Regr_R2<br />
------------------- ----------<br />
1<br />
2 1<br />
3 .927372984<br />
4 .807019972<br />
5 .932745567<br />
6 .94682861<br />
7 .965342011<br />
8 .955768075<br />
9 .959542618<br />
10 .938618575<br />
11 .880931415<br />
12 .882769189</font></p>
<p><font size="2">SAMPLE 4：下例计算1998年12月最后两周产品260的销售量中已开发票数量和总数量的累积平均值</font></p>
<p><font size="2">SELECT t.day_number_in_month,<br />
REGR_AVGY(s.amount_sold, s.quantity_sold)<br />
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month)<br />
"Regr_AvgY",<br />
REGR_AVGX(s.amount_sold, s.quantity_sold)<br />
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month)<br />
"Regr_AvgX"<br />
FROM sales s, times t<br />
WHERE s.time_id = t.time_id <br />
AND s.prod_id = 260<br />
AND t.fiscal_month_desc = '1998-12'<br />
AND t.fiscal_week_number IN (51, 52)<br />
ORDER BY t.day_number_in_month;</font></p>
<p><font size="2">DAY_NUMBER_IN_MONTH Regr_AvgY Regr_AvgX<br />
------------------- ---------- ----------<br />
14 882 24.5<br />
14 882 24.5<br />
15 801 22.25<br />
15 801 22.25<br />
16 777.6 21.6<br />
18 642.857143 17.8571429<br />
18 642.857143 17.8571429<br />
20 589.5 16.375<br />
21 544 15.1111111<br />
22 592.363636 16.4545455<br />
22 592.363636 16.4545455<br />
24 553.846154 15.3846154<br />
24 553.846154 15.3846154<br />
26 522 14.5<br />
27 578.4 16.0666667</font></p>
<p><font size="2">SAMPLE 5：下例计算产品260和270在1998年2月周末销售量中已开发票数量和总数量的累积REGR_SXY, REGR_SXX, and REGR_SYY统计值</font></p>
<p><font size="2">SELECT t.day_number_in_month,<br />
REGR_SXY(s.amount_sold, s.quantity_sold)<br />
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxy",<br />
REGR_SYY(s.amount_sold, s.quantity_sold)<br />
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_syy",<br />
REGR_SXX(s.amount_sold, s.quantity_sold)<br />
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxx"<br />
FROM sales s, times t<br />
WHERE s.time_id = t.time_id <br />
AND prod_id IN (270, 260)<br />
AND t.fiscal_month_desc = '1998-02'<br />
AND t.day_number_in_week IN (6,7)<br />
ORDER BY t.day_number_in_month;</font></p>
<p><font size="2">DAY_NUMBER_IN_MONTH Regr_sxy Regr_syy Regr_sxx<br />
------------------- ---------- ---------- ----------<br />
1 18870.4 2116198.4 258.4<br />
1 18870.4 2116198.4 258.4<br />
1 18870.4 2116198.4 258.4<br />
1 18870.4 2116198.4 258.4<br />
7 18870.4 2116198.4 258.4<br />
8 18870.4 2116198.4 258.4<br />
14 18870.4 2116198.4 258.4<br />
15 18870.4 2116198.4 258.4<br />
21 18870.4 2116198.4 258.4<br />
22 18870.4 2116198.4 258.4</font></p>
<p><br />
<font size="2">23).ROW_NUMBER <br />
功能描述：返回有序组中一行的偏移量，从而可用于按特定标准排序的行号。<br />
SAMPLE：下例返回每个员工再在每个部门中按员工号排序后的顺序号</font></p>
<p><font size="2">SELECT department_id, last_name, employee_id, ROW_NUMBER()<br />
OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id<br />
FROM employees<br />
WHERE department_id &lt; 50;</font></p>
<p><font size="2">DEPARTMENT_ID LAST_NAME EMPLOYEE_ID EMP_ID<br />
------------- ------------------------- ----------- ----------<br />
10 Whalen 200 1<br />
20 Hartstein 201 1<br />
20 Fay 202 2<br />
30 Raphaely 114 1<br />
30 Khoo 115 2<br />
30 Baida 116 3<br />
30 Tobias 117 4<br />
30 Himuro 118 5<br />
30 Colmenares 119 6<br />
40 Mavris 203 1</font></p>
<p><br />
<font size="2">24).STDDEV <br />
功能描述：计算当前行关于组的标准偏离。（Standard Deviation）<br />
SAMPLE：下例返回部门30按雇佣日期排序的薪水值的累积标准偏离</font></p>
<p><font size="2">SELECT last_name, hire_date,salary, <br />
STDDEV(salary) OVER (ORDER BY hire_date) "StdDev"<br />
FROM employees <br />
WHERE department_id = 30;</font></p>
<p><font size="2">LAST_NAME HIRE_DATE SALARY StdDev<br />
------------------------- ---------- ---------- ----------<br />
Raphaely 07-12月-94 11000 0<br />
Khoo 18-5月 -95 3100 5586.14357<br />
Tobias 24-7月 -97 2800 4650.0896<br />
Baida 24-12月-97 2900 4035.26125<br />
Himuro 15-11月-98 2600 3649.2465<br />
Colmenares 10-8月 -99 2500 3362.58829</font></p>
<p><br />
<font size="2">25).STDDEV_POP <br />
功能描述：该函数计算总体标准偏离，并返回总体变量的平方根，其返回值与VAR_POP函数的平方根相同。（Standard Deviation－Population）<br />
SAMPLE：下例返回部门20、30、60的薪水值的总体标准偏差</font></p>
<p><font size="2">SELECT department_id, last_name, salary, <br />
STDDEV_POP(salary) OVER (PARTITION BY department_id) AS pop_std<br />
FROM employees<br />
WHERE department_id in (20,30,60);</font></p>
<p><font size="2">DEPARTMENT_ID LAST_NAME SALARY POP_STD<br />
------------- ------------------------- ---------- ----------<br />
20 Hartstein 13000 3500<br />
20 Fay 6000 3500<br />
30 Raphaely 11000 3069.6091<br />
30 Khoo 3100 3069.6091<br />
30 Baida 2900 3069.6091<br />
30 Colmenares 2500 3069.6091<br />
30 Himuro 2600 3069.6091<br />
30 Tobias 2800 3069.6091<br />
60 Hunold 9000 1722.32401<br />
60 Ernst 6000 1722.32401<br />
60 Austin 4800 1722.32401<br />
60 Pataballa 4800 1722.32401<br />
60 Lorentz 4200 1722.32401</font></p>
<p><br />
<font size="2">26).STDDEV_SAMP <br />
功能描述： 该函数计算累积样本标准偏离，并返回总体变量的平方根，其返回值与VAR_POP函数的平方根相同。（Standard Deviation－Sample）<br />
SAMPLE：下例返回部门20、30、60的薪水值的样本标准偏差</font></p>
<p><font size="2">SELECT department_id, last_name, hire_date, salary, <br />
STDDEV_SAMP(salary) OVER <br />
(PARTITION BY department_id ORDER BY hire_date <br />
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_sdev <br />
FROM employees<br />
WHERE department_id in (20,30,60);</font></p>
<p><font size="2">DEPARTMENT_ID LAST_NAME HIRE_DATE SALARY CUM_SDEV<br />
------------- ------------------------- ---------- ---------- ----------<br />
20 Hartstein 17-2月 -96 13000<br />
20 Fay 17-8月 -97 6000 4949.74747<br />
30 Raphaely 07-12月-94 11000<br />
30 Khoo 18-5月 -95 3100 5586.14357<br />
30 Tobias 24-7月 -97 2800 4650.0896<br />
30 Baida 24-12月-97 2900 4035.26125<br />
30 Himuro 15-11月-98 2600 3649.2465<br />
30 Colmenares 10-8月 -99 2500 3362.58829<br />
60 Hunold 03-1月 -90 9000<br />
60 Ernst 21-5月 -91 6000 2121.32034<br />
60 Austin 25-6月 -97 4800 2163.33077<br />
60 Pataballa 05-2月 -98 4800 1982.42276<br />
60 Lorentz 07-2月 -99 4200 1925.61678</font></p>
<p><br />
<font size="2">27).SUM <br />
功能描述：该函数计算组中表达式的累积和。<br />
SAMPLE：下例计算同一经理下员工的薪水累积值</font></p>
<p><font size="2">SELECT manager_id, last_name, salary,<br />
SUM (salary) OVER (PARTITION BY manager_id ORDER BY salary<br />
RANGE UNBOUNDED PRECEDING) l_csum<br />
FROM employees<br />
WHERE manager_id in (101,103,108);</font></p>
<p><font size="2">MANAGER_ID LAST_NAME SALARY L_CSUM<br />
---------- ------------------------- ---------- ----------<br />
101 Whalen 4400 4400<br />
101 Mavris 6500 10900<br />
101 Baer 10000 20900<br />
101 Greenberg 12000 44900<br />
101 Higgins 12000 44900<br />
103 Lorentz 4200 4200<br />
103 Austin 4800 13800<br />
103 Pataballa 4800 13800<br />
103 Ernst 6000 19800<br />
108 Popp 6900 6900<br />
108 Sciarra 7700 14600<br />
108 Urman 7800 22400<br />
108 Chen 8200 30600<br />
108 Faviet 9000 39600<br />
<br />
<br />
28).VAR_POP<br />
功能描述：（Variance Population）该函数返回非空集合的总体变量（忽略null），VAR_POP进行如下计算：<br />
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)<br />
SAMPLE：下例计算1998年每月销售的累积总体和样本变量（本例在SH用户下运行）</font></p>
<p><font size="2">SELECT t.calendar_month_desc,<br />
VAR_POP(SUM(s.amount_sold)) <br />
OVER (ORDER BY t.calendar_month_desc) "Var_Pop",<br />
VAR_SAMP(SUM(s.amount_sold)) <br />
OVER (ORDER BY t.calendar_month_desc) "Var_Samp" <br />
FROM sales s, times t<br />
WHERE s.time_id = t.time_id AND t.calendar_year = 1998<br />
GROUP BY t.calendar_month_desc;</font></p>
<p><font size="2">CALENDAR Var_Pop Var_Samp<br />
-------- ---------- ----------<br />
1998-01 0<br />
1998-02 6.1321E+11 1.2264E+12<br />
1998-03 4.7058E+11 7.0587E+11<br />
1998-04 4.6929E+11 6.2572E+11<br />
1998-05 1.5524E+12 1.9405E+12<br />
1998-06 2.3711E+12 2.8453E+12<br />
1998-07 3.7464E+12 4.3708E+12<br />
1998-08 3.7852E+12 4.3260E+12<br />
1998-09 3.5753E+12 4.0222E+12<br />
1998-10 3.4343E+12 3.8159E+12<br />
1998-11 3.4245E+12 3.7669E+12<br />
1998-12 4.8937E+12 5.3386E+12</font></p>
<p><br />
<font size="2">29).VAR_SAMP <br />
功能描述：（Variance Sample）该函数返回非空集合的样本变量（忽略null），VAR_POP进行如下计算：<br />
(SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1)<br />
SAMPLE：下例计算1998年每月销售的累积总体和样本变量</font></p>
<p><font size="2">SELECT t.calendar_month_desc,<br />
VAR_POP(SUM(s.amount_sold)) <br />
OVER (ORDER BY t.calendar_month_desc) "Var_Pop",<br />
VAR_SAMP(SUM(s.amount_sold)) <br />
OVER (ORDER BY t.calendar_month_desc) "Var_Samp" <br />
FROM sales s, times t<br />
WHERE s.time_id = t.time_id AND t.calendar_year = 1998<br />
GROUP BY t.calendar_month_desc;</font></p>
<p><font size="2">CALENDAR Var_Pop Var_Samp<br />
-------- ---------- ----------<br />
1998-01 0<br />
1998-02 6.1321E+11 1.2264E+12<br />
1998-03 4.7058E+11 7.0587E+11<br />
1998-04 4.6929E+11 6.2572E+11<br />
1998-05 1.5524E+12 1.9405E+12<br />
1998-06 2.3711E+12 2.8453E+12<br />
1998-07 3.7464E+12 4.3708E+12<br />
1998-08 3.7852E+12 4.3260E+12<br />
1998-09 3.5753E+12 4.0222E+12<br />
1998-10 3.4343E+12 3.8159E+12<br />
1998-11 3.4245E+12 3.7669E+12<br />
1998-12 4.8937E+12 5.3386E+12</font></p>
<p><br />
<font size="2">30).VARIANCE <br />
功能描述：该函数返回表达式的变量，Oracle计算该变量如下：<br />
如果表达式中行数为1，则返回0<br />
如果表达式中行数大于1，则返回VAR_SAMP<br />
SAMPLE：下例返回部门30按雇佣日期排序的薪水值的累积变化</font></p>
<p><font size="2">SELECT last_name, salary, VARIANCE(salary) <br />
OVER (ORDER BY hire_date) "Variance"<br />
FROM employees <br />
WHERE department_id = 30;</font></p>
<p><font size="2">LAST_NAME SALARY Variance<br />
------------------------- ---------- ----------<br />
Raphaely 11000 0<br />
Khoo 3100 31205000<br />
Tobias 2800 21623333.3<br />
Baida 2900 16283333.3<br />
Himuro 2600 13317000<br />
Colmenares 2500 11307000</font></p>
<p><font size="2">=====================================<br />
连续求和问题：<br />
select name,sum(cnt) over(order by rownum) from t1;</font></p>
</font>
<img src ="http://www.blogjava.net/msmary/aggbug/284118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2009-06-25 15:35 <a href="http://www.blogjava.net/msmary/articles/284118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle blob clob大数据类型</title><link>http://www.blogjava.net/msmary/articles/252345.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 22 Jan 2009 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/252345.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/252345.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/252345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/252345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/252345.html</trackback:ping><description><![CDATA[<p>一、请问clob&nbsp;&nbsp; 和blob是什么意思? </p>
<p>&nbsp;答：１，他们都是oracle数据库中的大对象数据类型，oracle提供专门的包对其操作。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2，blob、clob、nclob&nbsp;&nbsp; 三种大型对象(LOB)，用来保存较大的图形文件或带格式的文本文件，如Miceosoft&nbsp;&nbsp; Word文档，以及音频、视频等非文本文件，最大长度是4GB。&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOB有几种类型，取决于你使用的字节的类型，Oracle&nbsp;&nbsp; 8i实实在在地将这些数据存储在数据库内部保存。&nbsp;&nbsp; <br />
&nbsp;&nbsp; 可以执行读取、存储、写入等特殊操作&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLOB(Character&nbsp;&nbsp; Large&nbsp;&nbsp; Object)&nbsp;&nbsp;&nbsp; 用于存储对应于数据库定义的字符集的字符数据。（类似于long类型）&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BLOB(Binary&nbsp;&nbsp; Large&nbsp;&nbsp; Object)&nbsp;&nbsp; 可用来存储无结构的二进制数据。（类似于row和long&nbsp;&nbsp; row）</p>
<p>二、请问LOB的BLOB、CLOB、BFILE有什麽区别，都用在什麽情况？怎样操作？</p>
<p>&nbsp;答：</p>
<p>&nbsp;BLOB&nbsp;&nbsp; ——内部二进制大对象。&nbsp;&nbsp; <br />
&nbsp;CLOB&nbsp; ——内部字符大对象。&nbsp;&nbsp; <br />
&nbsp;NCLOB&nbsp;&nbsp; ——内部定长多字节字符大对象。&nbsp;&nbsp; <br />
&nbsp;BFILE&nbsp;&nbsp; ——外部二进制文件。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; LOB&nbsp;&nbsp; 由两部分组成：数据（值）和指向数据的指针（定位器）。尽管值与表自身一起存储，但是一个LOB 列并不包含值，仅有它的定位指针。更进一步，为了使用大对象，程序必须声 明定位器类型的本地变量。你将在本章后面见到P&nbsp;&nbsp; L&nbsp;&nbsp; /&nbsp;&nbsp; S&nbsp;&nbsp; Q&nbsp;&nbsp; L&nbsp;&nbsp; 接口使用定位器如同操作系统的文件 处理一样。当LOB（除了BFILE&nbsp; ）被创建时，定位器被存放在列中，值被存放在LOB 段中，&nbsp; LOB&nbsp; 段是在数据库内部表的一部分。当 BFILE&nbsp; 被创建时，定位器如同平常一样存储在列中</p>
<p>&nbsp;三、blob和clob最大是多少？还是没有最大限制？</p>
<p>&nbsp;答：它们的最大上限就是４G，&nbsp;&nbsp; Clob可以存储单字节字符数据，Blob可以存储无结构的二进制数据</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/msmary/aggbug/252345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2009-01-22 14:58 <a href="http://www.blogjava.net/msmary/articles/252345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 的递归查询(树状查询)</title><link>http://www.blogjava.net/msmary/articles/245510.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Wed, 10 Dec 2008 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/245510.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/245510.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/245510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/245510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/245510.html</trackback:ping><description><![CDATA[一个查询树状结构的语句<br />
SELECT 1,LEVEL,LNAME,NULL,CODE <br />
&nbsp;&nbsp;&nbsp;&nbsp; FROM PRDGP CONNECT BY PRIOR&nbsp; CODE = P_CODE<br />
&nbsp;&nbsp;&nbsp; START WITH P_CODE IS NULL<br />
说明：P_CODE为父级，CODE为子集，P_CODE为空时为树的最顶级，即为Start with 起点，递归方式为CODE = P_CODE,LEVEL为树的等级 <br />
<br />
SELECT&nbsp; CODE,LNAME,CNAME<br />
&nbsp;&nbsp;&nbsp;&nbsp; FROM PRDGP WHERE CODE &lt;&gt; 'LBL' AND TYPE= 'GMT' CONNECT BY PRIOR CODE=PARENTGRP AND PARENTGRP &lt;&gt; 'LBL'<br />
&nbsp;&nbsp;&nbsp; START WITH&nbsp; PARENTGRP IS NULL&nbsp; ORDER BY CODE
<img src ="http://www.blogjava.net/msmary/aggbug/245510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-12-10 15:56 <a href="http://www.blogjava.net/msmary/articles/245510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle存储过程</title><link>http://www.blogjava.net/msmary/articles/244373.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 04 Dec 2008 06:45:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/244373.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/244373.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/244373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/244373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/244373.html</trackback:ping><description><![CDATA[<p style="text-indent: 15.8pt"><font size="4"><font color="#0000ff"><strong><span style="color: blue; font-family: 宋体">Oracle存储过程</span></strong><span style="color: blue; font-family: 宋体">包含三部分：<font color="#a52a2a">过程</font></span><span style="color: maroon; font-family: 宋体">声明，执行过程部分，存储过程异常。</span></font></font></p>
<p style="text-indent: 15.8pt"><font color="#0000ff"><font size="4">Oracle存储过程可以有无参数存储过程和带参数存储过程。</font>&nbsp;<br />
一</font><strong><font color="#0000ff"><font size="4">、无参程序过程语法</font></font></strong></p>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><font color="#0000ff"><span style="color: rgb(0,128,128)">1</span>&nbsp;<span style="color: rgb(0,0,255)">create</span>&nbsp;<span style="color: rgb(128,128,128)">or</span>&nbsp;<span style="color: rgb(255,0,255)">replace</span>&nbsp;<span style="color: rgb(0,0,255)">procedure</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">&nbsp;NoParPro<br />
</span><span style="color: rgb(0,128,128)">2</span>&nbsp;<span style="color: rgb(0,0,255)">as</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />;<br />
</span><span style="color: rgb(0,128,128)">3</span>&nbsp;<span style="color: rgb(0,0,255)">begin</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">4</span>&nbsp;</font><font color="#0000ff"><span style="color: rgb(0,0,0)"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />;<br />
</span><span style="color: rgb(0,128,128)">5</span>&nbsp;</font><font color="#0000ff"><span style="color: rgb(0,0,0)">exception&nbsp;&nbsp;&nbsp;&nbsp; //存储过程异常<br />
</span><span style="color: rgb(0,128,128)">6</span>&nbsp;</font><font color="#0000ff"><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />;<br />
</span><span style="color: rgb(0,128,128)">7</span>&nbsp;<span style="color: rgb(0,0,255)">end</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">8</span>&nbsp;</font></div>
<strong><br />
<font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 二、<font size="4">带参存储过程实例</font></font></strong><font color="#0000ff"><br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;1</span>&nbsp;<span style="color: rgb(0,0,255)">create</span>&nbsp;<span style="color: rgb(128,128,128)">or</span>&nbsp;<span style="color: rgb(255,0,255)">replace</span>&nbsp;<span style="color: rgb(0,0,255)">procedure</span><span style="color: rgb(0,0,0)">&nbsp;queryempname(sfindno&nbsp;emp.empno</span><span style="color: rgb(128,128,128)">%</span><span style="color: rgb(0,0,0)">type)&nbsp;</span><span style="color: rgb(0,0,255)">as</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;2</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sName&nbsp;emp.ename</span><span style="color: rgb(128,128,128)">%</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">type;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;3</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sjob&nbsp;emp.job</span><span style="color: rgb(128,128,128)">%</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">type;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;4</span>&nbsp;<span style="color: rgb(0,0,255)">begin</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;5</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; ....</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;7</span>&nbsp;<span style="color: rgb(0,0,0)">exception</span></font><span style="color: rgb(0,128,128)"><br />
<font color="#0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br />
</font></span><font color="#0000ff"><span style="color: rgb(0,128,128)">14</span>&nbsp;<span style="color: rgb(0,0,255)">end</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">15</span>&nbsp;</font></div>
<span style="color: black; font-family: 宋体"><br />
<font color="#0000ff">&nbsp;&nbsp;&nbsp;<strong>&nbsp;三、 <font size="4">带参数存储过程含赋值方式</font></strong></font></span>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;1</span>&nbsp;<span style="color: rgb(0,0,255)">create</span>&nbsp;<span style="color: rgb(128,128,128)">or</span>&nbsp;<span style="color: rgb(255,0,255)">replace</span>&nbsp;<span style="color: rgb(0,0,255)">procedure</span><span style="color: rgb(0,0,0)">&nbsp;runbyparmeters&nbsp;&nbsp;(isal&nbsp;</span><span style="color: rgb(128,128,128)">in</span><span style="color: rgb(0,0,0)">&nbsp;emp.sal</span><span style="color: rgb(128,128,128)">%</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">type, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sname&nbsp;out&nbsp;</span><span style="font-weight: bold; color: rgb(0,0,0)">varchar</span><span style="color: rgb(0,0,0)">,sjob&nbsp;</span><span style="color: rgb(128,128,128)">in</span><span style="color: rgb(0,0,0)">&nbsp;out&nbsp;</span><span style="font-weight: bold; color: rgb(0,0,0)">varchar</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">)<br />
</span><span style="color: rgb(0,128,128)">&nbsp;2</span>&nbsp;&nbsp;<span style="color: rgb(0,0,255)">as</span><span style="color: rgb(0,0,0)">&nbsp;icount&nbsp;</span><span style="font-weight: bold; color: rgb(0,0,0)">number</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;3</span>&nbsp;&nbsp;<span style="color: rgb(0,0,255)">begin</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;4</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">select</span>&nbsp;<span style="color: rgb(255,0,255)">count</span><span style="color: rgb(0,0,0)">(</span><span style="color: rgb(128,128,128)">*</span><span style="color: rgb(0,0,0)">)&nbsp;</span><span style="color: rgb(0,0,255)">into</span><span style="color: rgb(0,0,0)">&nbsp;icount&nbsp;</span><span style="color: rgb(0,0,255)">from</span><span style="color: rgb(0,0,0)">&nbsp;emp&nbsp;</span><span style="color: rgb(0,0,255)">where</span><span style="color: rgb(0,0,0)">&nbsp;sal</span><span style="color: rgb(128,128,128)">&gt;</span><span style="color: rgb(0,0,0)">isal&nbsp;</span><span style="color: rgb(128,128,128)">and</span><span style="color: rgb(0,0,0)">&nbsp;job</span><span style="color: rgb(128,128,128)">=</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">sjob;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;5</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;icount</span><span style="color: rgb(128,128,128)">=</span><span style="font-weight: bold; color: rgb(128,0,0)">1</span>&nbsp;<span style="color: rgb(0,0,255)">then</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;6</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;9</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">else</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">10</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ....</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">12</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">end</span>&nbsp;<span style="color: rgb(0,0,255)">if</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">13</span>&nbsp;</font><font color="#0000ff"><span style="color: rgb(0,0,0)">&nbsp;exception<br />
</span><span style="color: rgb(0,128,128)">14</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">when</span><span style="color: rgb(0,0,0)">&nbsp;too_many_rows&nbsp;</span><span style="color: rgb(0,0,255)">then</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">15</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBMS_OUTPUT.PUT_LINE(</span><span style="color: rgb(255,0,0)">'</span><span style="color: rgb(255,0,0)">返回值多于1行</span><span style="color: rgb(255,0,0)">'</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">);<br />
</span><span style="color: rgb(0,128,128)">16</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">when</span><span style="color: rgb(0,0,0)">&nbsp;others&nbsp;</span><span style="color: rgb(0,0,255)">then</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">17</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBMS_OUTPUT.PUT_LINE(</span><span style="color: rgb(255,0,0)">'</span><span style="color: rgb(255,0,0)">在RUNBYPARMETERS过程中出错！</span><span style="color: rgb(255,0,0)">'</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">);<br />
</span><span style="color: rgb(0,128,128)">18</span>&nbsp;&nbsp;<span style="color: rgb(0,0,255)">end</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">19</span>&nbsp;</font></div>
<br />
<font color="#0000ff"><strong>&nbsp; <font size="4">四、在Oracle中对存储过程的调用</font></strong></font><br />
<font color="#0000ff" size="4">&nbsp; 过程调用</font><font color="#0000ff"><font size="4">方式一</font><br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;1</span>&nbsp;<span style="color: rgb(0,0,255)">declare</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;2</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realsal&nbsp;emp.sal</span><span style="color: rgb(128,128,128)">%</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">type;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;3</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realname&nbsp;</span><span style="font-weight: bold; color: rgb(0,0,0)">varchar</span><span style="color: rgb(0,0,0)">(</span><span style="font-weight: bold; color: rgb(128,0,0)">40</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">);<br />
</span><span style="color: rgb(0,128,128)">&nbsp;4</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realjob&nbsp;</span><span style="font-weight: bold; color: rgb(0,0,0)">varchar</span><span style="color: rgb(0,0,0)">(</span><span style="font-weight: bold; color: rgb(128,0,0)">40</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">);<br />
</span><span style="color: rgb(0,128,128)">&nbsp;5</span>&nbsp;&nbsp;<span style="color: rgb(0,0,255)">begin&nbsp;&nbsp; //存储过程调用开始</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;6</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realsal:</span><span style="color: rgb(128,128,128)">=</span><span style="font-weight: bold; color: rgb(128,0,0)">1100</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;7</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realname:</span><span style="color: rgb(128,128,128)">=</span><span style="color: rgb(255,0,0)">''</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;8</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realjob:</span><span style="color: rgb(128,128,128)">=</span><span style="color: rgb(255,0,0)">'</span><span style="color: rgb(255,0,0)">CLERK</span><span style="color: rgb(255,0,0)">'</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;9</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;runbyparmeters(realsal,realname,realjob);&nbsp;&nbsp;&nbsp;&nbsp; －－</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">必须按顺序<br />
</span><span style="color: rgb(0,128,128)">10</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBMS_OUTPUT.PUT_LINE(REALNAME</span><span style="color: rgb(128,128,128)">||</span><span style="color: rgb(255,0,0)">'</span><span style="color: rgb(255,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255,0,0)">'</span><span style="color: rgb(128,128,128)">||</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">REALJOB);<br />
</span><span style="color: rgb(0,128,128)">11</span>&nbsp;&nbsp;<span style="color: rgb(0,0,255)">END</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;&nbsp; //过程调用结束<br />
</span><span style="color: rgb(0,128,128)">12</span>&nbsp;</font></div>
<br />
<font color="#0000ff">&nbsp;<font size="4"> 过程调用方式二</font><br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;1</span>&nbsp;<span style="color: rgb(0,0,255)">declare</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;2</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realsal&nbsp;emp.sal</span><span style="color: rgb(128,128,128)">%</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">type;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;3</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realname&nbsp;</span><span style="font-weight: bold; color: rgb(0,0,0)">varchar</span><span style="color: rgb(0,0,0)">(</span><span style="font-weight: bold; color: rgb(128,0,0)">40</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">);<br />
</span><span style="color: rgb(0,128,128)">&nbsp;4</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realjob&nbsp;</span><span style="font-weight: bold; color: rgb(0,0,0)">varchar</span><span style="color: rgb(0,0,0)">(</span><span style="font-weight: bold; color: rgb(128,0,0)">40</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">);<br />
</span><span style="color: rgb(0,128,128)">&nbsp;5</span>&nbsp;<span style="color: rgb(0,0,255)">begin&nbsp;&nbsp;&nbsp;&nbsp;//过程调用开始</span></font><span style="color: rgb(0,0,0)"><br />
</span><font color="#0000ff"><span style="color: rgb(0,128,128)">&nbsp;6</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realsal:</span><span style="color: rgb(128,128,128)">=</span><span style="font-weight: bold; color: rgb(128,0,0)">1100</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;7</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realname:</span><span style="color: rgb(128,128,128)">=</span><span style="color: rgb(255,0,0)">''</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;8</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;realjob:</span><span style="color: rgb(128,128,128)">=</span><span style="color: rgb(255,0,0)">'</span><span style="color: rgb(255,0,0)">CLERK</span><span style="color: rgb(255,0,0)">'</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,128)">&nbsp;9</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;runbyparmeters(sname</span><span style="color: rgb(128,128,128)">=&gt;</span><span style="color: rgb(0,0,0)">realname,isal</span><span style="color: rgb(128,128,128)">=&gt;</span><span style="color: rgb(0,0,0)">realsal,sjob</span><span style="color: rgb(128,128,128)">=&gt;</span><span style="color: rgb(0,0,0)">realjob);&nbsp; －－</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">指定值对应变量顺序可变<br />
</span><span style="color: rgb(0,128,128)">10</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBMS_OUTPUT.PUT_LINE(REALNAME</span><span style="color: rgb(128,128,128)">||</span><span style="color: rgb(255,0,0)">'</span><span style="color: rgb(255,0,0)">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(255,0,0)">'</span><span style="color: rgb(128,128,128)">||</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">REALJOB);<br />
</span><span style="color: rgb(0,128,128)">11</span>&nbsp;<span style="color: rgb(0,0,255)">END</span></font><font color="#0000ff"><span style="color: rgb(0,0,0)">;&nbsp; //过程调用结束<br />
</span><span style="color: rgb(0,128,128)">12</span>&nbsp;</font></div>
<font color="#0000ff"><font size="4">&nbsp;至此，有关ORACLE的基本存储过程以及对Oracle存储过程的调用方式介绍完毕。</font></font> 
<img src ="http://www.blogjava.net/msmary/aggbug/244373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-12-04 14:45 <a href="http://www.blogjava.net/msmary/articles/244373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两个有用的oracle数据库运算：intersect和minus运算</title><link>http://www.blogjava.net/msmary/articles/238280.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Mon, 03 Nov 2008 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/238280.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/238280.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/238280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/238280.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/238280.html</trackback:ping><description><![CDATA[<span id="ArticleContent1_ArticleContent1_lblContent"><font style="font-size: 12pt" size="2">intersect运算 <br />
返回查询结果中相同的部分 <br />
exp:<br />
各个部门中有哪些相同的工种 <br />
select&nbsp; job&nbsp; fromaccount <br />
intersect <br />
selectjob&nbsp; fromresearch <br />
intersect <br />
selectjob&nbsp; fromsales; <br />
<br />
minus运算 <br />
返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。 <br />
有哪些工种在财会部中有，而在销售部中没有？ <br />
exp:<br />
selectjobfromaccount <br />
minus <br />
selectjobfromsales;</font></span>
<img src ="http://www.blogjava.net/msmary/aggbug/238280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-11-03 09:31 <a href="http://www.blogjava.net/msmary/articles/238280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle session kill</title><link>http://www.blogjava.net/msmary/articles/233390.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 09 Oct 2008 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/233390.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/233390.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/233390.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/233390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/233390.html</trackback:ping><description><![CDATA[在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:
<p class="style27">alter system kill session '<span class="style24"><em><font color="#ff0000">sid,serial#</font></em></span>' ; </p>
<p>&nbsp;被kill掉的session,状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程.<br />
<br />
我们发现当一个session被kill掉以后，该session的paddr被修改，如果有多个session被kill，那么多个session<br />
的paddr都被更改为相同的进程地址<br />
<br />
</p>
<p class="style23">在这种情况下,很多时候，资源是无法释放的,我们需要查询spid，在操作系统级来kill这些进程.</p>
<p class="style23">但是由于此时v$session.paddr已经改变，我们无法通过v$session和v$process关联来获得spid</p>
<p class="style23">那还可以怎么办呢?</p>
<p class="style23">我们来看一下下面的查询:<br />
</p>
<p class="style22">SELECT P.ADDR FROM V$PROCESS P WHERE PID &lt;&gt; 1<br />
MINUS<br />
SELECT S.PADDR FROM V$SESSION S;<br />
<br />
现在我们获得了进程地址，就可以在v$process中找到spid，然后可以使用Kill或者orakill在系统级来杀掉这些进程. </p>
<p class="style23">实际上,应该是:</p>
<p class="style28">当在Oracle中kill session以后, Oracle只是简单的把相关session的paddr 指向同一个虚拟地址.</p>
<p class="style28">此时v$process和v$session失去关联,进程就此中断.</p>
<p class="style28">然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的Session退出需要花费很长的时间.</p>
<p class="style28">如果此时被Kill的process，重新尝试执行任务，那么马上会收到进程中断的提示，process退出，此时Oracle会立即启动PMON<br />
来清除该session.这被作为一次异常中断处理.</p>
<p class="style22">相关：<br />
<em>orakill</em> sid spid 其中sid为实例名，spid为线程号<br />
不过我运行时总是报错:<br />
Could not attach to Oracle instance sid名<br />
</p>
<img src ="http://www.blogjava.net/msmary/aggbug/233390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-10-09 17:13 <a href="http://www.blogjava.net/msmary/articles/233390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 笔记</title><link>http://www.blogjava.net/msmary/articles/231050.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 25 Sep 2008 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/231050.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/231050.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/231050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/231050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/231050.html</trackback:ping><description><![CDATA[1.偶尔需要清空数据　以前一直用delete 今天发现有个好的办法：<br />
&nbsp; Truncate Table [表名]<br />
这个可以直接清空数据（delete是逐行删除） <br />
<br />
2.SELECT CASE THEN 的用法<br />
&nbsp; SELECT CODE,CASE SYSPAR.GETLANG WHEN 'EN' THEN LNAME ELSE NVL(CNAME,LNAME) END NAME<br />
&nbsp; FROM PRD;<br />
<br />
3.查询服务器的字符集<br />
&nbsp;&nbsp;&nbsp;&nbsp; SELECT USERENV('LANGUAGE') FROM DUAL;<br />
<br />
4.单引号也用单引号转义<br />
&nbsp;&nbsp; select '''' from dual&nbsp; 结果为 '<br />
<br />
5.查看用户表注释<br />
&nbsp; SELECT TABLE_NAME,COMMENTS FROM USER_TAB_COMMENTS;<br />
<br />
6.oracle 增加和删除列<br />
add<br />
&nbsp; ALTER TABLE PRD ADD DISPLAY_CODE&nbsp; VARCHAR2(30);&nbsp; <br />
delete<br />
&nbsp; 删除列的2种方法
<p>alter table qq drop column TIME</p>
<p>alter table qq set unused ("TIME") cascade constraints;(注意TIME为字段名，要大写) <br />
第一个命令直接删除一个列，适合应付比较小的表，<br />
第二个命令将一个列标识为unused<br />
然后在系统负载比较轻的时候使用<br />
alter table drop unused columns<br />
删除该列占用的存储空间。<br />
可以使用参数指定一次删除多少行<br />
适合负载比较重，或者表比较大的情况<br />
<br />
7.新建一个表时需要赋权限和建同义词<br />
&nbsp;&nbsp; GRANT ALL ON DBOWN.PROD TO APPUSER;<br />
&nbsp;&nbsp; GRANT SELECT,DELETE,UPDATE,INSERT ON DBOWN.ORDSTYLES TO APPUSER;<br />
&nbsp;&nbsp; CREATE OR REPLACE PUBLIC SYNONYM ORDSTYLES FOR ORDSTYLES;<br />
8.物化视图<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXEC DBMS_SNAPSHOT.refresh('GRANTEDPRIV');<br />
<br />
</p>
<img src ="http://www.blogjava.net/msmary/aggbug/231050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-09-25 10:09 <a href="http://www.blogjava.net/msmary/articles/231050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 外联接用法</title><link>http://www.blogjava.net/msmary/articles/225317.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 28 Aug 2008 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/225317.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/225317.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/225317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/225317.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/225317.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">&nbsp;1.外部联接</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">"+"</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">按其在</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">"="</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">的左边或右边分左联接和右联接</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">.<o:p></o:p></span> 
<p><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">若不带</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">"+"</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">运算符的表中的一个行不直接匹配于带</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">"+"</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">预算符的表中的任何行</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">,</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">则前者的行与后者中的一个空行相匹配并被返回</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">.<br /></span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">　　若二者均不带</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">"+",</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">则二者中无法匹配的均被返回</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">.<o:p></o:p></span></p>
<p><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">利用外部联接</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">"+",</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">可以替代效率十分低下的</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US"> not in </span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">运算</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">,</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">大大提高运行速度</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">.<br /></span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">　　</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US"> <br /></span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">　</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">&nbsp; </span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">例如</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">:</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">表</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">A</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">和表</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">B,B</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">的部分内容包含在</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">A</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">中</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">,</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">两个表关联后</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">,</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">要求显示</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">A</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">的所有内容</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">,B</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">不能和</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">A</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">匹配的就用空格显示</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">,</span><span style="font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"><font face="宋体">则两者的表达为左联接</font></span><span style="font-family: 'Courier New'; font-size: 10pt" lang="EN-US">: A=B(+)<br /><o:p><br />2.左右连接的表带有条件时,条件为is null 和 is not null<br />&nbsp; SELECT A.ORDSEQ,B.ORDTY,A.RELORD FROM ORDREL A,ORD B<br />&nbsp;&nbsp; WHERE A.ORDSEQ = B.ORDSEQ(+) <br />&nbsp;&nbsp;&nbsp;&nbsp; AND A.RELORD = 5339<br />&nbsp;&nbsp;&nbsp;&nbsp; AND B.ISSUPPLY (+) IS NOT NULL<br /><br />3.当A表和B表进行左连接时,C因为是B的子表,所以B表也要和C表进行左连接,这样B表没记录时,C表也会没记录,相当于A表也和C表进行了左连接,保证A表的数据都能正常显示<br />&nbsp; SELECT A.ORDSEQ,B.ORDTY,A.RELORD FROM ORDREL A,ORD B,ORDITM C<br />&nbsp;&nbsp; WHERE A.ORDSEQ = B.ORDSEQ(+) <br />&nbsp;&nbsp;&nbsp;&nbsp; AND A.RELORD = 5339<br />&nbsp;&nbsp;&nbsp;&nbsp; AND B.ISSUPPLY (+) IS NOT NULL<br />&nbsp;&nbsp;&nbsp;&nbsp; <font size="2">AND B.ORDSEQ = C.ORDSEQ</font><br /><br />4.和字符串的右连接<br />&nbsp; AND RT.TRANSACTION_TYPE (+)= 'RETURN TO VENDOR'<br />&nbsp;&nbsp;&nbsp;&nbsp; </o:p></span></p><img src ="http://www.blogjava.net/msmary/aggbug/225317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-08-28 15:35 <a href="http://www.blogjava.net/msmary/articles/225317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用户权限及角色</title><link>http://www.blogjava.net/msmary/articles/213695.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Wed, 09 Jul 2008 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/213695.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/213695.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/213695.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/213695.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/213695.html</trackback:ping><description><![CDATA[<p>&nbsp; </p>
<p><span style="font-size: 10.5pt">每个Oracle用户都有一个名字和口令,并拥有一些由其创建的表、视图和其他资源。Oracle角色（role）就是一组权限（privilege）(或者是每个用户根据其状态和条件所需的访问类型)。用户可以给角色授予或赋予指定的权限，然后将角色赋给相应的用户。一个用户也可以直接给其他用户授权。</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">数据库系统权限（Database System Privilege）允许用户执行特定的命令集。例如，CREATE TABLE权限允许用户创建表，GRANT&nbsp;ANY PRIVILEGE权限允许用户授予任何系统权限。</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">数据库对象权限（Database Object Privilege）使得用户能够对各个对象进行某些操作。例如DELETE权限允许用户删除表或视图的行，SELECT权限允许用户通过select从表、视图、序列（sequences）或快照 （snapshots）中查询信息。</span></p>
<p><strong><span style="font-size: 10.5pt">一、创建用户</span></strong></p>
<p><strong><span style="font-size: 10.5pt">&nbsp;&nbsp; </span></strong><span style="font-size: 10.5pt">Oracle</span><span style="font-size: 10.5pt">内部有两个建好的用户：SYSTEM和SYS。用户可直接登录到SYSTEM用户以创建其他用户，因为SYSTEM具有创建别的用户的权限。在安装Oracle时，用户或系统管理员首先可以为自己建立一个用户。例如：</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>create user user01 identified by u01;</strong></span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">该命令还可以用来设置其他权限，详细情况参见自学资料。要改变一个口令，可以使用alter user命令：</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>alter user user01 identified by usr01;</strong></span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">现在user01的口令已由&#8220;u01&#8221;改为&#8220;usr01&#8221;。</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">除了alter user命令以外，用户还可以使用password命令。如果使用password命令，用户输入的新口令将不在屏幕上显示。有dba特权的用户可以通过password命令改变任何其他用户的口令；其他用户只能改变自己的口令。</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">当用户输入password命令时，系统将提示用户输入旧口令和新口令，如下所示：</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>password</strong></span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; Changing password for user01</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; Old password:</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; New password:</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; Retype new password:</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">当成功地修改了口令时，用户会得到如下的反馈：</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; Password changed</span></p>
<p><strong><span style="font-size: 10.5pt">二、删除用户</span></strong></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">删除用户，可以使用drop user命令，如下所示：</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>drop user user01;</strong></span></p>
<p><strong><span style="font-size: 10.5pt">&nbsp;&nbsp; </span></strong><span style="font-size: 10.5pt">如果用户拥有对象，则不能直接删除，否则将返回一个错误值。指定关键字CASCADE，可删除用户所有的对象，然后再删除用户。下面的例子用来删除用户与其对象：</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>drop user user01 CASCADE;</strong></span></p>
<p><strong><span style="font-size: 10.5pt">三、3种标准角色</span></strong></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; Qracle</span><span style="font-size: 10.5pt">为了兼容以前的版本，提供了三种标准的角色（role）：CONNECT、RESOURCE和DBA。</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>1. CONNECT Role(</strong></span><strong><span style="font-size: 10.5pt">连接角色)</span></strong></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">临时用户，特别是那些不需要建表的用户，通常只赋予他们CONNECTrole。CONNECT是使用Oracle的简单权限，这种权限只有在对其他用户的表有访问权时，包括select、insert、update和delete等，才会变得有意义。拥有CONNECT role的用户还能够创建表、视图、序列（sequence）、簇（cluster）、同义词（synonym ）、会话（session）和与其他数据库的链（link）。</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>2. RESOURCE Role(</strong></span><strong><span style="font-size: 10.5pt">资源角色)</span></strong></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">更可靠和正式的数据库用户可以授予RESOURCE role。RESOURCE提供给用户另外的权限以创建他们自己的表、序列、过程（procedure）、触发器（trigger）、索引（index）和簇（cluster）。</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>3. DBA Role(</strong></span><strong><span style="font-size: 10.5pt">数据库管理员角色)</span></strong></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; DBA role</span><span style="font-size: 10.5pt">拥有所有的系统权限----包括无限制的空间限额和给其他用户授予各种权限的能力。SYSTEM由DBA用户拥有。下面介绍一些DBA经常使用的典型权限。</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp; </span><span style="font-size: 10.5pt">（1）grant（授权）命令</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">下面对刚才创建的用户user01授权，命令如下：</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>grant connect, resource to user01;</strong></span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp; </span><span style="font-size: 10.5pt">（2）revoke（撤消）权限</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">已授予的权限可以撤消。例如撤消（1）中的授权，命令如下：</span></p>
<p><strong><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; revoke connect, resource from user01;</span></strong></p>
<p><strong><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span></strong><span style="font-size: 10.5pt">一个具有DBA角色的用户可以撤消任何别的用户甚至别的DBA的CONNECT、RESOURCE&nbsp;和DBA的其他权限。当然，这样是很危险的，因此，除非真正需要，DBA权限不应随便授予那些不是很重要的一般用户。</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">撤消一个用户的所有权限，并不意味着从Oracle中删除了这个用户，也不会破坏用户创建的任何表；只是简单禁止其对这些表的访问。其他要访问这些表的用户可以象以前那样地访问这些表。</span></p>
<p><strong><span style="font-size: 10.5pt">四、创建角色</span></strong></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10.5pt">除了前面讲到的三种系统角色----CONNECT、RESOURCE和DBA，用户还可以在Oracle创建自己的role。用户创建的role可以由表或系统权限或两者的组合构成。为了创建role，用户必须具有CREATE ROLE系统权限。下面给出一个create role命令的实例：</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>create role STUDENT;</strong></span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">这条命令创建了一个名为STUDENT的role。</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt">一旦创建了一个role，用户就可以给他授权。给role授权的grant命令的语法与对对用户的语法相同。在给role授权时，在grant命令的to子句中要使用role的名称，如下所示：</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <strong>grant select on CLASS to STUDENT;</strong></span></p>
<p><strong><span style="font-size: 10.5pt">&nbsp;&nbsp; </span></strong><span style="font-size: 10.5pt">现在，拥有<strong>STUDENT</strong>角色的所有用户都具有对<strong>CLASS</strong>表的select权限。<br />
&nbsp;&nbsp; 撤销权限:<br />
&nbsp;&nbsp; <strong>revoke select on CLASS&nbsp;from STUDENT;</strong><br />
</span></p>
<p><strong><span style="font-size: 10.5pt">五、删除角色</span></strong></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp; </span><span style="font-size: 10.5pt">要删除角色，可以使用drop role命令，如下所示：</span></p>
<p><span style="font-size: 10.5pt">&nbsp;&nbsp; <strong>drop role STUDENT;</strong></span></p>
<p><strong><span style="font-size: 10.5pt">&nbsp;&nbsp; </span></strong><span style="font-size: 10.5pt">指定的role连同与之相关的权限将从数据库中全部删除。</span></p>
<img src ="http://www.blogjava.net/msmary/aggbug/213695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-07-09 16:23 <a href="http://www.blogjava.net/msmary/articles/213695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中常用的to_Char用法详解（有FMT的详细列表）</title><link>http://www.blogjava.net/msmary/articles/211148.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Fri, 27 Jun 2008 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/211148.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/211148.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/211148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/211148.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/211148.html</trackback:ping><description><![CDATA[<div class="postText">
<p>以下内容转自网络，感觉这个比较有用。收藏一下。<br />
<br />
The following are number examples for the <strong>to_char</strong> function.</p>
<blockquote>
<table cellspacing="0" cellpadding="3" width="432" border="0">
    <tbody>
        <tr>
            <td class="function_example" width="207">to_char(1210.73, '9999.9')</td>
            <td class="function_desc">would return '1210.7'</td>
        </tr>
        <tr>
            <td class="function_example">to_char(1210.73, '9,999.99')</td>
            <td class="function_desc">would return '1,210.73'</td>
        </tr>
        <tr>
            <td class="function_example">to_char(1210.73, '$9,999.00')</td>
            <td class="function_desc">would return '$1,210.73'</td>
        </tr>
        <tr>
            <td class="function_example">to_char(21, '000099')</td>
            <td class="function_desc">would return '000021'</td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>&nbsp;</p>
<p>The following is a list of valid parameters when the <strong>to_char</strong> function is used to convert a date to a string. These parameters can be used in many combinations.</p>
<blockquote>
<table class="parm_values" cellspacing="0" cellpadding="3" width="500" border="1">
    <tbody>
        <tr class="th_left_top">
            <th width="93">Parameter</th>
            <th>Explanation</th>
        </tr>
        <tr class="tr_left_top">
            <td>YEAR</td>
            <td>Year, spelled out</td>
        </tr>
        <tr class="tr_left_top">
            <td>YYYY</td>
            <td>4-digit year</td>
        </tr>
        <tr class="tr_left_top">
            <td>YYY<br />
            YY<br />
            Y</td>
            <td>Last 3, 2, or 1 digit(s) of year.</td>
        </tr>
        <tr class="tr_left_top">
            <td>IYY<br />
            IY<br />
            I</td>
            <td>Last 3, 2, or 1 digit(s) of ISO year.</td>
        </tr>
        <tr class="tr_left_top">
            <td>IYYY</td>
            <td>4-digit year based on the ISO standard</td>
        </tr>
        <tr class="tr_left_top">
            <td>Q</td>
            <td>Quarter of year (1, 2, 3, 4; JAN-MAR = 1).</td>
        </tr>
        <tr class="tr_left_top">
            <td>MM</td>
            <td>Month (01-12; JAN = 01).</td>
        </tr>
        <tr class="tr_left_top">
            <td>MON</td>
            <td>Abbreviated name of month.</td>
        </tr>
        <tr class="tr_left_top">
            <td>MONTH</td>
            <td>Name of month, padded with blanks to length of 9 characters.</td>
        </tr>
        <tr class="tr_left_top">
            <td>RM</td>
            <td>Roman numeral month (I-XII; JAN = I).</td>
        </tr>
        <tr class="tr_left_top">
            <td>WW</td>
            <td>Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.</td>
        </tr>
        <tr class="tr_left_top">
            <td>W</td>
            <td>Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.</td>
        </tr>
        <tr class="tr_left_top">
            <td>IW</td>
            <td>Week of year (1-52 or 1-53) based on the ISO standard.</td>
        </tr>
        <tr class="tr_left_top">
            <td>D</td>
            <td>Day of week (1-7).</td>
        </tr>
        <tr class="tr_left_top">
            <td>DAY</td>
            <td>Name of day.</td>
        </tr>
        <tr class="tr_left_top">
            <td>DD</td>
            <td>Day of month (1-31).</td>
        </tr>
        <tr class="tr_left_top">
            <td>DDD</td>
            <td>Day of year (1-366).</td>
        </tr>
        <tr class="tr_left_top">
            <td>DY</td>
            <td>Abbreviated name of day.</td>
        </tr>
        <tr class="tr_left_top">
            <td>J</td>
            <td>Julian day; the number of days since January 1, 4712 BC.</td>
        </tr>
        <tr class="tr_left_top">
            <td>HH</td>
            <td>Hour of day (1-12).</td>
        </tr>
        <tr class="tr_left_top">
            <td>HH12</td>
            <td>Hour of day (1-12).</td>
        </tr>
        <tr class="tr_left_top">
            <td>HH24</td>
            <td>Hour of day (0-23).</td>
        </tr>
        <tr class="tr_left_top">
            <td>MI</td>
            <td>Minute (0-59).</td>
        </tr>
        <tr class="tr_left_top">
            <td>SS</td>
            <td>Second (0-59).</td>
        </tr>
        <tr class="tr_left_top">
            <td>SSSSS</td>
            <td>Seconds past midnight (0-86399).</td>
        </tr>
        <tr class="tr_left_top">
            <td>FF</td>
            <td>Fractional seconds.</td>
        </tr>
    </tbody>
</table>
</blockquote>
<p><br />
</p>
<p>The following are date examples for the <strong>to_char</strong> function.</p>
<blockquote>
<table cellspacing="0" cellpadding="3" width="460" border="0">
    <tbody>
        <tr>
            <td class="function_example" width="253">to_char(sysdate, 'yyyy/mm/dd');</td>
            <td class="function_desc">would return '2003/07/09'</td>
        </tr>
        <tr>
            <td class="function_example">to_char(sysdate, 'Month DD, YYYY');</td>
            <td class="function_desc">would return 'July 09, 2003'</td>
        </tr>
        <tr>
            <td class="function_example">to_char(sysdate, 'FMMonth DD, YYYY');</td>
            <td class="function_desc">would return 'July 9, 2003'</td>
        </tr>
        <tr>
            <td class="function_example">to_char(sysdate, 'MON DDth, YYYY');</td>
            <td class="function_desc">would return 'JUL 09TH, 2003'</td>
        </tr>
        <tr>
            <td class="function_example">to_char(sysdate, 'FMMON DDth, YYYY');</td>
            <td class="function_desc">would return 'JUL 9TH, 2003'</td>
        </tr>
        <tr>
            <td class="function_example">to_char(sysdate, 'FMMon ddth, YYYY');</td>
            <td class="function_desc">would return 'Jul 9th, 2003'</td>
        </tr>
    </tbody>
</table>
</blockquote>
<p><br />
</p>
<p>You will notice that in some examples, the <em>format_mask</em> parameter begins with "FM". This means that zeros and blanks are suppressed. This can be seen in the examples below.</p>
<blockquote>
<table cellspacing="0" cellpadding="3" width="460" border="0">
    <tbody>
        <tr>
            <td class="function_example" width="253">to_char(sysdate, 'FMMonth DD, YYYY');</td>
            <td class="function_desc">would return 'July 9, 2003'</td>
        </tr>
        <tr>
            <td class="function_example">to_char(sysdate, 'FMMON DDth, YYYY');</td>
            <td class="function_desc">would return 'JUL 9TH, 2003'</td>
        </tr>
        <tr>
            <td class="function_example">to_char(sysdate, 'FMMon ddth, YYYY');</td>
            <td class="function_desc">would return 'Jul 9th, 2003'</td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>The zeros have been suppressed so that the day component shows as "9" as opposed to "09".</p>
<br />
<p id="TBPingURL"><strong>Oracle函数to_char转化数字型指定小数点位数的用法</strong><br />
</p>
<p>to_char，函数功能，就是将数值型或者日期型转化为字符型。</p>
<p>比如最简单的应用：</p>
<div style="border-right: #8a8a8a 1px solid; padding-right: 6px; border-top: #8a8a8a 1px solid; padding-left: 6px; font-size: 12px; padding-bottom: 6px; margin: 1px; overflow: auto; border-left: #8a8a8a 1px solid; padding-top: 6px; border-bottom: #8a8a8a 1px solid"><span style="color: #008000">/*1.0123---&gt;'1.0123'*/</span> <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(1.0123)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span> <br />
<span style="color: #008000">/*123---&gt;'123'*/</span> <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(123)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span></div>
<p>&nbsp;接下来再看看下面：</p>
<div style="border-right: #8a8a8a 1px solid; padding-right: 6px; border-top: #8a8a8a 1px solid; padding-left: 6px; font-size: 12px; padding-bottom: 6px; margin: 1px; overflow: auto; border-left: #8a8a8a 1px solid; padding-top: 6px; border-bottom: #8a8a8a 1px solid"><span style="color: #008000">/*0.123&nbsp;---&gt;&nbsp;'.123'&nbsp;*/</span> <br />
SELEC&nbsp;<span style="color: #0000ff">TO_CHAR</span>(0.123)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span></div>
<p>&nbsp;上面的结果 '.123' 在大多数情况下都不是我们想要的结果，我们想要的应该是 '0.123'。</p>
<p>我们来看一下to_char函数的具体用法：</p>
<pre><strong>TO_CHAR</strong> ( n [, fmt [, 'nlsparam']] )
</pre>
<div style="border-right: #8a8a8a 1px solid; padding-right: 6px; border-top: #8a8a8a 1px solid; padding-left: 6px; font-size: 12px; padding-bottom: 6px; margin: 1px; overflow: auto; border-left: #8a8a8a 1px solid; padding-top: 6px; border-bottom: #8a8a8a 1px solid">该函数将NUMBER类型的n按数值格式fmt转换成VARCHAR2类型的值。<span style="color: #ff00ff">'nlsparams'</span>指定由数值格式的元素返回的字符,包括: <br />
<br />
．小数点字符 <br />
<br />
．组分隔符 <br />
<br />
．本地钱币符号 <br />
<br />
．国际钱币符号 <br />
<br />
变元的形式为： <br />
<br />
<span style="color: #ff00ff">'NLS_NUMERIC_CHARACTERS="dg"&nbsp;NLS_CURRENCY="tcxt"&nbsp;NLS_ISO_CURRENCY=territory'</span> <br />
<br />
其中d为小数点字符,g为组分隔符。 <br />
<br />
例&nbsp;:TO_CHAR&nbsp;(17145,<span style="color: #ff00ff">'L099G999'</span>,<span style="color: #ff00ff">'NLS_NUMERIC_CHARACTERS=".,"&nbsp;NLS_CURRENCY="NUD"'</span>)=NUD017,145</div>
<p>通过上面的了解，再查看fmt的一些格式，我们可以用以下表达式得到'0.123'的值：</p>
<div style="border-right: #8a8a8a 1px solid; padding-right: 6px; border-top: #8a8a8a 1px solid; padding-left: 6px; font-size: 12px; padding-bottom: 6px; margin: 1px; overflow: auto; border-left: #8a8a8a 1px solid; padding-top: 6px; border-bottom: #8a8a8a 1px solid"><span style="color: #008000">/*0.123&nbsp;---&gt;&nbsp;'&nbsp;0.123'&nbsp;*/</span>&nbsp; <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(0.123,<span style="color: #ff00ff">'0.999'</span>)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span> <br />
<span style="color: #008000">/*100.12&nbsp;---&gt;&nbsp;'######'&nbsp;*/</span>&nbsp; <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(100.12,<span style="color: #ff00ff">'0.999'</span>)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span> <br />
<span style="color: #008000">/*1.12&nbsp;---&gt;&nbsp;'&nbsp;1.120'&nbsp;*/</span>&nbsp; <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(1.12,<span style="color: #ff00ff">'0.999'</span>)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span></div>
<p>&nbsp;' 0.123'是出来了，可是前面又多了一个空格。</p>
<p>对于 100.12 的值却是######，以及'1.12'的值变成了 '1.120'。</p>
<p>我们重新确定一个新的需求：</p>
<p>1、去空格</p>
<p>2、小数点最多4位，最少保留2位。</p>
<p>&nbsp;&nbsp;&nbsp; 1---&gt;'1.00'；1.1---&gt;'1.00'；1.12--&gt;'1.12'；1.1234---&gt;'1.1234'；</p>
<p>&nbsp;&nbsp;&nbsp; 1.12345---&gt;'1.1235'</p>
<p>最终实现如下：</p>
<div style="border-right: #8a8a8a 1px solid; padding-right: 6px; border-top: #8a8a8a 1px solid; padding-left: 6px; font-size: 12px; padding-bottom: 6px; margin: 1px; overflow: auto; border-left: #8a8a8a 1px solid; padding-top: 6px; border-bottom: #8a8a8a 1px solid"><span style="color: #008000">/* <br />
&nbsp;&nbsp;FM&nbsp;：除空格&nbsp;&nbsp; <br />
&nbsp;&nbsp;9999999.0099：允许小数点左边最大正数为7位，小数点右边最少2位，最多4位，且在第5位进行四舍五入 <br />
*/</span>&nbsp; <br />
<span style="color: #0000ff">Select</span>&nbsp;<span style="color: #0000ff">TO_CHAR</span>(123.0233,<span style="color: #ff00ff">'FM9999999.0099'</span>)&nbsp;<span style="color: #0000ff">FROM</span>&nbsp;<span style="color: #0000ff">DUAL</span></div>
<p id="TBPingURL"><br />
PLSQL小经验一、 Oracle的to_char()函数功能很强大但是在用它格式化数值型数据时应该请注意以下几项。如果是小数如：0.23这样的数据经过to_char后再显示会变为.23，如果你为了让它显示出原来的0.23的话就得用To_char(要格式化的数值,&#8217;0.999&#8217;)保留三个小数，并显示但这里就要注意了。他为你截取小数的时候是四舍五入了。所以如果是要求截掉小数而不四舍五入的话就应该自己写个函数截下去后再规格化。以保证它不四舍五入。 <br />
<br />
二、 To_char(1.9999,&#8217;FM90.0999&#8217;)这个函数规格化时90.0999的含义是有9的地方如果有数字就显示如果没有数字就不显示，有0的地方在没有数字的时候也会有０来占位.但这样做也有一个很大的缺点,就是如果是整数时它也仍然会显示&#8221;.&#8221;,不要小瞧这个点,一般来讲页面上要显示的话这个点就是多余的.也给我们造成了不小的麻烦.还要自己再写函数来把这个小点搞定. <br />
<br />
三、 对于日期型的Oracle倒时提供了一个好的处理方法,可以把日期做成数值型的.然后再To_char就能显示出你所需要的类型了. <br />
<br />
四、 在使用select into时一定要注意,这种方法你一定要确认肯定会有数据被查出时才能使用.如果查询结果为空时会导致报错.还有一种情况是查出来的数据是多条也会报错.所以应该尽量便宜游标来做.会减少错误产生的机率. <br />
<br />
五、 还有注意一点rownum不支持排序,就是说你想用这个来控制行数的话就会发现他没有按你指定的排序方式显示.,这是一个很难办的事.而且如果你用rownum=2这样的语句来输出第二行的话也是行不通的. 六、 最恶心的一点是Oracle对null的判断变态到极点.如果你说某个变量 aa=null它是判断不出来的.尽管aa的确是空.即使在选择条件里也是判断不出来的.不知道为什么,只好用nvl()这个函数来判断了.在条件之外可以用 aa is null 来判断. <br />
<br />
六 补充一点.就是在写存储过程时要注意参数名不能与数据库字段名相同.否则Oracle会把这个参数名看成是字段名的,即使你用表的别名区分也不行.所以起参数名的时候一定要注意这点.了 <br />
-------------<br />
SELECT TO_CHAR(SYSDATE,'YYMMDD') FROM DUAL&nbsp; <br />
结果:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 080924<br />
</p>
</div>
<img src ="http://www.blogjava.net/msmary/aggbug/211148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-06-27 15:27 <a href="http://www.blogjava.net/msmary/articles/211148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习Oracle经验谈(转)</title><link>http://www.blogjava.net/msmary/articles/206764.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Mon, 09 Jun 2008 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/206764.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/206764.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/206764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/206764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/206764.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
&nbsp;
<p style="text-align: left" align="left">&nbsp;<strong><span style="color: red; font-family: 宋体">如何学习Oracle</span></strong><span style="color: #2a2a2a; font-family: 宋体">&nbsp;<br />
&nbsp;<br />
</span><span style="color: #2a2a2a; font-family: 宋体">　经常有一些Oracle的初学者问到这个问题，这里算是一个统一答复。 </span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">　　1、如果有一定的数据库基础，知道SQL是怎么回事，即使写不出来简单的SQL，但可以看动它们，你就可以跳到2。否则请先看一下数据库基础和SQL语言，不需要很深，更不需要去记忆那些复杂的SQL命令，这些可以留在以后边应用边学习、记忆。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">　　2、要想学好ORACLE，首先要学习ORACLE的体系结构，现在你不需要深入理解它们，但要分清几个关键的概念：</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">　　instance &amp; database, memory structure , process &amp; those files ,such as data file, control file, init parameter file etc 以及database , tablespace , data file和tablespace, segmnet, extent &amp; block它们之间的关系。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">　　当然还要分清undo tablespace &amp; redo log file等，</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">　　对于很多初学者来说，能够对这些概念有个较为清晰的认识并不是一件容易的事，而这些并非Oracle的全部。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">　　3、2是有关ORACLE的一些基本概念，下面要学习的是一些简单的的实际操作，就是如何去管理ORACLE数据库，当然不是管理全部的ORACLE。在此过程中你将对SQL和ORACLE体系结构有个更深入的了解。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">　　4、到了这一步你基本上算是初步掌握了ORACLE，下面将要根据你的方向来具体学习其它的ORACLE知识了。如果你是开发人员，则需要更多地去学习PL/SQL以及DEVELOPER，而这将是一门新的课程。如果你是一名DBA，请继续。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">　　5、现在你可以根据自己的实际情况，进行有选择的学习，也就是说下面的内容没有特别顺序要求。可以选择深入学习ORACLE的管理、备份与恢复、性能调整、网络等。当然在学习这些知识的过程中，如果有实际的工作更好，这样你可以在实际中成长，学会TROUBLE SHOOTING。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">　　6、当然在学习的过程中，你可以在网站或论坛中与他人进行交流，可以看别人的一些经验文章，也可以自己写一些心得体会。</span></p>
<p style="text-align: left" align="left"><strong><span style="color: red; font-family: 宋体">我说一下我学习oracle的经历</span></strong><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">　　<br />
　　必须对insert/update/delete/select很熟悉<br />
　　这是基本的<br />
　　<br />
　　</span><strong><span style="color: #2a2a2a; font-family: 宋体">OS</span></strong><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">　　在NT上安装OEM可以帮助你理解Oracle 的objects 的概念<br />
　　熟悉对应的SQL语句<br />
　　Linux上的oracle也必须要学<br />
　　所以你要熟悉linux的命令<br />
　　这是你提高的必经之路<br />
　　<br />
　　</span><strong><span style="color: #2a2a2a; font-family: 宋体">架构</span></strong><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">　　理解Oracle的结构<br />
　　什么是instance/db/tablespace/datafile/segment/rollback segment<br />
　　initSID.ora file/password file<br />
　　书很多,买本,读上3遍<br />
　　<br />
　　</span><strong><span style="color: #2a2a2a; font-family: 宋体">数据字典</span></strong><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">　　这一关好难过的<br />
　　那么多数据字典,记忆起来好麻烦<br />
　　不过还是要记...<br />
　　不过如果你是DBA那就好多了<br />
　　每天接触这些字典<br />
　　你肯定有你熟悉的数据字典<br />
　　用起来也很顺手<br />
　　<br />
　　</span><strong><span style="color: #2a2a2a; font-family: 宋体">Tuning</span></strong><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">　　DBA的最高境界,也是个永恒的话题<br />
　　<br />
　　</span><strong><span style="color: #2a2a2a; font-family: 宋体">硬件</span></strong><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">　　大型的数据库肯定不在PC机上<br />
　　一般的大机器都有硬件厂商的支持<br />
　　你要了解一些硬件知识<br />
　　如光纤通道/RAID/HA/<br />
　　还有存储<br />
　　你要知道<br />
　　volumn manage/AIX lvm等等<br />
　　<br />
　　</span><strong><span style="color: #2a2a2a; font-family: 宋体">软件</span></strong><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">　　一种以上的Unix系统<br />
　　solaris/AIX/HPUnix/Sco unix/Tru64 etc<br />
　　<br />
　　</span><strong><span style="color: #2a2a2a; font-family: 宋体">OCP</span></strong><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">　　OCP的资料一定是要看的<br />
　　考不考由你<br />
　　<br />
　　</span><strong><span style="color: #2a2a2a; font-family: 宋体">OCM</span></strong><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">　　哈哈这个吗...据说和CCIE差不多<br />
　　国内还没有考试,要去HK<br />
　　<br />
　　</span><strong><span style="color: #2a2a2a; font-family: 宋体">Oracle</span></strong><strong><span style="color: #2a2a2a; font-family: 宋体">公司</span></strong><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">　　如果你能去oracle公司,那............请我吃饭吧<br />
　　哈哈</span></p>
<p style="text-align: left" align="left"><strong><span style="color: red; font-family: 宋体">如何学习Oracle-eygle的方法经验谈</span></strong></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">很多朋友经常问起学习Oracle的方法，在这里我把写在《Oracle数据库性能优化》一书前面的话贴在这里，供大家参考！<br />
-------------------------------------------------------------------------------</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">经常有朋友会问，应该如何学习Oracle，怎样才能快速提高？我把自己的一点心得写在这里，供大家参考。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">其实学习任何东西都是一样，没有太多的捷径可走，必须打好了坚实的基础，才有可以在进一步学习中得到快速提高。<br />
王国维在他的《人间词话》中曾经概括了为学的三种境界，我在这里套用一下：</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体"><br />
</span><span style="color: #2a2a2a; font-family: 宋体">古今之成大事业、大学问者，罔不经过三种之境界。<br />
&#8220;昨夜西风凋碧树。独上高楼，望尽天涯路。&#8221;此第一境界也。<br />
&#8220;衣带渐宽终不悔，为伊消得人憔悴。&#8221;此第二境界也。<br />
&#8220;众里寻他千百度，蓦然回首，那人却在灯火阑珊处。&#8221;此第三境界也。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">学习Oracle，这也是你必须经历的三种境界。<br />
第一层境界是说，学习的路是漫漫的，你必须做好充分的思想准备，如果半途而废还不如不要开始。<br />
这里，注意一个"尽"字，在开始学习的过程中，你必须充分阅读Oracle的基础文档，概念手册、管理手册、备份恢复手册等（这些你都可以在http://tahiti.oracle.com 上找到）；OCP认证的教材也值得仔细阅读。打好基础之后你才具备了进一步提升的能力，万丈高楼都是由地而起。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">第二层境界是说，尽管经历挫折、打击、灰心、沮丧，也都要坚持不放弃，具备了基础知识之后，你可以对自己感兴趣或者工作中遇到的问题进行深入的思考，由浅入深从来都不是轻而易举的，甚至很多时候你会感到自己停滞不前了，但是不要动摇，学习及理解上的突破也需要时间。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">第三次境界是说，经历了那么多努力以后，你会发现，那苦苦思考的问题，那百思不得其解的算法原理，原来答案就在手边，你的思路豁然开朗，宛如拨云见月。这个时候，学习对你来说，不再是个难题，也许是种享受，也许成为艺术。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">所以如果你想问我如何速成，那我是没有答案的。<br />
不经一番寒彻骨，哪得梅花扑鼻香。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">当然这三种境界在实际中也许是交叉的，在不断的学习中，不断有蓦然回首的收获。<br />
我自己在学习的过程中，经常是采用"由点及面法"。<br />
当遇到一个问题后，一定是深入下去，穷究根本，这样你会发现，一个简单的问题也必定会带起一大片的知识点，如果你能对很多问题进行深入思考和研究，那么在深处，你会发现，这些面逐渐接合，慢慢的延伸到oracle的所有层面，逐渐的你就能融会贯通。这时候，你会主动的去尝试全面学习Oracle，扫除你的知识盲点，学习已经成为一种需要。<br />
由实践触发的学习才最有针对性，才更能让你深入的理解书本上的知识，正所谓：&#8220;纸上得来终觉浅，绝知此事要躬行&#8221;。实践的经验于我们是至为宝贵的。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">如果说有，那么这，就是我的捷径。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">想想自己，经常是"每有所获，便欣然忘食"，兴趣才是我们最好的老师。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">Oracle</span><span style="color: #2a2a2a; font-family: 宋体">的优化是一门学问，也是一门艺术，理解透彻了，你会知道，优化不过是在各种条件之下做出的均衡与折中。<br />
内存、外存；CPU、IO...对这一切你都需要有充分的认识和相当的了解，管理数据库所需要的知识并不单纯。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">作为一个数据库管理人员，你需要做的就是能够根据自己的知识以及经验在各种复杂情况下做出快速正确的判断。当问题出现时，你需要知道使用怎样的手段发现问题的根本；找到问题之后，你需要运用你的知识找到解决问题的方法。<br />
这当然并不容易，举重若轻还是举轻若重，取决于你具备怎样的基础以及经验积累。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">在网络上，Howard J. Rogers最近创造了一个新词组:Voodoo Tuning，用以形容那些没有及时更新自己的知识技能的所谓的Oracle技术专家。由于知识的陈旧或者理解的肤浅，他们提供的很多调整建议是错误的、容易使人误解的，甚至是荒诞的。他们提供的某些建议在有些情况下也许是正确的，如果你愿意回到Oracle5版或者6版的年代；但是这些建议在Oracle7.0,8.0 或者 Oracle8i以后往往是完全错误的。<br />
后来基于类似问题触发了互联网内Oracle顶级高手的一系列深入讨论，TOM、Jonathan Lewis、HJR等人都参与其中，在我的网站上( www.eygle.com )上对这些内容及相关链接作了简要介绍，有兴趣的可以参考。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">HJR</span><span style="color: #2a2a2a; font-family: 宋体">给我们提了很好的一个提示:对你所需要调整的内容，你必须具有充分的认识，否则你做出的判断就有可能是错误的。<br />
这也是我想给自己和大家的一个建议:学习和研究Oracle，严谨和认真必不可少。<br />
当然你还需要勤奋，我所熟悉的在Oracle领域有所成就的技术人员，他们共同的特点就是勤奋。<br />
如果你觉得掌握的东西没有别人多，那么也许就是因为，你不如别人勤奋。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">要是你觉得这一切过于复杂了，那我还有一句简单的话送给大家:不积跬步，无以至千里。学习正是在逐渐积累过程中的提高。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">现在Itpub给我们提供了很好的交流场所，很多问题都可以在这里找到答案，互相讨论，互相学习。这是我们的幸运，我也因此非常感谢这个网络时代。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">Itpub</span><span style="color: #2a2a2a; font-family: 宋体">的第二本书即将出版，谨以此祝愿Itpub越来越好，也愿我们的书能给大家带来知识和帮助。</span></p>
<p style="text-align: left" align="left"><span style="color: #2a2a2a; font-family: 宋体">- Eygle 2005-03-09 </span><span style="color: #2a2a2a; font-family: 宋体">于北京</span></p>
<img src ="http://www.blogjava.net/msmary/aggbug/206764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-06-09 11:42 <a href="http://www.blogjava.net/msmary/articles/206764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关系数据库的语言分类 DDL DML DCL</title><link>http://www.blogjava.net/msmary/articles/206412.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Fri, 06 Jun 2008 13:45:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/206412.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/206412.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/206412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/206412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/206412.html</trackback:ping><description><![CDATA[1.&nbsp;<span style="font-family: 宋体">数据定义语言</span>(data define language) DDL
<p style="margin-left: 26.25pt; text-indent: 15.75pt"><span style="font-family: 宋体">这类语句是用来建立数据库基本组件的，例如建立表，建立视图等等。包含</span>create<span style="font-family: 宋体">语句、</span>drop<span style="font-family: 宋体">语句、</span>alter<span style="font-family: 宋体">语句、truncate、comment、grant、revoke<br />
<br />
</span></p>
<font face="宋体">2.<span style="font-family: 宋体">数据操作语句言</span>(data manipulate language)DML
<p style="margin-left: 42pt" align="left"><span style="font-family: 宋体">这类语句的作用是根据需要写入、删除、更新数据库中的数据。主要包括</span>select、insert、update、delete、call、explain、lock table<br />
</p>
3.<span style="font-family: 宋体">数据控制语言</span>(data control language)DCL
<p style="margin-left: 26.25pt; text-indent: 15.75pt"><span style="font-family: 宋体">这类语句主要用来实现用户的权限授予或者取消，保证数据的安全性。主要包括</span>COMMIT、SAVEPOINT、ROLLBACK、SET TRANSACTION </p>
</font>
<img src ="http://www.blogjava.net/msmary/aggbug/206412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-06-06 21:45 <a href="http://www.blogjava.net/msmary/articles/206412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oralce 视图 view</title><link>http://www.blogjava.net/msmary/articles/206408.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Fri, 06 Jun 2008 13:17:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/206408.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/206408.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/206408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/206408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/206408.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">Oracle</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">Oracle</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">的数据库对象分为五种：表，视图，序列，索引和同义词。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图是基于一个表或多个表或视图的逻辑表，本身不包含数据，通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图是存储在数据字典里的一条</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">select</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">语句。</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">通过创建视图可以提取数据的逻辑上的集合或组合。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图的优点：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">对数据库的访问，因为视图可以有选择性的选取数据库里的一部分。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">用户通过简单的查询可以从复杂查询中得到结果。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">维护数据的独立性，试图可从多个表检索数据。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">对于相同的数据可产生不同的视图。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图分为简单视图和复杂视图：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">简单视图只从单表里获取数据</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">复杂视图从多表</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana"><br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">简单视图不包含函数和数据组</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">复杂视图包含</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">简单视图可以实现</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">DML</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">操作</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana"><br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">复杂视图不可以</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">. </span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图的创建：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9.5pt; color: black; font-family: 'Courier New'">CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW&nbsp;<em>view_name </em></span></p>
<p style="text-align: left" align="left"><em><span style="font-size: 9.5pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;</span></em><span style="font-size: 9.5pt; color: black; font-family: 'Courier New'">[(<em>alias</em>[, <em>alias</em>]...)] </span></p>
<p style="text-align: left; tab-stops: 94.45pt" align="left"><span style="font-size: 9.5pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;AS <em>subquery</em></span></p>
<p style="text-align: left; tab-stops: 94.45pt" align="left"><span style="font-size: 9.5pt; color: black; font-family: 'Courier New'">&nbsp; [WITH CHECK OPTION [CONSTRAINT <em>constraint</em>]] </span></p>
<p style="text-align: left; tab-stops: 94.45pt" align="left"><span style="font-size: 9.5pt; color: black; font-family: 'Courier New'">&nbsp; [WITH READ ONLY] </span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">其中：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">OR REPLACE&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">：若所创建的试图已经存在，</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">ORACLE</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">自动重建该视图；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">FORCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">：不管基表是否存在</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">ORACLE</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">都会自动创建该视图；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">NOFORCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">：只有基表都存在</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">ORACLE</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">才会创建该视图：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">alias&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">：为视图产生的列定义的别名；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">subquery&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">：一条完整的</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">SELECT</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">语句，可以在该语句中定义别名；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">WITH CHECK&nbsp; OPTION </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">插入或修改的数据行必须满足视图定义的约束；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">WITH READ ONLY </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">该视图上不能进行任何</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">DML</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">操作。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">例如：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE&nbsp; OR&nbsp; REPLACE &nbsp;VIEW&nbsp; dept_sum_vw</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (name,minsal,maxsal,avgsal)</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AS&nbsp; SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM&nbsp;&nbsp;&nbsp;&nbsp;emp e,dept d</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE&nbsp; e.deptno=d.deptno</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GROUP&nbsp; BY&nbsp; d.dname;</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图的定义原则：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图的查询可以使用复杂的</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">SELECT</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">语法，包括连接</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">/</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">分组查询和子查询；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">在没有</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">WITH CHECK OPTION</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">和</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana"> READ ONLY </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">的情况下，查询中不能使用</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">子句；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">如果没有为</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">CHECK OPTION</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">约束命名，系统会自动为之命名，形式为</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">SYS_Cn;</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.OR REPLACE</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">选项可以不删除原视图便可更改其定义并重建，或重新授予对象</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">权限。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图的查询：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图创建成功后，可以从视图中检索数据，这点和从表中检索数据一样。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">还可以查询视图的全部信息和指定的数据行和列。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">如：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">检索数据：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL&gt;SELECT * FROM&nbsp; dept_sum_vw</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">查询视图定义：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT view_name,text&nbsp; from user_views;</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">其中</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">text</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">显示的内容为视图定义的</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">SELECT</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">语句，可通过</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">DESC USER_VIEWS</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">得到相关信息。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">修改视图：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">通过</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">OR REPLACE </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">重新创建同名视图即可。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图上的</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">DML </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">操作：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DML</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">操作应遵循的原则：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">简单视图可以执行</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">DML</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">操作；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">在视图包含</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">GROUP </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">函数，</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">GROUP BY</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">子句，</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">DISTINCT</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">关键字时不能</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">删除数据行；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">在视图不出现下列情况时可通过视图修改基表数据或插入数据：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图中包含</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">GROUP </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">函数，</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">GROUP BY</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">子句，</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">DISTINCT</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">关键字；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">使用表达式定义的列；</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.ROWNUM</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">伪列。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">基表中未在视图中选择的其他列定义为非空且无默认值。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图可用于保持数据库的完整性，但作用有限。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">通过视图执行引用完整性约束可在数据库级执行约束。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">WITH CHECK OPTION </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">子句限定：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">通过视图执行的</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">INSERTS</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">和</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">UPDATES</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">操作不能创建该视图检索不到的数据行，</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。</span></p>
<p style="tab-stops: 36.0pt">&nbsp;<span style="font-size: 9.5pt; color: #404040; font-family: 宋体">例如：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE OR REPLACE VIEW&nbsp; vw_emp20</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AS&nbsp; SELECT *&nbsp; FROM&nbsp; emp</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE&nbsp; deptno=20</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WITH CHECK OPTION constraint&nbsp; vw_emp20_ck;</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">已建立。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">查询结果：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT empno,ename,job FROM vw_emp20;</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EMPNO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JOB</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">---------------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7369&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SMITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLERK</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7566&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JONES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MANAGER</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7902&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ANALYST</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">修改：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATE vw_emp20 </span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deptno=20</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE&nbsp;&nbsp; empno=7902;</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">将产生错误：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATE vw_emp20 </span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">位于第一行：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORA-01402</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">：视图</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">WITH CHECK OPTION </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">违反</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">WHERE </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">子句</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图的删除：</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DROP VIEW&nbsp; VIEW_NAME</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">语句删除视图。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">删除视图的定义不影响基表中的数据。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">只有视图所有者和具备</span><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">DROP VIEW</span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">权限的用户可以删除视图。</span></p>
<p style="tab-stops: 36.0pt"><span style="font-size: 9.5pt; color: #404040; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9.5pt; color: #404040; font-family: 宋体">视图被删除后，基于被删除视图的其他视图或应用将无效。</span></p>
<img src ="http://www.blogjava.net/msmary/aggbug/206408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-06-06 21:17 <a href="http://www.blogjava.net/msmary/articles/206408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle cursor 游标</title><link>http://www.blogjava.net/msmary/articles/205991.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 05 Jun 2008 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/205991.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/205991.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/205991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/205991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/205991.html</trackback:ping><description><![CDATA[&nbsp;
<p style="background: white; margin-bottom: 7.5pt; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">游标：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">用来查询数据库，获取记录集合（结果集）的指针，可以让开发者一次访问一行结果集，在每条结果集上作操作。</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
</span><span style="font-size: 9pt; color: black; font-family: 宋体">分类：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">静态游标：<br />
分为显式游标和隐式游标。</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">REF</span><span style="font-size: 9pt; color: black; font-family: 宋体">游标：<br />
是一种引用类型，类似于指针。</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">显式游标：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;CURSOR </span><span style="font-size: 9pt; color: black; font-family: 宋体">游标名 ( 参数 ) [返回值类型] IS<br />
&nbsp; Select 语句</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
</span><span style="font-size: 9pt; color: black; font-family: 宋体">生命周期：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">1.</span><span style="font-size: 9pt; color: black; font-family: 宋体">打开游标(OPEN)<br />
解析，绑定。。。不会从数据库检索数据</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">2.</span><span style="font-size: 9pt; color: black; font-family: 宋体">从游标中获取记录(FETCH INTO)<br />
执行查询，返回结果集。通常定义局域变量作为从游标获取数据的缓冲区。</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">3.</span><span style="font-size: 9pt; color: black; font-family: 宋体">关闭游标(CLOSE)<br />
完成游标处理，用户不能从游标中获取行。还可以重新打开。</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
</span><span style="font-size: 9pt; color: black; font-family: 宋体">选项：参数和返回类型</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
(1).<br />
declare<br />
&nbsp;cursor emp_cur ( p_deptid in number) is <br />
select * from employees where department_id = p_deptid;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">l_emp employees%rowtype;<br />
begin<br />
&nbsp;dbms_output.put_line('Getting employees from department 30');<br />
open emp_cur(30);<br />
&nbsp;loop<br />
&nbsp; fetch emp_cur into l_emp;<br />
&nbsp; exit when emp_cur%notfound;<br />
&nbsp; dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');<br />
&nbsp; dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);<br />
&nbsp;end loop;<br />
&nbsp;close emp_cur;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;dbms_output.put_line('Getting employees from department 90');<br />
open emp_cur(90);<br />
&nbsp;loop<br />
&nbsp; fetch emp_cur into l_emp;<br />
&nbsp; exit when emp_cur%notfound;<br />
&nbsp; dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');<br />
&nbsp; dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);<br />
&nbsp;end loop;<br />
&nbsp;close emp_cur;<br />
end;<br />
(2).</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">declare </span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;CURSOR DEPT_CR IS SELECT DEPT_ID,DEPT_NAME&nbsp;FROM DEPT;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;W_ID NUMBER;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;W_NAME VARCHAR2(240);</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">begin</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;OPEN DEPT_CR;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;LOOP</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; FETCH DEPT_CR INTO W_ID,W_NAME;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; EXIT WHEN DEPT_CR%NOTFOUND;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.put_line(W_ID||'&nbsp;'||W_NAME);</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;END LOOP;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;CLOSE DEPT_CR;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">end;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">(3).</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">declare </span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;CURSOR DEPT_CR IS SELECT DEPT_ID,DEPT_NAME&nbsp;FROM DEPT;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;DEPT_REC DEPT_CR%ROWTYPE;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">begin</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;OPEN DEPT_CR;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;LOOP</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; FETCH DEPT_CR INTO DEPT_REC;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; EXIT WHEN DEPT_CR%NOTFOUND;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.put_line(DEPT_REC.DEPT_ID);</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;END LOOP;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;CLOSE DEPT_CR;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">end;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">隐式游标：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">不用明确建立游标变量，分两种：<br />
1.在PL/SQL中使用DML语言，使用ORACLE提供的名为SQL的隐示游标<br />
2.CURSOR FOR LOOP，用于for loop 语句</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
1</span><span style="font-size: 9pt; color: black; font-family: 宋体">举例：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">declare<br />
begin<br />
&nbsp;update departments set department_name=department_name;<br />
&nbsp;--where 1=2;&nbsp;<br />
&nbsp;dbms_output.put_line('update '|| sql%rowcount ||' records');<br />
end;<br />
<br />
</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
2</span><span style="font-size: 9pt; color: black; font-family: 宋体">举例：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">declare<br />
begin<br />
&nbsp;for my_dept_rec in ( select department_name, department_id from departments)<br />
&nbsp;loop<br />
&nbsp; dbms_output.put_line(my_dept_rec.department_id || ' : ' || my_dept_rec.department_name);<br />
&nbsp;end loop;<br />
end;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
3</span><span style="font-size: 9pt; color: black; font-family: 宋体">举例：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">单独select </span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">declare<br />
&nbsp;l_empno emp.EMPLOYEE_ID%type;<br />
-- l_ename emp.ename%type;<br />
begin<br />
&nbsp;select EMPLOYEE_ID&nbsp;&nbsp;&nbsp; <br />
&nbsp; into l_empno<br />
&nbsp;from emp;<br />
&nbsp;--where rownum =1;<br />
&nbsp;dbms_output.put_line(l_empno);<br />
end;<br />
<br />
</span><span style="font-size: 9pt; color: black; font-family: 宋体">使用INTO获取值，只能返回一行。</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">游标属性：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">%FOUND</span><span style="font-size: 9pt; color: black; font-family: 宋体">：变量最后从游标中获取记录的时候，在结果集中找到了记录。<br />
%NOTFOUND：变量最后从游标中获取记录的时候，在结果集中没有找到记录。<br />
%ROWCOUNT：当前时刻已经从游标中获取的记录数量。<br />
%ISOPEN：是否打开。</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">隐式游标:<br />
declare </span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;CURSOR DEPT_CR IS SELECT DEPT_ID,DEPT_NAME&nbsp;FROM DEPT;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">begin</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;FOR DEPT_REC IN DEPT_CR</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;LOOP</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.put_line(DEPT_REC.DEPT_ID||'&nbsp;&nbsp; '||DEPT_REC.DEPT_NAME);</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;END LOOP;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">end;&nbsp;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">显式和隐式游标的区别：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">尽量使用隐式游标，避免编写附加的游标控制代码（声明，打开，获取，关闭），也不需要声明变量来保存从游标中获取的数据。</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">REF CURSOR</span><span style="font-size: 9pt; color: black; font-family: 宋体">游标：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">动态游标，在运行的时候才能确定游标使用的查询。分类：<br />
强类型（限制）REF CURSOR，规定返回类型 <br />
弱类型（非限制）REF CURSOR，不规定返回类型，可以获取任何结果集。</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
TYPE ref_cursor_name IS REF CURSOR [RETURN return_type]</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
Declare<br />
&nbsp;Type refcur_t is ref cursor;<br />
&nbsp;<br />
&nbsp;Type emp_refcur_t is ref cursor return employee%rowtype;<br />
Begin<br />
&nbsp;Null;<br />
End;<br />
</span><span style="font-size: 9pt; color: black; font-family: 宋体">举例:</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">declare </span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;TYPE TY_DEPTREFCUR IS REF CURSOR;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;CR_DEPT&nbsp;&nbsp;&nbsp;&nbsp; TY_DEPTREFCUR;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;REC_DEPT&nbsp;&nbsp;&nbsp; DEPT%ROWTYPE;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">begin</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;OPEN CR_DEPT FOR</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; SELECT * FROM DEPT;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;LOOP</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;FETCH CR_DEPT INTO REC_DEPT; </span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;EXIT WHEN CR_DEPT%NOTFOUND; </span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;DBMS_OUTPUT.put_line(REC_DEPT.DEPT_ID||'&nbsp;'||REC_DEPT.DEPT_NAME); </span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;END LOOP;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;CLOSE CR_DEPT;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">end;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体"><br />
</span><span style="font-size: 9pt; color: black; font-family: 宋体">强类型举例：</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">declare<br />
&nbsp;--</span><span style="font-size: 9pt; color: black; font-family: 宋体">声明记录类型<br />
&nbsp;type emp_job_rec is record(<br />
&nbsp; employee_id number,<br />
&nbsp; employee_name varchar2(50),<br />
&nbsp; job_title varchar2(30)<br />
&nbsp;);<br />
&nbsp;--声明REF CURSOR，返回值为该记录类型<br />
&nbsp;type emp_job_refcur_type is ref cursor<br />
&nbsp; return emp_job_rec;<br />
&nbsp;--定义REF CURSOR游标的变量<br />
&nbsp;emp_refcur emp_job_refcur_type;</span></p>
<p style="background: white; margin: 7.5pt 0cm; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;emp_job emp_job_rec;<br />
begin<br />
&nbsp;open emp_refcur for<br />
&nbsp; select e.employee_id,<br />
&nbsp;&nbsp;&nbsp; e.first_name || ' ' ||e.last_name "employee_name",<br />
&nbsp;&nbsp;&nbsp; j.job_title<br />
&nbsp; from employees e, jobs j<br />
&nbsp; where e.job_id = j.job_id and rownum &lt; 11 order by 1;</span></p>
<p style="margin-top: 7.5pt; background: white; line-height: 21.6pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 宋体">&nbsp;fetch emp_refcur into emp_job;<br />
&nbsp;while emp_refcur%found loop<br />
&nbsp; dbms_output.put_line(emp_job.employee_name || '''s job is ');<br />
&nbsp; dbms_output.put_line(emp_job.job_title);<br />
&nbsp; fetch emp_refcur into emp_job;<br />
&nbsp;end loop;<br />
end;<br />
<br />
</span></p>
<img src ="http://www.blogjava.net/msmary/aggbug/205991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-06-05 10:51 <a href="http://www.blogjava.net/msmary/articles/205991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE 8i，9i 表连接方法</title><link>http://www.blogjava.net/msmary/articles/205739.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Wed, 04 Jun 2008 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/205739.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/205739.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/205739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/205739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/205739.html</trackback:ping><description><![CDATA[<p><font size="2">一般的相等连接： <br />
select * from a, b where a.id = b.id; <br />
这个就属于内连接。 <br />
<br />
对于外连接： <br />
Oracle中可以使用&#8220;(+) &#8221;来表示，9i可以使用LEFT/RIGHT/FULL OUTER JOIN <br />
<br />
LEFT OUTER JOIN：左外关联 <br />
SELECT e.last_name, e.department_id, d.department_name <br />
FROM employees e <br />
LEFT OUTER JOIN departments d <br />
ON (e.department_id = d.department_id); <br />
等价于 <br />
SELECT e.last_name, e.department_id, d.department_name <br />
FROM employees e, departments d <br />
WHERE e.department_id=d.department_id(+) <br />
结果为：所有员工及对应部门的记录，包括没有对应部门编号department_id的员工记录。 <br />
<br />
RIGHT OUTER JOIN：右外关联 <br />
SELECT e.last_name, e.department_id, d.department_name <br />
FROM employees e <br />
RIGHT OUTER JOIN departments d <br />
ON (e.department_id = d.department_id); <br />
等价于 <br />
SELECT e.last_name, e.department_id, d.department_name <br />
FROM employees e, departments d <br />
WHERE e.department_id(+)=d.department_id <br />
结果为：所有员工及对应部门的记录，包括没有任何员工的部门记录。 <br />
<br />
FULL OUTER JOIN：全外关联 <br />
SELECT e.last_name, e.department_id, d.department_name <br />
FROM employees e <br />
FULL OUTER JOIN departments d <br />
ON (e.department_id = d.department_id); <br />
结果为：所有员工及对应部门的记录，包括没有对应部门编号department_id的员工记录和没有任何员工的部门记录。</font></p>
<p><font size="2">ORACLE8i是不直接支持完全外连接的语法，也就是说不能在左右两个表上同时加上(+)，下面是在ORACLE8i可以参考的完全外连接语法<br />
select t1.id,t2.id from table1 t1,table t2 where t1.id=t2.id(+) <br />
union <br />
select t1.id,t2.id from table1 t1,table t2 where t1.id(+)=t2.id</font></p>
<table style="width: 536px; height: 636px" border="1">
    <tbody>
        <tr>
            <td width="25%"><font face="宋体" color="#000000" size="2"><strong>连接类型</strong></font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2"><strong>定义</strong></font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2"><strong>图示</strong></font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2"><strong>例子</strong></font></td>
        </tr>
        <tr>
            <td width="25%"><font face="宋体" color="#000000" size="2">内连接</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">只连接匹配的行</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2"><img src="file:///E:/Information/数据库/oracle内外连接.files/inner_join.jpg"  alt="" /></font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">select A.c1,B.c2 from A join B on A.c3 = B.c3;</font></td>
        </tr>
        <tr>
            <td width="25%"><font face="宋体" color="#000000" size="2">左外连接</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">包含左边表的全部行（不管右边的表中是否存在与它们匹配的行）以及右边表中全部匹配的行</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2"><img src="file:///E:/Information/数据库/oracle内外连接.files/left_join.jpg"  alt="" /></font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">select A.c1,B.c2 from A left join B on A.c3 = B.c3;</font></td>
        </tr>
        <tr>
            <td width="25%"><font face="宋体" color="#000000" size="2">右外连接</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">包含右边表的全部行（不管左边的表中是否存在与它们匹配的行）以及左边表中全部匹配的行</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2"><img src="file:///E:/Information/数据库/oracle内外连接.files/right_join.jpg"  alt="" /></font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">select A.c1,B.c2 from A right join B on A.c3 = B.c3;</font></td>
        </tr>
        <tr>
            <td width="25%"><font face="宋体" color="#000000" size="2">全外连接</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">包含左、右两个表的全部行，不管在另一边的表中是否存在与它们匹配的行</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2"><img src="file:///E:/Information/数据库/oracle内外连接.files/full_join.jpg"  alt="" /></font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">select A.c1,B.c2 from A full join B on A.c3 = B.c3;</font></td>
        </tr>
        <tr>
            <td width="25%"><font face="宋体" color="#000000" size="2">（theta）连接</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">使用等值以外的条件来匹配左、右两个表中的行</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2"><img src="file:///E:/Information/数据库/oracle内外连接.files/theta_join.jpg"  alt="" /></font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">select A.c1,B.c2 from A join B on A.c3 != B.c3;</font></td>
        </tr>
        <tr>
            <td width="25%"><font face="宋体" color="#000000" size="2">交叉连接</font></td>
            <td width="25%"><font face="宋体" color="#000000" size="2">生成笛卡尔积——它不使用任何匹配或者选取条件，而是直接将一个数据源中的每个行与另一个数据源的每个行一一匹配</font></td>
            <td width="25%">　</td>
            <td width="25%"><font face="宋体" color="#000000" size="2">select A.c1,B.c2 from A,B;</font></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/msmary/aggbug/205739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-06-04 11:05 <a href="http://www.blogjava.net/msmary/articles/205739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oraclesql语句笔记</title><link>http://www.blogjava.net/msmary/articles/201602.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Tue, 20 May 2008 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/201602.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/201602.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/201602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/201602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/201602.html</trackback:ping><description><![CDATA[0.赋予和取消权限<br />
GRANT SELECT,UPDATE,DELETE,INSERT ON STGPIT TO APPUSER;<br />
REVOKE ALL ON STGPIT FROM APPUSER;<br />
1.增加主键<br />
alter table TABLE_NAME add constraint KEY_NAME primary key (TABLE_COLUMN);<br />
指定表空间<br />
alter table TABLE_NAME add constraint KEY_NAME primary key (TABLE_COLUMN) using index tablespace TABLE_SPACE_NAME;<br />
2.增加外键<br />
alter table TABLE_NAME add constraint FK_NAME foreign key (TABLE_COLUMN) references KEY_TABLE_NAME;<br />
eg:<br />
ALTER TABLE PRD ADD CONSTRAINT PRD$FK$FIELD_SET01<br />
FOREIGN KEY(KEY_FIELD_SET_ID) REFERENCES I_FIELD_SET;<br />
3.使主键或外键失效、生效<br />
alter table TABLE_NAME disable(enable) constraint KEY_NAME;<br />
4、查看各种约束<br />
select constraint_name,table_name,constraint_type,status from user_constraints;<br />
select constraint_name, constraint_type,search_condition, r_constraint_name from user_constraints where table_name = upper('&amp;table_name')<br />
<br />
select c.constraint_name,c.constraint_type,cc.column_name <br />
from user_constraints c,user_cons_columns cc<br />
where c.owner = upper('&amp;table_owner') and c.table_name = upper('&amp;table_name')<br />
and c.owner = cc.owner and c.constraint_name = cc.constraint_name<br />
order by cc.position; <br />
<br />
5、删除主键或外键<br />
alter table TABLE_NAME drop constraint KEY_NAME;<br />
6、建外键<br />
单字段时：create table 表名 (col1 char(8),<br />
cno char(4) REFERENCE course);<br />
多个字段时,在最后加上 Foreign Key (字段名) REFERENCE 表名(字段)<br />
连带删除选项 (on delete cascade<br />
当指定时，如果父表中的记录被删除，则依赖于父表的记录也被删除<br />
REFERENCE 表名（） on delete cascade;<br />
7、删除带约束的表<br />
Drop table 表名 cascade constraints;<br />
<br />
8：索引管理<br />
&lt;1&gt;.creating function-based indexes <br />
sql&gt; create index summit.item_quantity on summit.item(quantity-quantity_shipped); <br />
<br />
&lt;2&gt;.create a B-tree index <br />
sql&gt; create [unique] index index_name on table_name(column,.. asc/desc) tablespace <br />
sql&gt; tablespace_name [pctfree integer] [initrans integer] [maxtrans integer] <br />
sql&gt; [logging | nologging] [nosort] storage(initial 200k next 200k pctincrease 0 <br />
sql&gt; maxextents 50); <br />
<br />
&lt;3&gt;.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum number of rows <br />
<br />
&lt;4&gt;.creating reverse key indexes <br />
sql&gt; create unique index xay_id on xay(a) reverse pctfree 30 storage(initial 200k <br />
sql&gt; next 200k pctincrease 0 maxextents 50) tablespace indx; <br />
<br />
&lt;5&gt;.create bitmap index <br />
sql&gt; create bitmap index xay_id on xay(a) pctfree 30 storage( initial 200k next 200k <br />
sql&gt; pctincrease 0 maxextents 50) tablespace indx; <br />
<br />
&lt;6&gt;.change storage parameter of index <br />
sql&gt; alter index xay_id storage (next 400k maxextents 100); <br />
<br />
7.allocating index space <br />
sql&gt; alter index xay_id allocate extent(size 200k datafile 'c:/oracle/index.dbf'); <br />
<br />
&lt;8&gt;.alter index xay_id deallocate unused; <br />
<br />
&lt;9&gt;、查看索引<br />
SQL&gt;select index_name,index_type,table_name from user_indexes order by table_name;<br />
&lt;10&gt;、查看索引被索引的字段<br />
SQL&gt;select * from user_ind_columns where index_name=upper('&amp;index_name');<br />
<br />
11、创建序列<br />
select * from user_sequences;<br />
create sequence SEQ_NAME start with 1000 <br />
maxvalue 1000 increment by 1;<br />
alter sequence SEQ_NAME minvalue 50 maxvalue 100;<br />
12、删除重复行<br />
update a set aa=null where aa is not null;<br />
<br />
delete from a where rowid!=<br />
(select max(rowid) from a b where a.aa=b.aa);<br />
13、删除同其他表相同的行<br />
delete from a where exits<br />
(select 'X' from b where b.no=a.no);<br />
或<br />
delete from a where no in (select no from b);<br />
14、查询从多少行到多少行的记录(可以用在web开发中的分页显示)<br />
<br />
select * from ( select rownum row_id,b.* from (select a.* from sys_oper a) b )<br />
where row_id between 15 and 20<br />
<br />
15、对公共授予访问权<br />
grant select on 表名 to public;<br />
create public synonym 同义词名 for 表名;<br />
16、填加注释<br />
comment on table 表名 is '注释';<br />
comment on column 表名.列名 is '注释';<br />
17、分布式数据库,创建数据库链路<br />
create [public] database link LINKNAME <br />
[connect to USERNAME identified by PASSWORD]<br />
[using 'CONNECT_STRING']<br />
可以在服务器端，也可以在客户端建立，但必须注意，两台服务器之间<br />
数据库必须可以互访，必须各有各自的别名数据库<br />
18、查看数据库链路<br />
select * from all_db_links;<br />
select * from user_db_links;<br />
查询 select * from TABLENAME@DBLNKNAME;<br />
创建远程数据库同义词<br />
create synonym for TABLENAME@DBLNKNAME;<br />
操纵远程数据库记录<br />
insert into TABLENAME@DBLNKNAME (a,b) values (va,vb);<br />
update TABLENAME@DBLNKNAME set a='this';<br />
delete from TABLENAME@DBLNKNAME;<br />
怎样执行远程的内嵌过程<br />
begin<br />
otherdbpro@to_html(参数);<br />
end;<br />
<br />
19、数据库链路用户密码有特殊字符的时候，可以用双引号把密码引起来<br />
create public database link dblink1 connect to db1 identified by "123*456" using 'db11'<br />
<br />
20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。<br />
&lt;1&gt;下面的语句可以进行总计<br />
select region_code,count(*) from aicbs.acc_woff_notify<br />
group by rollup(region_code);<br />
&lt;2&gt; 对第1个字段小计，最后合计<br />
select region_code,write_status,count(*) from aicbs.acc_woff_notify<br />
group by rollup(region_code,write_status);<br />
----------------------<br />
570 0 3<br />
570 1 2<br />
570 5 --此处小计了570的记录<br />
571 0 10<br />
571 1 2<br />
571 12 --此处小计了571的记录<br />
.....<br />
100 --此处有总计<br />
&lt;3&gt; 复合rollup表达式,只做总计<br />
select region_code,write_status,count(*) from aicbs.acc_woff_notify<br />
group by rollup(region_code,write_status);<br />
<br />
&lt;4&gt; 对第1个字段小计，再对第2个字段小计，最后合计<br />
select region_code,write_status,count(*) from aicbs.acc_woff_notify<br />
group by cube(region_code,write_status);<br />
----------------------<br />
100 --此处有总计<br />
0 60 --对write_status＝0的小计<br />
1 39 --对write_status＝1的小计<br />
3 1 --对write_status＝3的小计<br />
570 5 --此处小计了570的记录<br />
570 0 3<br />
570 1 2<br />
571 12 --此处小计了571的记录<br />
571 0 10<br />
571 1 2<br />
....<br />
&lt;3&gt; 复合cube表达式,只做总计<br />
select region_code,write_status,count(*) from aicbs.acc_woff_notify<br />
group by cube(region_code,write_status);<br />
<br />
<br />
&lt;4&gt;下面的语句可以按照rollup不同的字段进行小计<br />
select region_code,write_status,count(*) from aicbs.acc_woff_notify<br />
group by region_code,rollup(write_status);<br />
21.查询view的创建语句<br />
sql&gt;set long 1000<br />
sql&gt;select * from user_views where view_name='MY_VIEW_NAME';<br />
or<br />
sql&gt;select * from all_views where view_name='MY_VIEW_NAME';<br />
<br />
22、去除数据库中特殊字符<br />
&lt;1&gt;.字符串字段中含有"'",如果用来组合sql语句，会造成语句不准确。<br />
比如：replace(f1,'''','')<br />
&lt;2&gt;.字符串字段中含有"\t \n",如果用来在c或者c＋＋程序中输出到文件，格式无法保证。<br />
比如：replace(f2,'\t','')<br />
&lt;3&gt;.清除换行和回车<br />
比如: replace(f2,chr(13)||chr(10),'')<br />
23、如何在字符串里加回车或者tab键 <br />
在sqlplus中执行<br />
sql&gt;select 'UserId=1233111'||chr(10)||'AccId=13431'||chr(9)||'AccId2=11111' from dual;<br />
<br />
24、树形查询<br />
create table zj(<br />
bm number(8),<br />
bmmc varchar2(20),<br />
sjbm number(8)<br />
)<br />
<br />
insert into zj values(1,'aaa',0)<br />
insert into zj values(11,'aaa1',1)<br />
insert into zj values(12,'aaa2',1)<br />
insert into zj values(111,'aaa11',11)<br />
insert into zj values(112,'aaa12',11)<br />
insert into zj values(113,'aaa13',11)<br />
insert into zj values(121,'aaa21',12)<br />
insert into zj values(122,'aaa22',12)<br />
insert into zj values(123,'aaa23',12)<br />
--<br />
select bm,bmmc,sjbm,level<br />
from zj<br />
start with sjbm=0<br />
connect by prior bm = sjbm<br />
或者<br />
<br />
select bm,bmmc,sjbm,level<br />
from zj<br />
start with sjbm=0<br />
connect by sjbm = prior bm <br />
<br />
25、快照<br />
create snapshot SNAPSHOT_NAME <br />
[storage (storage parameter)]<br />
[tablespace TABLESPACE_NAME]<br />
[refresh [fast\complete\force]<br />
[start with START_DATE next NEXT_DATE]<br />
as QUERY;<br />
<br />
create snapshot snapshot_to_study as select * from TABLE_NAME@to_study;<br />
创建角色<br />
create role aa identified by aaa;<br />
授权 grant create snapshot,alter snapshot to aaa;<br />
grant aaa to emp;<br />
create snapshot SNAPSHOT_TO_HTML refresh complete start with sysdate next <br />
sysdate+5/(24*60*60) as select * from a@to_html;<br />
删除 drop snapshot snap_to_html<br />
手工刷新快照,(调用DBMS_SNAPSHOT包中的refresh过程)DBMS_SNAPSHOT.refresh(snapshot_name,refresh_type);<br />
begin<br />
DBMS_SNAPSHOT.REFRESH('snap_to_html','c');<br />
end;<br />
对所有快照进行刷新<br />
begin<br />
DBMS_SNAPSHOT.REFRESH_ALL;<br />
end;<br />
怎样执行远程的内嵌过程<br />
begin<br />
otherdbpro@to_html(参数);<br />
end;<br />
26、用户管理<br />
create a user: database authentication <br />
sql&gt; create user juncky identified by oracle default tablespace users <br />
sql&gt; temporary tablespace temp quota 10m on data password expire <br />
sql&gt; [account lock|unlock] [profile profilename|default]; <br />
<br />
&lt;1&gt;.查看当前用户的缺省表空间<br />
SQL&gt;select username,default_tablespace from user_users;<br />
&lt;2&gt;生成用户时指定缺省表空间<br />
create user 用户名 identified by 口令 default tablespace 表空间名;<br />
<br />
&lt;3&gt;重新指定用户的缺省表空间<br />
alter user 用户名 default tablespace 表空间名<br />
&lt;4&gt;查看当前用户的角色<br />
SQL&gt;select * from user_role_privs;<br />
&lt;5&gt;查看当前用户的系统权限和表级权限<br />
SQL&gt;select * from user_sys_privs;<br />
SQL&gt;select * from user_tab_privs;<br />
&lt;6&gt;查看用户下所有的表<br />
SQL&gt;select * from user_tables;<br />
&lt;7&gt; alter user语句的quota子句限制用户的磁盘空间<br />
如:alter user jf quota 10M on system;<br />
<br />
27、查看放在ORACLE的内存区里的表 <br />
SQL&gt;select table_name,cache from user_tables where instr(cache,'Y')&gt;0;<br />
<br />
28、约束条件<br />
create table employee<br />
(empno number(10) primary key,<br />
name varchar2(40) not null,<br />
deptno number(2) default 10,<br />
salary number(7,2) check salary&lt;10000,<br />
birth_date date,<br />
soc_see_num char(9) unique,<br />
foreign key(deptno) references dept.deptno)<br />
tablespace users;<br />
<br />
关键字(primary key)必须是非空,表中记录的唯一性<br />
not null 非空约束<br />
default 缺省值约束<br />
check 检查约束,使列的值符合一定的标准范围<br />
unqiue 唯一性约束<br />
foreign key 外部键约束<br />
<br />
29、查看创建视图的select语句<br />
SQL&gt;set view_name,text_length from user_views;<br />
SQL&gt;set long 2000; 说明：可以根据视图的text_length值设定set long 的大小<br />
SQL&gt;select text from user_views where view_name=upper('&amp;view_name');<br />
<br />
30、查看同义词的名称<br />
SQL&gt;select * from user_synonyms;<br />
<br />
31、用Sql语句实现查找一列中第N大值 <br />
select * from <br />
(select t.*,dense_rank() over (order by sal) rank from employee) <br />
where rank = N;<br />
<br />
32 虚拟自段<br />
&lt;1&gt;. CURRVAL 和 nextval<br />
为表创建序列<br />
CREATE SEQUENCE EMPSEQ ... ;<br />
SELECT empseq.currval FROM DUAL ;<br />
自动插入序列的数值<br />
INSERT INTO emp <br />
VALUES (empseq.nextval, 'LEWIS', 'CLERK', <br />
7902, SYSDATE, 1200, NULL, 20) ;<br />
<br />
&lt;2&gt;. ROWNUM<br />
按设定排序的行的序号<br />
SELECT * FROM emp WHERE ROWNUM &lt; 10 ;<br />
<br />
&lt;3&gt;. ROWID<br />
返回行的物理地址<br />
SELECT ROWID, ename FROM emp WHERE deptno = 20 ;<br />
<br />
33、对CLOB字段进行全文检索<br />
SELECT * FROM A WHERE dbms_lob.instr(a.a,'K',1,1)&gt;0;<br />
<br />
34. 特殊字符的插入，比如"&amp;" <br />
insert into a values (translate ('at{&amp;}t','at{}','at')); <br />
<br />
35.表管理<br />
&lt;1&gt;.create a table <br />
sql&gt; create table table_name (column datatype,column datatype]....) <br />
sql&gt; tablespace tablespace_name [pctfree integer] [pctused integer] <br />
sql&gt; [initrans integer] [maxtrans integer] <br />
sql&gt; storage(initial 200k next 200k pctincrease 0 maxextents 50) <br />
sql&gt; [logging|nologging] [cache|nocache] <br />
<br />
&lt;2&gt;.copy an existing table <br />
sql&gt; create table table_name [logging|nologging] as subquery <br />
<br />
&lt;3&gt; create table ... as 方式建表的时候，指定表参数<br />
create table a<br />
storage(<br />
initial 1M /*第一次创建时分配空间*/<br />
next 1M /*第一次分配的存储空间用完时在分配*/<br />
)<br />
as select * from b;<br />
&lt;4&gt;.创建临时表<br />
sql&gt; create global temporary table xay_temp as select * from xay; <br />
on commit preserve rows/on commit delete rows <br />
在Oracle中，可以创建以下两种临时表:<br />
a 会话特有的临时表:<br />
create global temporary table () on commit preserve rows;<br />
会话指定，当中断会话时ORACLE将截断表<br />
<br />
b 事务特有的临时表:<br />
create global temporary table () on commit delete rows;<br />
事务指定,每次提交后ORACLE将截断表（删除全部行） <br />
c 说明<br />
临时表只在当前连接内有效 <br />
　　临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用 <br />
　　数据处理比较复杂的时候时表快,反之视图快点 <br />
　　在仅仅查询数据的时候建议用游标: open cursor for 'sql clause';<br />
&lt;5&gt;<br />
pctfree = (average row size - initial row size) *100 /average row size <br />
pctused = 100-pctfree- (average row size*100/available data space) <br />
&lt;6&gt;.change storage and block utilization parameter <br />
sql&gt; alter table table_name pctfree=30 pctused=50 storage(next 500k <br />
sql&gt; minextents 2 maxextents 100); <br />
&lt;7&gt;.manually allocating extents <br />
sql&gt; alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf'); <br />
&lt;8&gt;.move tablespace <br />
sql&gt; alter table employee move tablespace users; <br />
&lt;9&gt;.deallocate of unused space <br />
sql&gt; alter table table_name deallocate unused [keep integer] <br />
&lt;10&gt;.drop a column <br />
sql&gt; alter table table_name drop column comments cascade constraints checkpoint 1000; <br />
alter table table_name drop columns continue; <br />
&lt;11&gt;.mark a column as unused <br />
sql&gt; alter table table_name set unused column comments cascade constraints; <br />
alter table table_name drop unused columns checkpoint 1000; <br />
alter table orders drop columns continue checkpoint 1000 <br />
data_dictionary : dba_unused_col_tabs<br />
<br />
37. 中文是如何排序的？ <br />
<br />
Oracle9i之前，中文是按照二进制编码进行排序的。 <br />
在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值 <br />
SCHINESE_RADICAL_M 按照部首（第一顺序）、笔划（第二顺序）排序 <br />
SCHINESE_STROKE_M 按照笔划（第一顺序）、部首（第二顺序）排序 <br />
SCHINESE_PINYIN_M 按照拼音排序 <br />
<br />
38. 数据表中的字段最大数:<br />
表或视图中的最大列数为 1000<br />
<br />
39. oracle中的裸设备:<br />
裸设备就是绕过文件系统直接访问的储存空间<br />
<br />
40. 在Oracle服务器上通过SQLPLUS查看本机IP地址 ? <br />
select sys_context('userenv','ip_address') from dual; <br />
如果是登陆本机数据库，只能返回127.0.0.1<br />
<br />
41. 在ORACLE中取毫秒? <br />
9i之前不支持,9i开始有timestamp. <br />
9i可以用select systimestamp from dual;<br />
<br />
42. 将N秒转换为时分秒格式？ <br />
set serverout on <br />
declare <br />
N number := 1000000; <br />
ret varchar2(100); <br />
begin <br />
ret := trunc(n/3600) || '小时' || to_char(to_date(mod(n,3600),'sssss'),'fmmi"分 "ss"秒"') ; <br />
dbms_output.put_line(ret); <br />
end; <br />
<br />
43、在某个用户下找所有的索引<br />
select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name <br />
from user_ind_columns, user_indexes <br />
where user_ind_columns.index_name = user_indexes.index_name <br />
and user_ind_columns.table_name = user_indexes.table_name <br />
order by user_indexes.table_type, user_indexes.table_name, <br />
user_indexes.index_name, column_position;<br />
<br />
44. not in的替代。<br />
一般not in的效率比较低。特别是数据量大的时候，几乎不能执行。<br />
用下面几种方式可以替换写法<br />
比如要查询在fee_rev_info表中已经销户的用户（不在cm_user中的）(不过下面的例子不是很好，因为bill_id是cm_user的唯一索引）<br />
select * from fee_rev_info where bill_id not in (select bill_id from cm_user) <br />
&lt;1&gt; 用not exists<br />
select * from fee_rev_info a where not exists (select 'p' from cm_user b where b.bill_id = a.bill_id)<br />
&lt;2&gt; 用外连接(+)<br />
select a.* from fee_rev_info a,cm_user b<br />
where a.bill_id = b.bill_id (+)<br />
and b.bill_id is null<br />
&lt;3&gt; 用hash_aj<br />
select /*+HASH_AJ*/* from fee_rev_info where bill_id not in (select bill_id from cm_user) <br />
<br />
45.怎么样查询特殊字符，如通配符%与_<br />
假如数据库中有表 STATIONTYPE,STATION_571 STATION_572 ... <br />
select * from tab where tname like 'STATION_%'<br />
会显示 STATIONTYPE,STATION_571 ... 可以用下面的语句<br />
select * from tab where tname like 'STATION\_%' escape'\'<br />
<br />
46.如果存在就更新，不存在就插入可以用一个语句实现吗<br />
9i已经支持了，是Merge，但是只支持select子查询，<br />
如果是单条数据记录，可以写作select .... from dual的子查询。<br />
语法为：<br />
MERGE INTO table<br />
USING data_source<br />
ON (condition)<br />
WHEN MATCHED THEN update_clause<br />
WHEN NOT MATCHED THEN insert_clause;<br />
<br />
如<br />
MERGE INTO cm_user_credit <br />
USING (select * from dual) ON (user_id =1302514690 )<br />
when MATCHED then update set credit_value = 1000<br />
when NOT MATCHED then insert (user_id,acc_id,bill_id,plan_id,region_code,credit_value) values(1302514690,1305032158,'13857141218',10070247,'571',1000);<br />
<br />
47.怎么实现一条记录根据条件多表插入<br />
9i以上可以通过Insert all语句完成，仅仅是一个语句，如：<br />
INSERT ALL<br />
WHEN (id=1) THEN<br />
INTO table_1 (id, name)<br />
values(id,name)<br />
WHEN (id=2) THEN<br />
INTO table_2 (id, name)<br />
values(id,name)<br />
ELSE<br />
INTO table_other (id, name)<br />
values(id, name)<br />
SELECT id,name<br />
FROM a;<br />
<br />
如果没有条件的话，则完成每个表的插入，如<br />
INSERT ALL<br />
INTO table_1 (id, name)<br />
values(id,name)<br />
INTO table_2 (id, name)<br />
values(id,name)<br />
INTO table_other (id, name)<br />
values(id, name)<br />
SELECT id,name<br />
FROM a;<br />
<br />
48.如何实现行列转换<br />
&lt;1&gt;、固定列数的行列转换<br />
如<br />
student subject grade<br />
---------------------------<br />
student1 语文 80<br />
student1 数学 70<br />
student1 英语 60<br />
student2 语文 90<br />
student2 数学 80<br />
student2 英语 100<br />
...<br />
转换为 <br />
语文 数学 英语<br />
student1 80 70 60<br />
student2 90 80 100<br />
...<br />
语句如下：<br />
select student,sum(decode(subject,'语文', grade,null)) "语文",<br />
sum(decode(subject,'数学', grade,null)) "数学",<br />
sum(decode(subject,'英语', grade,null)) "英语"<br />
from table<br />
group by student<br />
<br />
&lt;2&gt;、不定列行列转换<br />
如<br />
c1 c2<br />
--------------<br />
1 我<br />
1 是<br />
1 谁<br />
2 知<br />
2 道<br />
3 不<br />
...<br />
转换为<br />
1 我是谁<br />
2 知道<br />
3 不<br />
<br />
这一类型的转换必须借助于PL/SQL来完成，这里给一个例子<br />
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER) <br />
RETURN VARCHAR2 <br />
IS <br />
Col_c2 VARCHAR2(4000); <br />
BEGIN<br />
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP <br />
Col_c2 := Col_c2||cur.c2; <br />
END LOOP; <br />
Col_c2 := rtrim(Col_c2,1);<br />
RETURN Col_c2; <br />
END;<br />
/<br />
SQL&gt; select distinct c1 ,get_c2(c1) cc2 from table;即可<br />
<br />
--例子：<br />
create table okcai_1<br />
(<br />
user_id varchar2(10),<br />
user_number varchar2(10),<br />
user_num number(8)<br />
)<br />
user_id user_number user_num<br />
---------------------<br />
1 123 2<br />
1 456 5<br />
1 789 6<br />
2 11 2<br />
2 22 3<br />
2 33 4<br />
2 44 5<br />
2 55 6<br />
2 66 7<br />
2 77 8<br />
3 1234 1<br />
3 5678 2<br />
<br />
方式一：<br />
create or replace function get_col(<br />
p_userId number,<br />
p_col number<br />
) return varchar<br />
as<br />
v_tmp varchar2(255);<br />
begin<br />
select user_number||chr(9)||user_num into v_tmp<br />
from <br />
(select user_number,user_num,rownum row_id <br />
from okcai_1<br />
where user_id = p_userId) a<br />
where row_id = p_col;<br />
return ltrim(v_tmp);<br />
--return v_tmp;<br />
end;<br />
<br />
然后<br />
select distinct user_id,get_col(user_id,1),get_col(user_id,2),get_col(user_id,3) .... from okcai_1<br />
<br />
方式二：<br />
create or replace function get_col(<br />
p_userId number,<br />
p_col number<br />
) return varchar<br />
as<br />
v_tmp varchar2(255);<br />
begin<br />
select user_number||chr(9)||user_num into v_tmp<br />
from <br />
(select user_number,user_num,rownum row_id <br />
from okcai_1<br />
where user_id = p_userId) a<br />
where row_id = p_col;<br />
return ltrim(v_tmp);<br />
--return v_tmp;<br />
end;<br />
select distinct user_id,get_col_new(user_id) from okcai_1;<br />
<br />
49.怎么设置存储过程的调用者权限<br />
普通存储过程都是所有者权限，如果想设置调用者权限，请参考如下语句<br />
create or replace<br />
procedure ...()<br />
AUTHID CURRENT_USER<br />
As<br />
begin<br />
...<br />
end;<br />
<br />
50.Oracle有哪些常见关键字<br />
详细信息可以查看v$reserved_words视图<br />
<br />
51.怎么查看数据库参数<br />
&lt;1&gt; show parameter 参数名<br />
如通过show parameter spfile可以查看9i是否使用spfile文件<br />
其中参数名是可以匹配的。<br />
比如show parameter cursor ,则会显示跟cursor相关的参数<br />
&lt;2&gt;<br />
select * from v$parameter<br />
&lt;3&gt;<br />
<br />
除了这部分参数，Oracle还有大量隐含参数，可以通过如下语句查看:<br />
SELECT NAME <br />
,VALUE <br />
,decode(isdefault, 'TRUE','Y','N') as "Default" <br />
,decode(ISEM,'TRUE','Y','N') as SesMod <br />
,decode(ISYM,'IMMEDIATE', 'I', <br />
'DEFERRED', 'D', <br />
'FALSE', 'N') as SysMod <br />
,decode(IMOD,'MODIFIED','U', <br />
'SYS_MODIFIED','S','N') as Modified <br />
,decode(IADJ,'TRUE','Y','N') as Adjusted <br />
,description <br />
FROM ( --GV$SYSTEM_PARAMETER <br />
SELECT x.inst_id as instance <br />
,x.indx+1 <br />
,ksppinm as NAME <br />
,ksppity <br />
,ksppstvl as VALUE <br />
,ksppstdf as isdefault <br />
,decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE') as ISEM <br />
,decode(bitand(ksppiflg/65536,3), <br />
1,'IMMEDIATE',2,'DEFERRED','FALSE') as ISYM <br />
,decode(bitand(ksppstvf,7),1,'MODIFIED','FALSE') as IMOD <br />
,decode(bitand(ksppstvf,2),2,'TRUE','FALSE') as IADJ <br />
,ksppdesc as DESCRIPTION <br />
FROM x$ksppi x <br />
,x$ksppsv y <br />
WHERE x.indx = y.indx <br />
AND substr(ksppinm,1,1) = '_' <br />
AND x.inst_id = USERENV('Instance') <br />
) <br />
ORDER BY NAME<br />
<br />
52.怎样建立基于函数索引<br />
8i以上版本，确保<br />
Query_rewrite_enabled=true<br />
Query_rewrite_integrity=trusted<br />
Compatible=8.1.0以上<br />
Create index indexname on table (function(field));<br />
<br />
53.怎么样移动表或表分区<br />
[A]移动表的语法<br />
Alter table tablename move<br />
[Tablespace new_name<br />
Storage(initial 50M next 50M <br />
pctincrease 0 pctfree 10 pctused 50 initrans 2) nologging]<br />
移动分区的语法<br />
alter table tablename move (partition partname)<br />
[update global indexes]<br />
之后之后必须重建索引<br />
Alter index indexname rebuild<br />
如果表有Lob段，那么正常的Alter不能移动Lob段到别的表空间，而仅仅是移动了表段，可以采用如下的方法移动Lob段<br />
alter table tablename move <br />
lob(lobsegname) store as (tablespace newts);<br />
<br />
54.怎么样修改表的列名<br />
[A]9i以上版本可以采用rname命令<br />
ALTER TABLE UserName.TabName <br />
RENAME COLUMN SourceColumn TO DestColumn<br />
9i以下版本可以采用create table &#8230;&#8230; as select * from SourceTable的方式。<br />
另外，8i以上可以支持删除列了<br />
ALTER TABLE UserName.TabName <br />
SET UNUSED (ColumnName) CASCADE CONSTRAINTS<br />
ALTER TABLE UserName.TabName <br />
DROP (ColumnName) CASCADE CONSTRAINTS<br />
<br />
55.case的用法<br />
在sql语句中<br />
CASE test_value<br />
WHEN expression1 THEN value1<br />
[[WHEN expression2 THEN value2] [...]]<br />
[ELSE default_value]<br />
END <br />
<br />
比如1<br />
SELECT last_name, job_id, salary<br />
CASE job_id <br />
WHEN 'IT_PROG' THEN 1.10*salary<br />
WHEN 'ST_CLERK' THEN 1.15*salary<br />
WHEN 'SA_REP' THEN 1.20*salary<br />
ELSE salary END "REVISED_SALARY"<br />
FROM employees <br />
<br />
比如2<br />
select <br />
case<br />
when real_charge&gt;=20000 and real_charge&lt;30000 then 5000<br />
when real_charge&gt;=30000 and real_charge&lt;40000 then 9000<br />
when real_charge&gt;=40000 and real_charge&lt;50000 then 10000<br />
when real_charge&gt;=50000 and real_charge&lt;60000 then 14000<br />
when real_charge&gt;=60000 and real_charge&lt;70000 then 18000<br />
when real_charge&gt;=70000 and real_charge&lt;80000 then 19000<br />
when real_charge&gt;=80000 and real_charge&lt;90000 then 24000<br />
when real_charge&gt;=90000 and real_charge&lt;100000 then 27000 <br />
when real_charge&gt;=100000 and real_charge&lt;110000 then 27000<br />
when real_charge&gt;=110000 and real_charge&lt;120000 then 29000 <br />
when real_charge&gt;=120000 then 36000<br />
else<br />
0 <br />
end ,acc_id,user_id,real_charge from okcai_jh_charge_200505<br />
<br />
在存储过程中<br />
case v_strGroupClassCode<br />
when '1' then<br />
v_nAttrNum := v_nAttrNum + 300;<br />
v_strAttrFlag := '1'||substr(v_strAttrFlag,2,7);<br />
when '2' then<br />
v_nAttrNum := v_nAttrNum + 200;<br />
v_strAttrFlag := '2'||substr(v_strAttrFlag,2,7);<br />
else<br />
NULL;<br />
end case;<br />
注意的是存储过程和sql语句有的细微差别是用end case，而不是end。语句后面跟";"<br />
<img src ="http://www.blogjava.net/msmary/aggbug/201602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-05-20 11:54 <a href="http://www.blogjava.net/msmary/articles/201602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Package,Procedure,Trigger,Function,TYPE</title><link>http://www.blogjava.net/msmary/articles/201455.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Mon, 19 May 2008 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/201455.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/201455.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/201455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/201455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/201455.html</trackback:ping><description><![CDATA[1.The Insert Row trigger has the following syntax.
<pre>
<pre>CREATE OR REPLACE TRIGGER <span class="docEmphasis">trigger_name</span>
AFTER|BEFORE INSERT ON <span class="docEmphasis">table_name</span>
FOR EACH ROW
[WHEN (Boolean expression)]
DECLARE
<span class="docEmphasis">Local declarations</span>
BEGIN
<span class="docEmphasis">Trigger Body written PL/SQL</span>
END;
</pre>
<pre>2.TYPE IS TABLE OF </pre>
<pre>如果想使用PL/SQL表中的具体一列,再加上: &nbsp; <br />
TYPE cg$table_type IS TABLE OF I_FIELD_MAPPED_COLUMN%ROWTYPE<br />
&nbsp;&nbsp;&nbsp;&nbsp; INDEX BY BINARY_INTEGER;<br />
cg$table cg$table_type;&nbsp; <br />
--cg$I_FIELD_MAPPED_COLUMN包名</pre>
<pre>idx BINARY_INTEGER := 1;</pre>
<pre>cg$I_FIELD_MAPPED_COLUMN.cg$table(cg$I_FIELD_MAPPED_COLUMN.idx).FIELD_MAPPED_COLUMN_ID </pre>
<pre>  := cg$rec.FIELD_MAPPED_COLUMN_ID;<br />
&nbsp;&nbsp;&nbsp; </pre>
</pre>
<img src ="http://www.blogjava.net/msmary/aggbug/201455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-05-19 18:08 <a href="http://www.blogjava.net/msmary/articles/201455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>清空临时表空间</title><link>http://www.blogjava.net/msmary/articles/191671.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Wed, 09 Apr 2008 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/191671.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/191671.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/191671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/191671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/191671.html</trackback:ping><description><![CDATA[<p>查看临时表空间的数据文件的状态<br />
&nbsp; SELECT FILE#,STATUS FROM V$TEMPFILE<br />
查看临时表空间的大小<br />
&nbsp; SELECT TABLESPACE_NAME,FILE_NAME,<br />
&nbsp;&nbsp;&nbsp; BYTES/1024/1024,USER_BYTES/1024/1024,(BYTES-USER_BYTES)/1024/1024 FROM DBA_TEMP_FILES<br />
查看临时表空间的详细信息<br />
&nbsp; SELECT * FROM DBA_TEMP_FILES <br />
查看表空间的空余大小<br />
&nbsp; SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 MB FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME</p>
<p>清空临时表空间</p>
<p>1.startup --启动数据库</p>
<p>2.创建中转临时表空间&nbsp; <br />
&nbsp; CREATE TEMPORARY TABLESPACE TEMP2<br />
&nbsp;&nbsp;&nbsp; TEMPFILE 'D:\ORACLE\ORADATA\DB\DATAFILE\TEMP_T02.DBF' SIZE 200M</p>
<p>3.改变缺省临时表空间 为刚刚创建的新临时表空间temp2<br />
&nbsp;&nbsp; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP2;</p>
<p>4.删除原来临时表空间<br />
&nbsp;&nbsp;&nbsp; DROP TABLESPACE TEMP_T INCLUDING CONTENTS AND DATAFILES;</p>
<p>5.重新创建临时表空间<br />
&nbsp; CREATE TEMPORARY TABLESPACE TEMP_T<br />
&nbsp;&nbsp; TEMPFILE 'D:\ORACLE\ORADATA\DB\DATAFILE\TEMP_T011.DBF' SIZE 10M</p>
<p>6.重置缺省临时表空间为新建的temp_t表空间<br />
&nbsp;&nbsp; ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP_T;</p>
<p>7.删除中转用临时表空间<br />
&nbsp;&nbsp; DROP TABLESPACE TEMP2 INCLUDING CONTENTS AND DATAFILES;</p>
<p>8.重新指定用户表空间为重建的临时表空间<br />
&nbsp;&nbsp; ALTER USER IDA TEMPORARY TABLESPACE TEMP_T;<br />
</p>
<img src ="http://www.blogjava.net/msmary/aggbug/191671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-04-09 14:53 <a href="http://www.blogjava.net/msmary/articles/191671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 函数应用</title><link>http://www.blogjava.net/msmary/articles/179141.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Sun, 03 Feb 2008 05:42:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/179141.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/179141.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/179141.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/179141.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/179141.html</trackback:ping><description><![CDATA[<div>
<h1><font size="3">1. nvl( ) 函数</font></h1>
<p><a href="http://jsjzx.yzu.edu.cn/jsjzx/jyn/wtm/vfphelp/lngnvllp_rpx.htm"><font color="#0000ff">示例</font></a> <a href="http://jsjzx.yzu.edu.cn/jsjzx/jyn/wtm/vfphelp/lngnvllp_rpsa.htm"><font color="#0000ff">请参阅</font></a></p>
<p>从两个表达式返回一个非 null 值。<br />
<br />
<strong>语法</strong><br />
<br />
NVL(eExpression1, eExpression2)<br />
<br />
<strong>参数</strong><br />
eExpression1, eExpression2<br />
<br />
如果 eExpression1 的计算结果为 null 值，则 NVL( ) 返回 eExpression2。如果 eExpression1 的计算结果不是 null 值，则返回 eExpression1。eExpression1 和 eExpression2 可以是任意一种数据类型。如果 eExpression1 与 eExpression2 的结果皆为 null 值，则 NVL( ) 返回 .NULL.。<br />
<br />
<strong>返回值类型</strong><br />
<br />
字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null 值<br />
<br />
<strong>说明</strong><br />
<br />
在不支持 null 值或 null 值无关紧要的情况下，可以使用 NVL( ) 来移去计算或操作中的 null 值。</p>
<p>select nvl(a.name,'空得') as name from&nbsp;student a join school b on a.ID=b.ID</p>
<p>注意：两个参数得类型要匹配</p>
<p><strong>2.TO_CHAR(date,'format')</strong><br />
SQL&gt; select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;</p>
<p>TO_CHAR(SYSDATE,'YY<br />
-------------------<br />
2004/05/09 21:14:41<br />
<br />
select TO_CHAR(1,'FM09') from dual&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result: 0<br />
<br />
</p>
<p>3.Oracle函数之substr</p>
<p>substr函数有三个参数，允许你将目标字符串的一部份输出，</p>
<p>第一个参数为目标字符串，</p>
<p>第二个字符串是将要输出的子串的起点，</p>
<p>第三个参数是将要输出的子串的长度。<br />
&nbsp;&nbsp;&nbsp; <br />
例子1：</p>
<p>substr('ABCDEFG',&nbsp;&nbsp; 2,&nbsp;&nbsp; 3)&nbsp;&nbsp; =&nbsp;&nbsp; 'BCD'&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
如果第二个参数为负数，那么将会从源串的尾部开始向前定位至负数的绝对值的位置。</p>
<p>例子2：</p>
<p>substr('ABCDEFG',&nbsp;&nbsp; -2)&nbsp;&nbsp; =&nbsp;&nbsp; 'FG' </p>
<p>substr('ABCDEFG',&nbsp;&nbsp; -4)&nbsp;&nbsp; =&nbsp;&nbsp; 'DEFG'</p>
<p><br />
&nbsp;4.Oracle 函数之round<br />
描述 : 传回一个数值，该数值是按照指定的小数位元数进行四舍五入运算的结果。 <br />
SELECT ROUND( number, [ decimal_places ] ) FROM DUAL <br />
参数: <br />
number : 欲处理之数值 <br />
decimal_places : 四舍五入 , 小数取几位 ( 预设为 0 ) <br />
Sample : <br />
select round(123.456, 0) from dual; 回传 123 <br />
select round(123.456, 1) from dual; 回传 123.5 <br />
select round(123.456, 2) from dual; 回传 123.46 <br />
不过最大长度不会超过16位<br />
SELECT ROUND(112211111111263.451,6) FROM DUAL;&nbsp;&nbsp; 回传112211111111263<br />
<br />
<br />
</p>
</div>
<img src ="http://www.blogjava.net/msmary/aggbug/179141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-02-03 13:42 <a href="http://www.blogjava.net/msmary/articles/179141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PL/SQL Developer 中文乱码解决</title><link>http://www.blogjava.net/msmary/articles/176948.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Tue, 22 Jan 2008 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/176948.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/176948.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/176948.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/176948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/176948.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>1。select * from v$nls_parameters<br />
查询nls的参数，获得数据库服务器端的字符编码<br />
NLS_LANGUAGE<br />
NLS_CHARACTERSET<br />
2。修改本地环境变量，设置<br />
NLS_LANG = SIMPLIFIED CHINESE.ZHS16GBK //这个是我们的数据库字符编码</p>
<p>NLS_LANG格式：<br />
NLS_LANG = language_territory.charset<br />
有三个组成部分（语言、地域和字符集），每个成分控制了NLS子集的特性。其中：language 指定服务器消息的语言。<br />
territory 指定服务器的日期和数字格式。<br />
charset 指定字符集 </p>
<p><strong><span style="font-family: 宋体">需要保证要设置客户端字符集与服务器端字符集一致</span></strong> </p>
<img src ="http://www.blogjava.net/msmary/aggbug/176948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-01-22 10:59 <a href="http://www.blogjava.net/msmary/articles/176948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle学习记录</title><link>http://www.blogjava.net/msmary/articles/176918.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Tue, 22 Jan 2008 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/176918.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/176918.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/176918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/176918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/176918.html</trackback:ping><description><![CDATA[<p>1.有关PL/SQL监听器的配置</p>
&nbsp;&nbsp;&nbsp; 监听器一般在下面情况下可以找到相应配置<br />
&nbsp;&nbsp; 如：C:\Oracle\Dev6i\NET80\ADMIN&nbsp;&nbsp; C:\DevSuiteHome_1\NETWORK\ADMIN<br />
&nbsp;其中有三个以ora作为后辍名的文件,分别是 sqlnet.ora、tnsnames.ora、listener.ora;它们的作用分别是:<br />
sqlnet.ora内容大致如下<br />
<p>SQLNET.AUTHENTICATION_SERVICES= (NTS)</p>
<p>NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, EZCONNECT, ONAMES, HOSTNAME)<br />
第一行是可以用计算机的名称默认登录，如果你的文件中没有这一行，则不能用计算机名登录，像我们在SQL*PLUS中，可以用这样SQL&gt;sqlplus / as sysdba 方式进行登录，/ 就代表以本机;<br />
第二行就是用数据库的用户名和密码进行登录。<br />
<br />
listener.ora就是你要登录本机数据库时的监听配置，当你要远程登录其它计算机的数据库时这个就不用；有这个你就得开启相应的监听服务程序。<br />
<br />
tnsnames.ora 的配置就是你用像PL/SQL登录数据库时，弹出的登录界面第三行可以选择的数据库名；我们可以在里面写多个连接远程数据库的代码段，当连接远程数据库时就不用开启本机的数据库服务和监听服务<br />
给段代码好明白<br />
<br />
VERSION9 =&nbsp;&nbsp; //自己命名的，显示在登录数据库时可选的数据名<br />
&nbsp; (DESCRIPTION =<br />
&nbsp;&nbsp;&nbsp; (ADDRESS_LIST =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = version9)(PORT = 1521))&nbsp;&nbsp;&nbsp; //host计算机名，port端口号<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; (CONNECT_DATA =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVICE_NAME = db)&nbsp;&nbsp;&nbsp;&nbsp; //db数据库名<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp; )<br />
<br />
2. Oracle数据导入导出 imp/exp<br />
功能：<a class="keyword" href="http://www.kehui.net/index.php?op=article&amp;action=keyword&amp;keyword=Oracle%CA%FD%BE%DD%B5%BC%C8%EB%B5%BC%B3%F6imp%2Fexp">Oracle数据导入导出imp/exp</a>就相当与oracle数据还原与备份。<br />
&nbsp;大多情况都可以用Oracle数据导入导出完成数据的备份和还原（不会造成数据的丢失）。<br />
&nbsp;查询服务器的字符集<br />
select * from nls_database_parameters t where t.parameter = 'NLS_CHARACTERSET'<br />
&nbsp; 如果 value=utf8<br />
&nbsp;&nbsp; 则设置客户端NLS_LANG=AMERICAN_AMERICA.UTF8<br />
&nbsp; 其它的字符集<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AMERICAN_AMERICA.WE8ISO8859P1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIMPLIFIED CHINESE_CHINA.ZHS16GBK</p>
<p>导出:<br />
&nbsp; exp scott/tiger tables=(s_region) file=d:\scott.dmp log=d:\scott.log<br />
导入:<br />
&nbsp;&nbsp;&nbsp; imp scott/tiger file=d:\scott.dmp tables=(s_region) ignore=y<br />
&nbsp;&nbsp;&nbsp; imp userid=dbown/dbown@db file=staff.dmp ignore=y log=staff_imp.log<br />
&nbsp; 我发现没有后面的ignore=y(忽略为yes)导入会有错,在数据库中查不到数据<br />
<br />
3. 管理数据</p>
<p style="text-indent: 2em">/*create index*/
<p style="text-indent: 2em">example:
<p style="text-indent: 2em">/*创建一般索引*/
<p style="text-indent: 2em">create index index_name on table_name(column_name) tablespace tablespace_name;
<p style="text-indent: 2em">/*创建位图索引*/
<p style="text-indent: 2em">create bitmap index index_name on table_name(column_name1,column_name2) tablespace tablespace_name;
<p style="text-indent: 2em">/*索引中不能用pctused*/
<p style="text-indent: 2em">create [bitmap] index index_name on table_name(column_name) tablespace tablespace_name pctfree 20 storage(inital 100k next 100k) ;
<p style="text-indent: 2em">/*大数据量的索引最好不要做日志*/
<p style="text-indent: 2em">create [bitmap] index index_name table_name(column_name1,column_name2) tablespace_name pctfree 20 storage(inital 100k next 100k) nologging;
<p style="text-indent: 2em">/*创建反转索引*/
<p style="text-indent: 2em">create index index_name on table_name(column_name) reverse;
<p style="text-indent: 2em">/*创建函数索引*/
<p style="text-indent: 2em">create index index_name on table_name(function_name(column_name)) tablespace tablespace_name;
<p style="text-indent: 2em">/*建表时创建约束条件*/
<p style="text-indent: 2em">create table user.table_name(column_name number(7) constraint constraint_name primary key deferrable using index storage(initial 100k next 100k) tablespace tablespace_name,column_name2 varchar2(25) constraint constraint_name not null,column_name3 number(7)) tablespace tablespace_name;
<p style="text-indent: 2em">/*给创建bitmap index分配的内存空间参数，以加速建索引*/
<p style="text-indent: 2em">show parameter create_bit;
<p style="text-indent: 2em">/*改变索引的存储参数*/
<p style="text-indent: 2em">alter index index_name pctfree 30 storage(initial 200k next 200k);
<p style="text-indent: 2em">/*给索引手工分配一个分区*/
<p style="text-indent: 2em">alter index index_name allocate extent (size 200k datafile '$ORACLE/oradata/..');
<p style="text-indent: 2em">/*释放索引中没用的空间*/
<p style="text-indent: 2em">alter index index_name deallocate unused;
<p style="text-indent: 2em">/*索引重建*/
<p style="text-indent: 2em">alter index index_name rebuild tablespace tablespace_name;
<p style="text-indent: 2em">/*普通索引和反转索引的互换*/
<p style="text-indent: 2em">alter index index_name rebuild tablespace tablespace_name reverse;
<p style="text-indent: 2em">/*重建索引时，不锁表*/
<p style="text-indent: 2em">alter index index_name rebuild online;
<p style="text-indent: 2em">/*给索引整理碎片*/
<p style="text-indent: 2em">alter index index_name COALESCE;
<p style="text-indent: 2em">/*分析索引,事实上是更新统计的过程*/
<p style="text-indent: 2em">analyze index index_name validate structure;
<p style="text-indent: 2em">desc index_state;
<p style="text-indent: 2em">drop index index_name;
<p style="text-indent: 2em">alter index index_name monitoring usage;-----监视索引是否被用到
<p style="text-indent: 2em">alter index index_name nomonitoring usage;----取消监视
<p style="text-indent: 2em">/*有关索引信息的视图*/
<p style="text-indent: 2em">select * from dba_indexes/dba_ind_columns/dbs_ind_expressions/v$object_usage;
<p style="text-indent: 2em">########## 数据完整性的管理(Maintaining data integrity) ##########
<p style="text-indent: 2em">alter table table_name drop constraint constraint_name;----drop 约束
<p style="text-indent: 2em">alter table table_name add constraint constraint_name primary key(column_name1,column_name2);-----创建主键
<p style="text-indent: 2em">alter table table_name add constraint constraint_name unique(column_name1,column_name2);---创建唯一约束
<p style="text-indent: 2em">/*创建外键约束*/
<p style="text-indent: 2em">alter table table_name add constraint constraint_name foreign key(column_name1) references table_name(column_name1);
<p style="text-indent: 2em">/*不效验老数据，只约束新的数据[enable/disable：约束/不约束新数据;novalidate/validate:不对/对老数据进行验证]*/
<p style="text-indent: 2em">alter table table_name add constraint constraint_name check(column_name like 'B%') enable/disable novalidate/validate;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select 'ALTER TABLE '||TABLE_NAME||' MODIFY CONSTRAINT '||CONSTRAINT_NAME||' ENABLE&nbsp;&nbsp; NOVALIDATE;'<br />
FROM USER_CONSTRAINTS<br />
WHERE TABLE_NAME IN ('STAFFBASE','STAFFCLAIM','STAFFJOB','STAFFPAY','STAFFREF','STAFFTIME','STAFF')<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*修改约束条件，延时验证，commit时验证*/
<p style="text-indent: 2em">alter table table_name modify constraint constraint_name initially deferred;
<p style="text-indent: 2em">/*修改约束条件，立即验证*/
<p style="text-indent: 2em">alter table table_name modify constraint constraint_name initially immediate;
<p style="text-indent: 2em">alter session set constraints=deferred/immediate;
<p style="text-indent: 2em">/*drop一个有外键的主键表,带cascade constraints参数级联删除*/
<p style="text-indent: 2em">drop table table_name cascade constraints;
<p style="text-indent: 2em">/*当truncate外键表时，先将外键设为无效，再truncate;*/
<p style="text-indent: 2em">truncate table table_name;
<p style="text-indent: 2em">/*设约束条件无效*/
<p style="text-indent: 2em">alter table table_name disable constraint constraint_name;
<p style="text-indent: 2em">alter table table_name enable novalidate constraint constraint_name;
<p style="text-indent: 2em">/*将无效约束的数据行放入exception的表中，此表记录了违反数据约束的行的行号；在此之前，要先建exceptions表*/
<p style="text-indent: 2em">alter table table_name add constraint constraint_name check(column_name &gt;;15) enable validate exceptions into exceptions;
<p style="text-indent: 2em">/*运行创建exceptions表的脚本*/
<p style="text-indent: 2em">start $ORACLE_HOME/rdbms/admin/utlexcpt.sql;
<p style="text-indent: 2em">/*获取约束条件信息的表或视图*/
<p style="text-indent: 2em">select * from user_constraints/dba_constraints/dba_cons_columns; <br />
4.Devloper Form 6i 中导入Java类出现 <br />
&nbsp;&nbsp; PDE-UJI002: Unable to find required Java importer classes 问题的解决方案<br />
&nbsp;设置classpath=.;C:\orant\TOOLS\COMMON60\JAVA\IMPORTER.JAR<br />
</p>
<p><br />
5.数据库文件<br />
a.查询数据文件<br />
&nbsp; SELECT * FROM DBA_TABLESPAC<br />
b.查看表空间的空余大小<br />
&nbsp;&nbsp; SELECT TABLESPACE_NAME,SUM(BYTES/1024/1024) MB FROM DBA_FREE_SPACE GROUP BY&nbsp;<br />
TABLESPACE_NAME;<br />
c.&nbsp; 查看数据文件存放路径<br />
&nbsp; SELECT TABLESPACE_NAME,BYTES/1024/1024 FILE_SIZE_MB,FILE_NAME FROM DBA_DATA_FILES;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/msmary/aggbug/176918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-01-22 10:03 <a href="http://www.blogjava.net/msmary/articles/176918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>listener.ora--sqlnet.ora--tnsnames.ora的关系以及手工配置举例</title><link>http://www.blogjava.net/msmary/articles/174464.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 10 Jan 2008 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/174464.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/174464.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/174464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/174464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/174464.html</trackback:ping><description><![CDATA[以下内容来之Internet，不知道原作者是哪位了，非常感谢作者的总结。<br />
<br />
版权归原作者。<br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
最近看到好多人说到tns或者数据库不能登录等问题，就索性总结了下面的文档。<br />
　　<br />
　　首先来说Oracle的网络结构，往复杂处说能加上加密、LDAP等等。。这里不做讨论，重点放在基本的网络结构也就是我们最常用的这种情况<br />
　　<br />
　　三个配置文件<br />
　　<br />
　　listener.ora、sqlnet.ora、tnsnames.ora ，都是放在$ORACLE_HOME\network\admin目录下。<br />
　　<br />
　　重点:三个文件的作用和使用<br />
　　<br />
　　#-----------------------<br />
　　<br />
　　sqlnet.ora-----作用类似于linux或者其他unix的nsswitch.conf文件，通过这个文件来决定怎么样找一个连接中出现的连接字符串，<br />
　　<br />
　　例如我们客户端输入<br />
　　<br />
　　sqlplus sys/oracle@orcl<br />
　　<br />
　　假如我的sqlnet.ora是下面这个样子<br />
　　<br />
　　SQLNET.AUTHENTICATION_SERVICES= (NTS)<br />
　　<br />
　　NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)<br />
　　<br />
　　那么，客户端就会首先在tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名，通过网络的途径去解析它的ip地址然后去连接这个ip上GLOBAL_DBNAME=orcl这个实例，当然我这里orcl并不是一个主机名<br />
　　<br />
　　如果我是这个样子<br />
　　<br />
　　NAMES.DIRECTORY_PATH= (TNSNAMES)<br />
　　<br />
　　那么客户端就只会从tnsnames.ora查找orcl的记录<br />
　　<br />
　　括号中还有其他选项，如LDAP等并不常用。<br />
　　<br />
　　#------------------------<br />
　　<br />
　　Tnsnames.ora------这个文件类似于unix 的<a href="http://www.yesky.com/key/844/5844.html" target="_blank">hosts</a>文件，提供的tnsname到主机名或者ip的对应，只有当sqlnet.ora中类似<br />
　　<br />
　　NAMES.DIRECTORY_PATH= (TNSNAMES) 这样，也就是客户端解析连接字符串的顺序中有TNSNAMES是，才会尝试使用这个文件。<br />
　　<br />
　　例子中有两个，ORCL 对应的本机，SALES对应的另外一个IP地址，里边还定义了使用主用服务器还是共享服务器模式进行连接，一句一句说<br />
　　<br />
　　#你所要连接的时候输入得TNSNAME<br />
　　<br />
　　ORCL =<br />
　　<br />
　　(DESCRIPTION =<br />
　　<br />
　　(ADDRESS_LIST =<br />
　　<br />
　　#下面是这个TNSNAME对应的主机，端口，协议<br />
　　<br />
　　(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))<br />
　　<br />
　　)<br />
　　<br />
　　(CONNECT_DATA =<br />
　　<br />
　　#使用专用服务器模式去连接需要跟服务器的模式匹配，如果没有就根据服务器的模式<br />
　　<br />
　　#自动调节<br />
　　<br />
　　(SERVER = DEDICATED)<br />
　　<br />
　　#对应service_name，SQLPLUS&gt;show <a href="http://www.yesky.com/key/567/595567.html" target="_blank">parameter</a> service_name;<br />
　　<br />
　　#进行查看<br />
　　<br />
　　(SERVICE_NAME = orcl)<br />
　　<br />
　　)<br />
　　<br />
　　)<br />
　　<br />
　　#下面这个类似<br />
　　<br />
　　SALES =<br />
　　<br />
　　(DESCRIPTION =<br />
　　<br />
　　(ADDRESS_LIST =<br />
　　<br />
　　(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))<br />
　　<br />
　　)<br />
　　<br />
　　(CONNECT_DATA =<br />
　　<br />
　　(SERVER = DEDICATED)<br />
　　<br />
　　(SERVICE_NAME = sales)<br />
　　<br />
　　)<br />
　　<br />
　　)<br />
　　<br />
　　#----------------------<br />
　　<br />
　　客户端完了我们来看服务器端<br />
　　<br />
　　listener.ora------listener监听器进程的配置文件<br />
　　<br />
　　关于listener进程就不多说了，接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接，listener进程就不是必需的，同样的如果关闭listener进程并不会影响已经存在的数据库连接。<br />
　　<br />
　　Listener.ora文件的例子<br />
　　<br />
　　#listener.ora Network <a href="http://www.yesky.com/key/3428/8428.html" target="_blank">Configuration</a> File: #E:\oracle\product\10.1.0\Db_2\NETWORK\ADMIN\listener.ora<br />
　　<br />
　　# Generated by Oracle configuration tools.<br />
　　<br />
　　#下面定义LISTENER进程为哪个实例提供服务<br />
　　<br />
　　#这里是ORCL，并且它对应的ORACLE_HOME和GLOBAL_DBNAME<br />
　　<br />
　　#其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做数据库连接<br />
　　<br />
　　SID_LIST_LISTENER =<br />
　　<br />
　　(SID_LIST =<br />
　　<br />
　　(SID_DESC =<br />
　　<br />
　　(GLOBAL_DBNAME = boway)<br />
　　<br />
　　(ORACLE_HOME = E:\oracle\product\10.1.0\Db_2)<br />
　　<br />
　　(SID_NAME = ORCL)<br />
　　<br />
　　)<br />
　　<br />
　　)<br />
　　<br />
　　#监听器的名字，一台数据库可以有不止一个监听器<br />
　　<br />
　　#再向下面是监听器监听的协议，ip，端口等，这里使用的tcp1521端口，并且使#用的是主机名<br />
　　<br />
　　LISTENER =<br />
　　<br />
　　(DESCRIPTION =<br />
　　<br />
　　(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))<br />
　　<br />
　　)<br />
　　<br />
　　上面的例子是一个最简单的例子，但也是最普遍的。一个listener进程为一个<a href="http://www.yesky.com/key/464/595464.html" target="_blank">instance</a>(SID)提供服务。<br />
　　<br />
　　监听器的操作命令<br />
　　<br />
　　$ORACLE_HOME/<a href="http://www.yesky.com/key/3442/8442.html" target="_blank">bin</a>/lsnrctl start,其他诸如stop,status等。具体敲完一个lsnrctl后看帮助。<br />
　　<br />
　　上面说到的三个文件都可以通过图形的配置工具来完成配置<br />
　　<br />
　　$ORACLE_HOME/netca 向导形式的<br />
　　<br />
　　$ORACLE_HOME/netmgr<br />
　　<br />
　　本人比较习惯netmgr,<br />
　　<br />
　　profile 配置的是sqlnet.ora也就是名称解析的方式<br />
　　<br />
　　service name 配置的是tnsnames.ora文件<br />
　　<br />
　　listeners配置的是listener.ora文件，即监听器进程<br />
　　<br />
　　具体的配置可以尝试一下然后来看一下配置文件。<br />
　　<br />
　　这样一来总体结构就有了，是当你输入sqlplus sys/oracle@orcl的时候<br />
　　<br />
　　1. 查询sqlnet.ora看看名称的解析方式，发现是TNSNAME<br />
　　<br />
　　2. 则查询tnsnames.ora文件，从里边找orcl的记录，并且找到主机名，端口和service_name<br />
　　<br />
　　3. 如果listener进程没有问题的话，建立与listener进程的连接。<br />
　　<br />
　　4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式，listener采取接下去的动作。默认是专用服务器模式，没有问题的话客户端就连接上了数据库的server process。<br />
　　<br />
　　5. 这时候网络连接已经建立，listener进程的历史使命也就完成了。<br />
<br />
#---------------<br />
　　<br />
　　几种连接用到的命令形式<br />
　　<br />
　　1.sqlplus / as sysdba 这是典型的操作系统认证，不需要listener进程<br />
　　<br />
　　2.sqlplus sys/oracle 这种连接方式只能连接本机数据库，同样不需要listener进程<br />
　　<br />
　　3.sqlplus sys/oracle@orcl 这种方式需要listener进程处于可用状态。最普遍的通过网络连接。<br />
　　<br />
　　以上连接方式使用sys用户或者其他通过密码文件验证的用户都不需要数据库处于可用状态，操作系统认证也不需要数据库可用，普通用户因为是数据库认证，所以数据库必需处于open状态。<br />
　　<br />
　　然后就是<br />
　　<br />
　　#-------------<br />
　　<br />
　　平时排错可能会用到的<br />
　　<br />
　　1.lsnrctl status查看服务器端listener进程的状态<br />
　　<br />
　　LSNRCTL&gt; help<br />
　　<br />
　　The following operations are available<br />
　　<br />
　　An asterisk (*) denotes a modifier or extended command:<br />
　　<br />
　　start stop status<br />
　　<br />
　　services version reload<br />
　　<br />
　　save_config trace change_password<br />
　　<br />
　　quit exit set*<br />
　　<br />
　　show*<br />
　　<br />
　　LSNRCTL&gt; status<br />
　　<br />
　　2.tnsping 查看客户端sqlnet.ora和tnsname.ora文件的配置正确与否，及对应的服务器的listener进程的状态。<br />
　　<br />
　　C:\&gt;tnsping orcl<br />
　　<br />
　　TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 - Production on 16-8月 -<br />
　　<br />
　　2005 09:36:08<br />
　　<br />
　　Copyright (c) 1997, 2003, Oracle. All rights reserved.<br />
　　<br />
　　Used parameter files:<br />
　　<br />
　　E:\oracle\product\10.1.0\Db_2\network\admin\sqlnet.ora<br />
　　<br />
　　Used TNSNAMES adapter to resolve the alias<br />
　　<br />
　　Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)<br />
　　<br />
　　(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_<br />
　　<br />
　　NAME = orcl)))<br />
　　<br />
　　OK (20 msec)<br />
　　<br />
　　3.<br />
　　<br />
　　SQL&gt;show sga 查看instance是否已经启动<br />
　　<br />
　　SQL&gt; select open_mode from v$database; 查看数据库是打开还是mount状态。<br />
　　<br />
　　OPEN_MODE<br />
　　<br />
　　----------<br />
　　<br />
　　READ WRITE<br />
　　<br />
　　#-----------------<br />
　　<br />
　　使用hostname访问数据库而不是tnsname的例子<br />
　　<br />
　　使用tnsname访问数据库是默认的方式，但是也带来点问题，那就是客户端都是需要配置tnsnames.ora文件的。如果你的数据库服务器地址发生改变，就需要重新编辑客户端这个文件。通过hostname访问数据库就没有了这个麻烦。<br />
　　<br />
　　需要修改<br />
　　<br />
　　服务器端listener.ora<br />
　　<br />
　　#监听器的配置文件listener.ora<br />
　　<br />
　　#使用host naming则不再需要tnsname.ora文件做本地解析<br />
　　<br />
　　# listener.ora Network Configuration File: d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\listener.ora<br />
　　<br />
　　# Generated by Oracle configuration tools.<br />
　　<br />
　　SID_LIST_LISTENER =<br />
　　<br />
　　(SID_LIST =<br />
　　<br />
　　(SID_DESC =<br />
　　<br />
　　# (SID_NAME = PLSExtProc)<br />
　　<br />
　　(SID_NAME = orcl)<br />
　　<br />
　　(GLOBAL_DBNAME = boway)<br />
　　<br />
　　(ORACLE_HOME = d:\oracle\product\10.1.0\db_1)<br />
　　<br />
　　# (PROGRAM = extproc)<br />
　　<br />
　　)<br />
　　<br />
　　)<br />
　　<br />
　　LISTENER =<br />
　　<br />
　　(DESCRIPTION_LIST =<br />
　　<br />
　　(DESCRIPTION =<br />
　　<br />
　　(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))<br />
　　<br />
　　)<br />
　　<br />
　　(DESCRIPTION =<br />
　　<br />
　　(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))<br />
　　<br />
　　)<br />
　　<br />
　　)<br />
　　<br />
　　客户端sqlnet.ora 如果确认不会使用TNSNAME访问的话，可以去掉TNSNAMES<br />
　　<br />
　　# sqlnet.ora Network Configuration File: d:\oracle\product\10.1.0\db_1\NETWORK\ADMIN\sqlnet.ora<br />
　　<br />
　　# Generated by Oracle configuration tools.<br />
　　<br />
　　SQLNET.AUTHENTICATION_SERVICES= (NTS)<br />
　　<br />
　　NAMES.DIRECTORY_PATH= (HOSTNAME)<br />
　　<br />
　　Tnsnames.ora文件不需要配置，删除也无所谓。<br />
　　<br />
　　下面就是网络和操作系统的配置问题了，怎么样能够解析我的主机名的问题了<br />
　　<br />
　　可以通过下面的方式连接<br />
　　<br />
　　sqlplus sys/oracle@boway<br />
　　<br />
　　这样的话，会连接boway这台服务器，并且listener来确定你所要连接的service_name。<br />
<img src ="http://www.blogjava.net/msmary/aggbug/174464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-01-10 22:58 <a href="http://www.blogjava.net/msmary/articles/174464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JasperReports是一个开源的java报表制作引擎</title><link>http://www.blogjava.net/msmary/articles/174260.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Thu, 10 Jan 2008 05:43:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/174260.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/174260.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/174260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/174260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/174260.html</trackback:ping><description><![CDATA[<div class="blog_content"><span class="hilite1">JasperReports</span>是一个开源的java报表制作引擎<br />
<a href="http://jasperreports.sourceforge.net/" target="_blank">http://<span class="hilite1">jasperreports</span>.sourceforge.net</a><br />
<br />
iReport是<span class="hilite1">JasperReports</span>的一个GUI工具，用来生成<span class="hilite1">JasperReports</span>的jrxml文件。<br />
<a href="http://ireport.sourceforge.net/" target="_blank">http://ireport.sourceforge.net</a><br />
<br />
<br />
<br />
首先使用iReport制作报表的模板（我自己起的名词）：<br />
<br />
&nbsp;&nbsp;&nbsp; 运行iReport，新建一个report。<br />
&nbsp;&nbsp;&nbsp; 在Title band中输入报表的名称，好象使用pageheader band也可以，目前我还没有弄明白2者具体的差别。<br />
&nbsp;&nbsp;&nbsp; 在column header band中放置一些static text，做为报表的列标题。<br />
&nbsp;&nbsp;&nbsp; 在detal band中放入一些textfield，显示报表的详细数据。<br />
&nbsp;&nbsp;&nbsp; 在summary band中放入类似于"合计"之类的textfield，这个band是显示在最后一行数据的下放。<br />
&nbsp;&nbsp;&nbsp; 在LastPageFooter band中放入想在最后一页显示的信息，比如说"审阅人签名"之类的。<br />
<br />
这样报表的框架就基本上搭好了，然后compile一下检查是否有错误，如果没有错误那么就可以在程序中使用这个报表模板了。<br />
<br />
<span class="hilite1">JasperReports</span>介绍：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 使用<span class="hilite1">JasperReports</span>生成报表是非常简单的，仅仅使用net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>包中的几个类即可完成报表的生成、预览、打印、导出等各个功能。<br />
<br />
1.&nbsp; net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.JasperCompileManager类。<br />
&nbsp;&nbsp;&nbsp; 使用这个类的几个静态方法即可完成对报表的编译工作（具体参见api文档）<br />
&nbsp;&nbsp;&nbsp; 编译完成后可以JasperCompileManager有两种处理方式：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 1&gt; 返回一个JasperReport对象<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 2&gt; 在.jrxml文件所在的目录生成一个.jasper文件<br />
&nbsp;&nbsp;&nbsp; 这两种方式是由程序员自己选择的。不过我比较倾向使用.jasper文件，毕竟报表的结构不是每天都在改动，所以每次重新编译报表并不是很划算。<br />
<br />
2.&nbsp; net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.JasperFillManager类<br />
&nbsp;&nbsp;&nbsp; 这个类的作用是用数据填充报表。它可以使用JasperReport对象也可以使用。jasper文件做为报表模板。<br />
&nbsp;&nbsp;&nbsp; 它同样有2中处理方式：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&gt; 返回一个JsaperPrint对象。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 2&gt; 在.jasper文件所在目录生成一个.jrprint文件<br />
&nbsp;&nbsp;&nbsp; 这个类使用net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.JRDataSource接口的实现做为数据源。任何实现了JRDataSource的类均可做为数据源使用<br />
&nbsp;&nbsp;&nbsp; 在net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.data包中定义了一些数据源，可根据自己的需要选择。这里我使用的是<font size="+0">JRTableModelDataSource做为<br />
&nbsp;&nbsp;&nbsp; 数据源（因为我的报表还要显示在Table中）。<br />
<br />
3. net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.JasperPrintManager和net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.JasperExportManager<br />
&nbsp;&nbsp; 者两个类的作用是打印、导出报表<br />
&nbsp;&nbsp; 他们使用 JasperPrint 和 .jrprint文件做为输入。<br />
&nbsp;&nbsp; 可以根据自己的需要使用里面的方法。<br />
<br />
</font>例：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; import net.sf.<span class="hilite1">jasperreports</span>.<span class="hilite2">engine</span>.*;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; import net.sf.<span class="hilite1">jasperreports</span>.view.*;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public class CompileReport {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; //编译report.jrxml并在report.jrxml所在的目录中生成report.jasper文件<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; JasperCompileManager.compileReportToFile("report.jrxml");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; //填充数据，这里使用的是JREmptyDataSource<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; JasperFillManager.fillReportToFile("report.jasper", null, new JREmptyDataSource(50));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; //预览报表，false代表不是使用xml文件。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; JasperViewer view = new JasperViewer("reports.jrprint", false);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; view.pack();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; view.setVisible(true);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; e.printStackTrace()<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br />
</div>
<img src ="http://www.blogjava.net/msmary/aggbug/174260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2008-01-10 13:43 <a href="http://www.blogjava.net/msmary/articles/174260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle 日期函数 </title><link>http://www.blogjava.net/msmary/articles/168612.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Tue, 18 Dec 2007 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/168612.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/168612.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/168612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/168612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/168612.html</trackback:ping><description><![CDATA[在oracle数据库的开发中，常因为时间的问题大费周章，所以特地将ORACLE数据的日期函数收藏致此。乃供
<p>他日所查也。<br />
&nbsp; add_months(d,n) 日期d加n个月<br />
&nbsp; last_day(d) 包含d的月?的最后一天的日期<br />
&nbsp; new_time(d,a,b) a?区的日期和??d在b?区的日期和??<br />
&nbsp; next_day(d,day) 比日期d?，由day指定的周几的日期<br />
&nbsp; sysdate 当前的系?日期和??<br />
&nbsp; greatest(d1,d2,...dn) ?出的日期列表中最后的日期<br />
&nbsp; least(d1,k2,...dn) ?出的日期列表中最早的日期<br />
&nbsp; to_char(d [,fmt]) 日期d按fmt指定的格式??成字符串<br />
&nbsp; to_date(st [,fmt]) 字符串st按fmt指定的格式?成日期?，若fmt忽略，st要用缺省格式<br />
&nbsp; round(d [,fmt]) 日期d按fmt指定格式舍入到最近的日期<br />
&nbsp; trunc(d [,fmt]) 日期d按fmt指定格式截断到最近的日期 <br />
&nbsp; to_date 字符串类型转为换日期类型 <br />
字符串中的相应位置上的字符,必须符合时间范围的限制 </p>
<p>查询Oracle日期格式 <br />
----------------------------------</p>
<p><br />
select * from nls_database_parameters; </p>
<p><br />
得到结果如下表: 表中NLS_DATE_FORMAT表示日期格式.<br />
PARAMETER VALUE <br />
----------------------------------- ----------------------------------- <br />
NLS_LANGUAGE AMERICAN <br />
NLS_TERRITORY AMERICA <br />
NLS_CURRENCY $ <br />
NLS_ISO_CURRENCY AMERICA <br />
NLS_NUMERIC_CHARACTERS ., <br />
NLS_CHARACTERSET ZHS16GBK <br />
NLS_CALENDAR GREGORIAN <br />
NLS_DATE_FORMAT DD-MON-RR <br />
NLS_DATE_LANGUAGE AMERICAN <br />
NLS_SORT&nbsp; BINARY <br />
NLS_TIME_FORMAT HH.MI.SSXFF AM <br />
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM <br />
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM <br />
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM <br />
NLS_DUAL_CURRENCY $ <br />
NLS_COMP&nbsp; BINARY <br />
NLS_NCHAR_CHARACTERSET ZHS16GBK <br />
NLS_RDBMS_VERSION 8.1.7.0.0 </p>
<p>或者查询V$NLS_PARAMETERS表,<br />
select * from V$NLS_PARAMETERS;<br />
也有类似结果</p>
<p>SQL&gt;select to_date('2004-11-12 12-07-32','yyyy-mm-dd hh24-mi-ss') value from dual; <br />
VALUE <br />
------------------- <br />
2004.11.12 12:07:32 </p>
<p>SQL&gt;select to_date('20041015') value from dual; <br />
VALUE <br />
------------------- <br />
2004.10.15 00:00:00 </p>
<p>SQL&gt;select to_date('20041315') value from dual; <br />
ERROR 位于第 1 行: <br />
ORA-01861: 文字与格式字符串不匹配 </p>
<p><br />
sysdate 当前日期和时间 </p>
<p>SQL&gt;select sysdate value from dual; <br />
VALUE <br />
------------------- <br />
2003.11.23 17:09:01 </p>
<p><br />
last_day 本月最后一天 </p>
<p>SQL&gt;select last_day(sysdate) value from dual; <br />
VALUE <br />
------------------- <br />
2003.11.30 17:08:17 </p>
<p><br />
add_months(d,n) 日期d后推n个月 </p>
<p>SQL&gt;select add_months(sysdate,2) value from dual; <br />
VALUE <br />
------------------- <br />
2005.01.23 17:10:21 </p>
<p><br />
next_day(d,day) 日期d之后的第一周中,指定的那天(指定星期的第几天)是什么日期 </p>
<p>SQL&gt;select next_day(sysdate,1) value from dual; <br />
VALUE <br />
------------------- <br />
2004.11.28 17:38:55 </p>
<p>&nbsp;</p>
<p><br />
[oracle/plsql]oracle日期处理完全版</p>
<p>日期处理完全版 <br />
TO_DATE格式 <br />
Day: <br />
dd number 12 <br />
dy abbreviated fri <br />
day spelled out friday <br />
ddspth spelled out, ordinal twelfth <br />
Month: <br />
mm number 03 <br />
mon abbreviated mar <br />
month spelled out march <br />
Year: <br />
yy two digits 98 <br />
yyyy four digits 1998 </p>
<p>24小时格式下时间范围为： 0:00:00 - 23:59:59.... <br />
12小时格式下时间范围为： 1:00:00 - 12:59:59 .... <br />
1. <br />
日期和字符转换函数用法（to_date,to_char） </p>
<p>2. <br />
select to_char( to_date(222,'J'),'Jsp') from dual </p>
<p>显示Two Hundred Twenty-Two </p>
<p>3. <br />
求某天是星期几 <br />
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; <br />
星期一 <br />
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from </p>
<p>dual; <br />
monday <br />
设置日期语言 <br />
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; <br />
也可以这样 <br />
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') </p>
<p>4. <br />
两个日期间的天数 <br />
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual; </p>
<p>5. 时间为null的用法 <br />
select id, active_date from table1 <br />
UNION <br />
select 1, TO_DATE(null) from dual; </p>
<p>注意要用TO_DATE(null) </p>
<p>6. <br />
a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') <br />
那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 <br />
所以，当时间需要精确的时候，觉得to_char还是必要的 <br />
7. 日期格式冲突问题 <br />
输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' <br />
alter system set NLS_DATE_LANGUAGE = American <br />
alter session set NLS_DATE_LANGUAGE = American <br />
或者在to_date中写 <br />
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from </p>
<p>dual; <br />
注意我这只是举了NLS_DATE_LANGUAGE，当然还有很多， <br />
可查看 <br />
select * from nls_session_parameters <br />
select * from V$NLS_PARAMETERS </p>
<p>8. <br />
select count(*) <br />
from ( select rownum-1 rnum <br />
from all_objects <br />
where rownum &lt;= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- <br />
02-01','yyyy-mm-dd')+1 <br />
) <br />
where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) <br />
not <br />
in ( '1', '7' ) </p>
<p>查找2002-02-28至2002-02-01间除星期一和七的天数 <br />
在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒). </p>
<p>9. <br />
select months_between(to_date('01-31-1999','MM-DD-YYYY'), <br />
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; <br />
1 </p>
<p>select months_between(to_date('02-01-1999','MM-DD-YYYY'), <br />
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; </p>
<p>1.03225806451613 <br />
10. Next_day的用法 <br />
Next_day(date, day) </p>
<p>Monday-Sunday, for format code DAY <br />
Mon-Sun, for format code DY <br />
1-7, for format code D </p>
<p>11 <br />
select to_char(sysdate,'hh:mi:ss') TIME from all_objects <br />
注意：第一条记录的TIME 与最后一行是一样的 <br />
可以建立一个函数来处理这个问题 <br />
create or replace function sys_date return date is <br />
begin <br />
return sysdate; <br />
end; </p>
<p>select to_char(sys_date,'hh:mi:ss') from all_objects; <br />
12. <br />
获得小时数 </p>
<p>SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer <br />
SQL&gt; select sysdate ,to_char(sysdate,'hh') from dual; </p>
<p>SYSDATE TO_CHAR(SYSDATE,'HH') <br />
-------------------- --------------------- <br />
2003-10-13 19:35:21 07 </p>
<p>SQL&gt; select sysdate ,to_char(sysdate,'hh24') from dual; </p>
<p>SYSDATE TO_CHAR(SYSDATE,'HH24') <br />
-------------------- ----------------------- <br />
2003-10-13 19:35:21 19 </p>
<p>获取年月日与此类似 <br />
13. <br />
年月日的处理 <br />
select older_date, <br />
newer_date, <br />
years, <br />
months, <br />
abs( <br />
trunc( <br />
newer_date- <br />
add_months( older_date,years*12+months ) <br />
) <br />
) days <br />
from ( select <br />
trunc(months_between( newer_date, older_date )/12) YEARS, <br />
mod(trunc(months_between( newer_date, older_date )), <br />
12 ) MONTHS, <br />
newer_date, <br />
older_date <br />
from ( select hiredate older_date, <br />
add_months(hiredate,rownum)+rownum newer_date <br />
from emp ) <br />
) </p>
<p>14. <br />
处理月份天数不定的办法 <br />
select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual </p>
<p>16. <br />
找出今年的天数 <br />
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual </p>
<p>闰年的处理方法 <br />
to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' ) <br />
如果是28就不是闰年 </p>
<p>17. <br />
yyyy与rrrr的区别 <br />
'YYYY99 TO_C <br />
------- ---- <br />
yyyy 99 0099 <br />
rrrr 99 1999 <br />
yyyy 01 0001 <br />
rrrr 01 2001 </p>
<p>18.不同时区的处理 <br />
select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate <br />
from dual; </p>
<p>19. <br />
5秒钟一个间隔 <br />
Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') <br />
from dual </p>
<p>2002-11-1 9:55:00 35786 <br />
SSSSS表示5位秒数 </p>
<p>20. <br />
一年的第几天 <br />
select TO_CHAR(SYSDATE,'DDD'),sysdate from dual <br />
310 2002-11-6 10:03:51 </p>
<p>21.计算小时,分,秒,毫秒 <br />
select <br />
Days, <br />
A, <br />
TRUNC(A*24) Hours, <br />
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes, <br />
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds, <br />
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds <br />
from <br />
( <br />
select <br />
trunc(sysdate) Days, <br />
sysdate - trunc(sysdate) A <br />
from dual <br />
) </p>
<p><br />
select * from tabname <br />
order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss'); </p>
<p>// <br />
floor((date2-date1) /365) 作为年 <br />
floor((date2-date1, 365) /30) 作为月 <br />
mod(mod(date2-date1, 365), 30)作为日. <br />
23.next_day函数 <br />
next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 </p>
<img src ="http://www.blogjava.net/msmary/aggbug/168612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-12-18 23:15 <a href="http://www.blogjava.net/msmary/articles/168612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle开发工具介绍</title><link>http://www.blogjava.net/msmary/articles/168313.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Mon, 17 Dec 2007 12:18:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/168313.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/168313.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/168313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/168313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/168313.html</trackback:ping><description><![CDATA[Oracle工具家族手册<br />
　　<img src="http://oracle.chinaitlab.com/imgfiles/2002.12.13.12.5.35.tool.gif"  alt="" /> <br />
　　Oracle Designer<br />
　　一个基于共享信息仓储的建模和生成工具，设计和建立应用与数椐库定义的高效开发环境。<br />
　　Oracle Developer<br />
　　一个用于建立企业级客户/服务器和Web数椐库应用的、易于使用的集成式快速应用开发环（RAD）。<br />
　　Oracle JDeveloper<br />
　　在个利用java来建立基于部件的数椐库应用的最具生产力的开发环境。<br />
　　Oracle Reporls<br />
　　一个用于发布和报告的解决方案，部门可以利用它在其企业内部网或Internet上动态地发布信息。<br />
　　网络计算工具<br />
　　Oracle?的开发工具能为你提供最具生产力的数椐库应用开发环境。这些应用可以部署在可伸缩的专业管理服务器上，并能通过任何一台运行有标准Interner浏览器的PC或NC来访问。<br />
　　高生产力<br />
　　Oracle开发工具利用基于模型的方法设计和实现实际应用，多用户、共享式的Oracle信息仓储为业务、应用模型和规则提供了一个中央存储场地。应用再根椐这些模型自动生成，避免了应用彩不兼容的工具和语言通过手工来编制，造成可重用性低，低质量、高维护的系统。彩业务模型生成的应用，易维护、易调试、高质量，并且可以分布在客户/服务器用网络计算（Interner computing）应用方式下。<br />
　　<br />
　　基于服务器的部署<br />
　　客户/服务器体系结构要求应用安装在第一个卓面机上，这使得安装和管理成本大大的增加。而且，对于网络具有甚高的要求，使通过广域网（WAN）或Internet来使用应用不现实。<br />
　　<br />
　　利用Oracle开发工具所构造的数椐库应用可以部署在伸缩性很强的专业管理应用服务器上，采用基于服务器的部署方式，在服务器上集中管理应用并按需将应用下载到瘦客户机上，从而使上述问题得以圆满解决，无需管理员管理，从而大大降低了成本。任何运行有标准 Internet浏览器的PC或NC都可以访问这些应用，甚至通过非常窄的网络带宽也能顺利进行。<br />
　　<br />
　　充分利用Oracle平台<br />
　　Oracle工具采用了与数椐库相同的语言，它允许对应用进行高效分割和高度，利用Oracle工具构建的应用可以自动且充分地利用网络带宽，能充分利用Oracle企业级平台各级特性，具有较强的可伸缩性、高可靠性。<br />
　　<br />
　　投资保护<br />
　　在进入新一代的计算机环境中手工建立的应用，第一行代码都必须重复开发，以便能从新一代计算环境中完全受益。但使用Oracle的工具对应用进行建模，部门将真正拥挑战性技术。<br />
　　<br />
　　决策支持<br />
　　Oracle的决策支持产品家族全面致力于企业决策支持的需求；从生产报告、特殊查询，直到高层分析，以协同工作的方式可共同创建一个无缝的分析和报告环境，从而对棘手问题给予快速解答。这种集成式解决方案具有超于一般的易用性和无以伦比的性能，而花费和部署方面的成本却被大大的降低。<br />
　　<br />
　　该产品家族包括：<br />
　　<br />
　　　Oracle Reports---企业生产报告工具，IS开发者可用它来建立和开发复杂的高质量报告。<br />
　　<br />
　　 Oracle Discoverer---一个获得了特别奖的查询和分析工具，用于访问数据仓库，数据集市和　　　正在动作的数据库。<br />
　　<br />
　　 Oracle Express---世界上最先进的、面向联机分析处理（OLQP）的计算机引擎和多维数据高速缓存。<br />
　　<br />
　　企业级工具<br />
　　<br />
　　Oracle已经为办公室前台和后台提供了丰富而倍受欢迎的应用，这些应用覆盖了制造业、人力资源、销售部门办公自动化，以及连锁店管理。这种规模和复杂度的应用均需企业级工具。这也正是使用Oracle工具家族全面开发Oracle应用的原由所在。Oracle借助其工具技术 ，为企业提供迁移到客户服务器直到web方式，因此扔有成百甚至上行用户的客户均可以大大降低企业应用的实现、维护和更新成本及其复杂性。<br />
　　<br />
　　集用户所有需求于一体<br />
　　基于Oracle的套件战略，我们正在推出集用户所有需求于一体的解决方案。用户将能获得&#8220;一次到位&#8221;的购买方式的所有益处。<br />
　　<br />
　　所有产品均能保证在一起顺利运用。文件亦能交叉参考的机制，能提供不同产品间的完全兼容。<br />
　　<br />
　　Oracle Enterprise Developer Suite(Oracle企业开发套件)是一项基于模型来进行应用开发的产品套件。这一获奖产品可全面用于建立具有高度伸缩性和高可靠性的企业级数据库客户/服务器应用的web应用。对基于部件的开发Oracle JDeveloper Suite可向你提供建立2层和3层java数据库应用和部件的所有之需。<br />
　　<br />
　　Oracle领导市场新潮流<br />
　　Oracle是当今唯一一个提供适于整个系统生命周期的集成式企业开发工具集的厂商。Oracle工具所拥有的生产力和可伸缩能力已经导致了其在市场上的领导地位。Oracle拥有部署客户机应用、保护当前体系结构投资的独一无二的能力，南昌同时， 它却降低于Interner计算环境的成本，增加了对Internet计算环境可访问性的利益。Oracle工具已经帮助了客户从字符系统转移到客户/服务器架构，而今天已经转移到Internet计算环境之中。Oracle工具必将伴你走向末来。<br />
　　<br />
　　Oracle Developer/2000 <br />
　　Oracle Developer 简 介<br />
　　<br />
　　Oracle Developer/2000可以说是当今最好的开发工具，它以其全中文界面和其易于使用的集成式快速应用开发环境而倍受开发人员的欢迎。<br />
　　Oracle Developer 提 供 有 一 个 集 成 式 工 具 集， 支 持 大 规 模 开 发 活 动 的 生 产 力 需 求。Oracle Developer 支 持 企 业 级 应 用 的 可 伸 缩 需 求， 维 护 不 断 变 化 的 应 用 需 求， 以 及 真 实 环 境 中 的 异 构 性。 简 而 言 之，Oracle Developer 能 够 实 现 了Internet 计 算 环 境 的 种 种 愿 望。<br />
　　<br />
　　生 产 力<br />
　　<br />
　　Oracle Developer 中 纳 入 了 一 个 集 成 式 构 造 器 集 合， 用 于 创 建 表 格、 报 告、 图 表、 查 询、 数 据 库 对 象 和 过 程。 这 些 部 件 使 用 了 强 大 的 说 明 能 力， 允 许 你 直 接 从 数 据 库 定 义 中 创 建 应 用 而 无 需 编 号 任 何 代 码。<br />
　　<br />
　　Oracle Developer 通 过 使 用 快 速 应 用 开 发(RAD) 技 术、 面 向 对 象 技 术， 基 于 计 算 机 的 内 部 学 习， 以 及 统 一 的 客 户、 应 用 服 务 器 和 数 据 库 服 务 器 体 系 结 构， 为 客 户/ 服 务 器 和Web 开 发 建 立 了 新 的 易 于 使 用 的 生 产 力 标 准。<br />
　　<br />
　　组 织 的 开 发 标 准 能 够 轻 易 地 适 用 于 自 定 义 的 应 用 模 和 默 认 的 应 用 对 象 设 置。 为 了 达 到 最 高 的 生 产 力， 开 发 人 员 可 以 从 使 用Oracle Developer 创 建 的 模 型 中 直 接 选 择 以 生 成 完 整 的Oracle Developer 应 用。<br />
　　<br />
　　可 伸 缩 性<br />
　　<br />
　　Oracle Developer 的 嵌 入 式 特 性 允 许 客 户 在10 到1000 个 用 户，MB 到GB 级 数 据， 决 策 支 持 到 复 杂OLTP 应 用 间 自 由 伸 缩。 同 时Oracle Developer 灵 活 的 多 层 体 系 结 构 还 支 持Oracle 应 用 服 务 器 或 第 三 方 应 用 服 务 器， 如TP 还 支 持 监 视 器， 并 因 此 确 保 了 从 桌 面 级 到 专 业 级 的 可 伸 缩 性。<br />
　　<br />
　　开 放 性<br />
　　<br />
　　在Oracle Developer 的 其 他 应 用 和 工 具 间 基 于 标 准 的 交 互 是 建 立 在OCX/ActiveX 控 件，OLE( 对 象 连 接 与 嵌 入) 以 及DDE( 动 态 数 据 交 换) 之 上 的。 通 过 开 放API 对 多 种 多 媒 体 格 式 的 补 充 支 持，Oracle Developer 使 开 发 人 员 能 够 灵 活 地 扩 充 应 用， 并 能 将 其 他 部 件 集 成 在 这 些 应 用 之 中。<br />
　　<br />
　　Oracle Developer 不 仅 向 您 提 供 了 最 优 的Oracle 数 据 库 集 成， 而 且 还 提 供 了 对 所 有 主 流 数 据 库 包 括Oracle Developer Rdb、Microsoft SQL Server、Informix、Sybase 和DB/2 的 透 明 访 问。 对 数 据 库 的 访 问 可 以 通 过 数 据 库 直 接 驱 动 器 以 及 通 过Oracle Developer API 和Oracle Gateways 实 现。<br />
　　<br />
　　Oracle Developer 应 用 可 以 轻 易 地 转 换 和 部 署 在 超 过43 种 语 言 之 上， 它 提 供 了 高 生 产 力、 经 济 实 惠 的 解 决 方 案， 可 以 支 持 和 管 理 表 格、 报 告、 图 形 转 换。 它 允 许 组 织 机 构 同 时 发 行 本 国 和 多 语 种 应 用。 对UNICODE 的 支 持 也 使 得 用 户 能 够 在 同 一 屏 幕 上 显 示 单 字 节 和 多 字 节 语 言。<br />
　　<br />
　　通 过 合 作 伙 伴， 开 放 工 具 创 始 协 会 成 员 的 努 力 我 们 为 第 三 方 产 品 提 供 了 众 多 接 口。 这 些 接 口 包 括 版 本 控 制 和 配 置 管 理 工 具、 测 试 工 具、 压 缩 分 析 和 质 量 控 制 工 具、 迁 移 工 具 以 及 其 他 许 多 种 工 具。<br />
　　<br />
　　Web 事 务<br />
　　<br />
　　今 天， 组 织 机 构 所 需 要 的 是 充 分 利 用Web 的 投 资 及 其 访 问 能 力， 而 同 时 要 保 护 其 在 客 户/ 服 务 器 应 用 上 的 投 资。<br />
　　<br />
　　Oracle Developer Server 满 足 了 这 一 挑 战， 它 能 够 通 过 独 一 无 二 的 技 术 在 单 个 应 用 中 体 现 客 户/ 服 务 器 和Web 的 益 处。Oracle Developer Server 使 用Java 来 提 供 应 用 的 用 户 界 面， 同 时 还 动 用 了Oracle Developer 处 理 引 擎 对 可 伸 缩 应 用 服 务 器 的 强 大 支 持 来 处 理 事 件 和 与 数 据 库 交 互。 结 果， 它 带 来 了 这 样 一 个 好 处， 即 在 任 何 一 个 可 运 行Java 使 能 的Web 浏 览 器 的 瘦 客 户 机 上， 客 户/ 服 务 器 应 用 都 能 以 保 持 不 变 的 姿 态 加 以 运 行， 并 因 此 消 除 了 在 每 个 客 户 机 上 安 装 运 行 时 软 件 或 应 用 软 件 的 需 求。<br />
　　<br />
　　更 进 一 步 的 是， 开 发 人 员 可 以 充 
<img src ="http://www.blogjava.net/msmary/aggbug/168313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-12-17 20:18 <a href="http://www.blogjava.net/msmary/articles/168313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>误删数据库文件的解决之道</title><link>http://www.blogjava.net/msmary/articles/167990.html</link><dc:creator>谭明</dc:creator><author>谭明</author><pubDate>Sat, 15 Dec 2007 11:26:00 GMT</pubDate><guid>http://www.blogjava.net/msmary/articles/167990.html</guid><wfw:comment>http://www.blogjava.net/msmary/comments/167990.html</wfw:comment><comments>http://www.blogjava.net/msmary/articles/167990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/msmary/comments/commentRss/167990.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/msmary/services/trackbacks/167990.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上次在数据库服务没有启动的情况下把Oracle数据文件给删除了,那是我在E盘下面建的一个表空间下的多个数据库文件SALES_DATA01,再次启动服务后,用sqlplus / as sysdba登录不上,试了很多办法,才找到一个能登录的办法,就是用sqlplus sys/tanm as sysdba或者sqlplus/nolog&nbsp;&nbsp; conn sys/tanm as sysdba,但是又出现了新的问题,我想把scott用户的权限更改使其能有DBA权限登录,alter user scott account unlock进行解锁,提示database not open数据库不能打开,用select file_name from dba_data_files进行查询,出现错误ERROR at line 1:<br />
ORA-01219: database not open: queries allowed on fixed tables/views only<br />
查了一下资料:(使用了如下段方法)<br />
<pre>SQL&gt; select * from all_users;
select * from all_users
*
ERROR at line 1:
ORA-01219: database not open: queries allowed on fixed
tables/views only
SQL&gt; select status from v$instance;
STATUS
------------
MOUNTED
SQL&gt;
</pre>
<p>To open the database for normal access, we can alter the database again.
<p>
<pre>SQL&gt; alter database open;
Database altered.
</pre>
<p>The shutdown proccess is the simply opposite of the startup.
<p>
<pre>SQL&gt; shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.</pre>
<pre>运行 SQL&gt; alter database open;
ERROR at line 1:<br />
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file<br />
ORA-01110: data file 6: 'E:\SALES_DATA01.DBF'</pre>
<pre>依次使用</pre>
<pre>alter &nbsp; database &nbsp; datafiel &nbsp; 'E:\SALES_DATA01.DBF' &nbsp; offline &nbsp; drop;</pre>
<pre>alter &nbsp; database &nbsp; datafiel &nbsp; 'E:\SALES_DATA02.DBF' &nbsp; offline &nbsp; drop;</pre>
<pre>等方法把数据文件全部脱机删除,再运行SQL&gt;alter database open;就可以了</pre>
<pre>&nbsp;</pre>
<img src ="http://www.blogjava.net/msmary/aggbug/167990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/msmary/" target="_blank">谭明</a> 2007-12-15 19:26 <a href="http://www.blogjava.net/msmary/articles/167990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>