??xml version="1.0" encoding="utf-8" standalone="yes"?>
EMPNO EMPNAME DEPT
Z3 张三 销售部
L4 李四 销售部
W5 王五 技术部
Z6 赵六 技术部
要得到如下结?
NUM EMPNO EMPNAME DEPT
可以看到每个表各有一条数据已l插?
下面例子中用的表来自Oracle自带的HR用户下的表,如果没有安装该用P可以在SYS用户下运?ORACLE_HOME/demo/schema/human_resources/hr_main.sql来创建?/font>
除本文内容外Q你q可参考:
ROLLUP与CUBE http://xsb.itpub.net/post/419/29159
分析函数使用例子介绍Q?a >http://xsb.itpub.net/post/419/44634
本文如果未指明,~省是在HR用户下运行例子?br />
开H函数的的理解:
开H函数指定了分析函数工作的数据窗口大,q个数据H口大小可能会随着行的变化而变化,举例如下Q?br />
overQorder by salaryQ?按照salary排序q行累计Qorder by是个默认的开H函?br />
overQpartition by deptnoQ按照部门分?br />
overQorder by salary range between 50 preceding and 150 followingQ?br />
每行对应的数据窗口是之前行幅度g过50Q之后行q度g过150
overQorder by salary rows between 50 preceding and 150 followingQ?br />
每行对应的数据窗口是之前50行,之后150?br />
overQorder by salary rows between unbounded preceding and unbounded followingQ?br />
每行对应的数据窗口是从第一行到最后一行,{效Q?br />
overQorder by salary range between unbounded preceding and unbounded followingQ?/font>
主要参考资料:《expert one-on-one?Tom Kyte 《Oracle9i SQL Reference》第6?br />
1).AVG
功能描述Q用于计一个组和数据窗口内表达式的q_倹{?br />
SAMPLEQ下面的例子中列c_mavg计算员工表中每个员工的^均薪水报告,该^均值由当前员工和与之具有相同经理的前一个和后一个三者的q_数得来;
SELECT manager_id, last_name, hire_date, salary,
AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg
FROM employees;
MANAGER_ID LAST_NAME HIRE_DATE SALARY C_MAVG
---------- ------------------------- --------- ---------- ----------
100 Kochhar 21-SEP-89 17000 17000
100 De Haan 13-JAN-93 17000 15000
100 Raphaely 07-DEC-94 11000 11966.6667
100 Kaufling 01-MAY-95 7900 10633.3333
100 Hartstein 17-FEB-96 13000 9633.33333
100 Weiss 18-JUL-96 8000 11666.6667
100 Russell 01-OCT-96 14000 11833.3333
2).CORR
功能描述Q返回一对表辑ּ的相关系敎ͼ它是如下的羃写:
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))
从统计上Ԍ相关性是变量之间兌的强度,变量之间的关联意味着在某U程?br />
上一个变量的值可由其它的D行预。通过q回一?1~1之间的一个数, 相关
pLl出了关联的强度Q?表示不相兟?br />
SAMPLEQ下例返?998q月销售收入和月单位销售的关系的篏U系敎ͼ本例在SH用户下运行)
SELECT t.calendar_month_number,
CORR (SUM(s.amount_sold), SUM(s.quantity_sold))
OVER (ORDER BY t.calendar_month_number) as CUM_CORR
FROM sales s, times t
WHERE s.time_id = t.time_id AND calendar_year = 1998
GROUP BY t.calendar_month_number
ORDER BY t.calendar_month_number;
CALENDAR_MONTH_NUMBER CUM_CORR
--------------------- ----------
1
2 1
3 .994309382
4 .852040875
5 .846652204
6 .871250628
7 .910029803
8 .917556399
9 .920154356
10 .86720251
11 .844864765
12 .903542662
3).COVAR_POP
功能描述Q返回一对表辑ּ的M协方差?br />
SAMPLEQ下例CUM_COVPq回定h和最品h格的累积M协方?/font>
SELECT product_id, supplier_id,
COVAR_POP(list_price, min_price)
OVER (ORDER BY product_id, supplier_id) AS CUM_COVP,
COVAR_SAMP(list_price, min_price)
OVER (ORDER BY product_id, supplier_id) AS CUM_COVS
FROM product_information p
WHERE category_id = 29
ORDER BY product_id, supplier_id;
PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS
---------- ----------- ---------- ----------
1774 103088 0
1775 103087 1473.25 2946.5
1794 103096 1702.77778 2554.16667
1825 103093 1926.25 2568.33333
2004 103086 1591.4 1989.25
2005 103086 1512.5 1815
2416 103088 1475.97959 1721.97619
.
.
4).COVAR_SAMP
功能描述Q返回一对表辑ּ的样本协方差
SAMPLEQ下例CUM_COVSq回定h和最品h格的累积h协方?/font>
SELECT product_id, supplier_id,
COVAR_POP(list_price, min_price)
OVER (ORDER BY product_id, supplier_id) AS CUM_COVP,
COVAR_SAMP(list_price, min_price)
OVER (ORDER BY product_id, supplier_id) AS CUM_COVS
FROM product_information p
WHERE category_id = 29
ORDER BY product_id, supplier_id;
PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS
---------- ----------- ---------- ----------
1774 103088 0
1775 103087 1473.25 2946.5
1794 103096 1702.77778 2554.16667
1825 103093 1926.25 2568.33333
2004 103086 1591.4 1989.25
2005 103086 1512.5 1815
2416 103088 1475.97959 1721.97619
.
.
5).COUNT
功能描述Q对一l内发生的事情进行篏U计敎ͼ如果指定*或一些非I常敎ͼcount对所有行计数Q如果指定一个表辑ּQcountq回表达式非I值的计数Q当有相同值出现时Q这些相{的值都会被U_被计的|可以使用DISTINCT来记录去掉一l中完全相同的数据后出现的行数?br />
SAMPLEQ下面例子中计算每个员工在按薪水排序中当前行附近薪水在[n-50,n+150]之间的行敎ͼn表示当前行的薪水
例如QPhiltanker的薪?200Q排在他之前的行中薪水大于等?200-50的有1行,排在他之后的行中薪水于{于2200Q?50的行没有Q所以count计数值cnt3?Q包括自己当前行Q;cnt2值相当于于{于当前行的SALARY值的所有行?/font>
SELECT last_name, salary, COUNT(*) OVER () AS cnt1,
COUNT(*) OVER (ORDER BY salary) AS cnt2,
COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING
AND 150 FOLLOWING) AS cnt3 FROM employees;
LAST_NAME SALARY CNT1 CNT2 CNT3
------------------------- ---------- ---------- ---------- ----------
Olson 2100 107 1 3
Markle 2200 107 3 2
Philtanker 2200 107 3 2
Landry 2400 107 5 8
Gee 2400 107 5 8
Colmenares 2500 107 11 10
Patel 2500 107 11 10
.
.
6).CUME_DIST
功能描述Q计一行在l中的相对位|,CUME_DISTLq回大于0、小于或{于1的数Q该数表C行在N行中的位|。例如,在一?行的l中Q返回的累计分布gؓ1/3?/3?/3
SAMPLEQ下例中计算每个工种的员工按薪水排序依次累积出现的分布百分比
SELECT job_id, last_name, salary, CUME_DIST()
OVER (PARTITION BY job_id ORDER BY salary) AS cume_dist
FROM employees WHERE job_id LIKE 'PU%';
JOB_ID LAST_NAME SALARY CUME_DIST
---------- ------------------------- ---------- ----------
PU_CLERK Colmenares 2500 .2
PU_CLERK Himuro 2600 .4
PU_CLERK Tobias 2800 .6
PU_CLERK Baida 2900 .8
PU_CLERK Khoo 3100 1
PU_MAN Raphaely 11000 1
7).DENSE_RANK
功能描述Q根据ORDER BY子句中表辑ּ的|从查询返回的每一行,计算它们与其它行的相对位|。组内的数据按ORDER BY子句排序Q然后给每一行赋一个号Q从而Ş成一个序列,该序列从1开始,往后篏加。每ơORDER BY表达式的值发生变化时Q该序列也随之增加。有同样值的行得到同L数字序号Q认为null时相{的Q。密集的序列q回的时没有间隔的数
SAMPLEQ下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号Q注意与RANK函数的区别)
SELECT d.department_id , e.last_name, e.salary, DENSE_RANK()
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND d.department_id IN ('60', '90');
DEPARTMENT_ID LAST_NAME SALARY DRANK
------------- ------------------------- ---------- ----------
60 Lorentz 4200 1
60 Austin 4800 2
60 Pataballa 4800 2
60 Ernst 6000 3
60 Hunold 9000 4
90 Kochhar 17000 1
90 De Haan 17000 1
90 King 24000 2
8).FIRST
功能描述Q从DENSE_RANKq回的集合中取出排在最前面的一个值的行(可能多行Q因为值可能相{)Q因此完整的语法需要在开始处加上一个集合函C从中取出记录
SAMPLEQ下面例子中DENSE_RANK按部门分区,再按佣金commission_pct排序QFIRST取出佣金最低的对应的所有行Q然后前面的MAX函数从这个集合中取出薪水最低的|LAST取出佣金最高的对应的所有行Q然后前面的MIN函数从这个集合中取出薪水最高的?br />
SELECT last_name, department_id, salary,
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)
OVER (PARTITION BY department_id) "Worst",
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)
OVER (PARTITION BY department_id) "Best"
FROM employees
WHERE department_id in (20,80)
ORDER BY department_id, salary;
LAST_NAME DEPARTMENT_ID SALARY Worst Best
------------------------- ------------- ---------- ---------- ----------
Fay 20 6000 6000 13000
Hartstein 20 13000 6000 13000
Kumar 80 6100 6100 14000
Banda 80 6200 6100 14000
Johnson 80 6200 6100 14000
Ande 80 6400 6100 14000
Lee 80 6800 6100 14000
Tuvault 80 7000 6100 14000
Sewall 80 7000 6100 14000
Marvins 80 7200 6100 14000
Bates 80 7300 6100 14000
.
.
.
9).FIRST_VALUE
功能描述Q返回组中数据窗口的W一个倹{?br />
SAMPLEQ下面例子计按部门分区按薪水排序的数据H口的第一个值对应的名字Q如果薪水的W一个值有多个Q则从多个对应的名字中取~省排序的第一个名?/font>
SELECT department_id, last_name, salary, FIRST_VALUE(last_name)
OVER (PARTITION BY department_id ORDER BY salary ASC ) AS lowest_sal
FROM employees
WHERE department_id in(20,30);
DEPARTMENT_ID LAST_NAME SALARY LOWEST_SAL
------------- ------------------------- ---------- --------------
20 Fay 6000 Fay
20 Hartstein 13000 Fay
30 Colmenares 2500 Colmenares
30 Himuro 2600 Colmenares
30 Tobias 2800 Colmenares
30 Baida 2900 Colmenares
30 Khoo 3100 Colmenares
30 Raphaely 11000 Colmenares
10).LAG
功能描述Q可以访问结果集中的其它行而不用进行自q接。它允许d理游标,好像游标是一个数l一栗在l定l中可参考当前行之前的行Q这样就可以从组中与当前行一起选择以前的行。Offset是一个正整数Q其默认gؓ1Q若索引出H口的范_p回默认|默认q回的是l中W一行)Q其相反的函数是LEAD
SAMPLEQ下面的例子中列prev_salq回按hire_date排序的前1行的salary?/font>
SELECT last_name, hire_date, salary,
LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal
FROM employees
WHERE job_id = 'PU_CLERK';
LAST_NAME HIRE_DATE SALARY PREV_SAL
------------------------- ---------- ---------- ----------
Khoo 18-5?-95 3100 0
Tobias 24-7?-97 2800 3100
Baida 24-12?97 2900 2800
Himuro 15-11?98 2600 2900
Colmenares 10-8?-99 2500 2600
11).LAST
功能描述Q从DENSE_RANKq回的集合中取出排在最后面的一个值的行(可能多行Q因为值可能相{)Q因此完整的语法需要在开始处加上一个集合函C从中取出记录
SAMPLEQ下面例子中DENSE_RANK按部门分区,再按佣金commission_pct排序QFIRST取出佣金最低的对应的所有行Q然后前面的MAX函数从这个集合中取出薪水最低的|LAST取出佣金最高的对应的所有行Q然后前面的MIN函数从这个集合中取出薪水最高的?br />
SELECT last_name, department_id, salary,
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)
OVER (PARTITION BY department_id) "Worst",
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)
OVER (PARTITION BY department_id) "Best"
FROM employees
WHERE department_id in (20,80)
ORDER BY department_id, salary;
LAST_NAME DEPARTMENT_ID SALARY Worst Best
------------------------- ------------- ---------- ---------- ----------
Fay 20 6000 6000 13000
Hartstein 20 13000 6000 13000
Kumar 80 6100 6100 14000
Banda 80 6200 6100 14000
Johnson 80 6200 6100 14000
Ande 80 6400 6100 14000
Lee 80 6800 6100 14000
Tuvault 80 7000 6100 14000
Sewall 80 7000 6100 14000
Marvins 80 7200 6100 14000
Bates 80 7300 6100 14000
.
12).LAST_VALUE
功能描述Q返回组中数据窗口的最后一个倹{?br />
SAMPLEQ下面例子计按部门分区按薪水排序的数据H口的最后一个值对应的名字Q如果薪水的最后一个值有多个Q则从多个对应的名字中取~省排序的最后一个名?br />
SELECT department_id, last_name, salary, LAST_VALUE(last_name)
OVER(PARTITION BY department_id ORDER BY salary) AS highest_sal
FROM employees
WHERE department_id in(20,30);
DEPARTMENT_ID LAST_NAME SALARY HIGHEST_SAL
------------- ------------------------- ---------- ------------
20 Fay 6000 Fay
20 Hartstein 13000 Hartstein
30 Colmenares 2500 Colmenares
30 Himuro 2600 Himuro
30 Tobias 2800 Tobias
30 Baida 2900 Baida
30 Khoo 3100 Khoo
30 Raphaely 11000 Raphaely
13).LEAD
功能描述QLEAD与LAG相反QLEAD可以讉Kl中当前行之后的行。Offset是一个正整数Q其默认gؓ1Q若索引出H口的范_p回默认|默认q回的是l中W一行)
SAMPLEQ下面的例子中每行的"NextHired"q回按hire_date排序的下一行的hire_date?/font>
SELECT last_name, hire_date,
LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS "NextHired"
FROM employees WHERE department_id = 30;
LAST_NAME HIRE_DATE NextHired
------------------------- --------- ---------
Raphaely 07-DEC-94 18-MAY-95
Khoo 18-MAY-95 24-JUL-97
Tobias 24-JUL-97 24-DEC-97
Baida 24-DEC-97 15-NOV-98
Himuro 15-NOV-98 10-AUG-99
Colmenares 10-AUG-99
14).MAX
功能描述Q在一个组中的数据H口中查找表辑ּ的最大倹{?br />
SAMPLEQ下面例子中dept_maxq回当前行所在部门的最大薪水?/font>
SELECT department_id, last_name, salary,
MAX(salary) OVER (PARTITION BY department_id) AS dept_max
FROM employees WHERE department_id in (10,20,30);
DEPARTMENT_ID LAST_NAME SALARY DEPT_MAX
------------- ------------------------- ---------- ----------
10 Whalen 4400 4400
20 Hartstein 13000 13000
20 Fay 6000 13000
30 Raphaely 11000 11000
30 Khoo 3100 11000
30 Baida 2900 11000
30 Tobias 2800 11000
30 Himuro 2600 11000
30 Colmenares 2500 11000
15).MIN
功能描述Q在一个组中的数据H口中查找表辑ּ的最倹{?br />
SAMPLEQ下面例子中dept_minq回当前行所在部门的最薪水?/font>
SELECT department_id, last_name, salary,
MIN(salary) OVER (PARTITION BY department_id) AS dept_min
FROM employees WHERE department_id in (10,20,30);
DEPARTMENT_ID LAST_NAME SALARY DEPT_MIN
------------- ------------------------- ---------- ----------
10 Whalen 4400 4400
20 Hartstein 13000 6000
20 Fay 6000 6000
30 Raphaely 11000 2500
30 Khoo 3100 2500
30 Baida 2900 2500
30 Tobias 2800 2500
30 Himuro 2600 2500
30 Colmenares 2500 2500
16).NTILE
功能描述Q将一个组分ؓ"表达?的散列表C,例如Q如果表辑ּ=4Q则l组中的每一行分配一个数Q从1?Q,如果l中?0行,则给?行分?Q给?行分?{等。如果组的基C能由表达式值^均分开Q则对这些行q行分配Ӟl中没有Q何percentile的行数比其它percentile的行数超q一行,最低的percentile是那些拥有额外行的percentile。例如,若表辑ּ=4Q行?21Q则percentile=1的有5行,percentile=2的有5行等{?br />
SAMPLEQ下例中?行数据分??/font>
SELECT last_name, salary,
NTILE(4) OVER (ORDER BY salary DESC) AS quartile FROM employees
WHERE department_id = 100;
LAST_NAME SALARY QUARTILE
------------------------- ---------- ----------
Greenberg 12000 1
Faviet 9000 1
Chen 8200 2
Urman 7800 2
Sciarra 7700 3
Popp 6900 4
17).PERCENT_RANK
功能描述Q和CUME_DISTQ篏U分配)函数cMQ对于一个组中给定的行来_在计那行的序号Ӟ先减1Q然后除以n-1Qn为组中所有的行数Q。该函数Lq回0?Q包?Q之间的数?br />
SAMPLEQ下例中如果Khoo的salary?900Q则prgؓ0.6Q因为RANK函数对于{值的q回序列值是一L
SELECT department_id, last_name, salary,
PERCENT_RANK()
OVER (PARTITION BY department_id ORDER BY salary) AS pr
FROM employees
WHERE department_id < 50
ORDER BY department_id,salary;
DEPARTMENT_ID LAST_NAME SALARY PR
------------- ------------------------- ---------- ----------
10 Whalen 4400 0
20 Fay 6000 0
20 Hartstein 13000 1
30 Colmenares 2500 0
30 Himuro 2600 0.2
30 Tobias 2800 0.4
30 Baida 2900 0.6
30 Khoo 3100 0.8
30 Raphaely 11000 1
40 Mavris 6500 0
18).PERCENTILE_CONT
功能描述Q返回一个与输入的分布百分比值相对应的数据|分布癑ֈ比的计算Ҏ见函数PERCENT_RANKQ如果没有正好对应的数据|通过下面法来得到|
RN = 1+ (P*(N-1)) 其中P是输入的分布癑ֈ比|N是组内的行数
CRN = CEIL(RN) FRN = FLOOR(RN)
if (CRN = FRN = RN) then
(value of expression from row at RN)
else
(CRN - RN) * (value of expression for row at FRN) +
(RN - FRN) * (value of expression for row at CRN)
注意Q本函数与PERCENTILE_DISC的区别在找不到对应的分布值时q回的替代值的计算Ҏ不同
SAMPLEQ在下例中,对于部门60的Percentile_ContD如下:
P=0.7 N=5 RN =1+ (P*(N-1)=1+(0.7*(5-1))=3.8 CRN = CEIL(3.8)=4
FRN = FLOOR(3.8)=3
Q? - 3.8Q? 4800 + (3.8 - 3) * 6000 = 5760
SELECT last_name, salary, department_id,
PERCENTILE_CONT(0.7) WITHIN GROUP (ORDER BY salary)
OVER (PARTITION BY department_id) "Percentile_Cont",
PERCENT_RANK()
OVER (PARTITION BY department_id ORDER BY salary) "Percent_Rank"
FROM employees WHERE department_id IN (30, 60);
LAST_NAME SALARY DEPARTMENT_ID Percentile_Cont Percent_Rank
------------------------- ---------- ------------- --------------- ------------
Colmenares 2500 30 3000 0
Himuro 2600 30 3000 0.2
Tobias 2800 30 3000 0.4
Baida 2900 30 3000 0.6
Khoo 3100 30 3000 0.8
Raphaely 11000 30 3000 1
Lorentz 4200 60 5760 0
Austin 4800 60 5760 0.25
Pataballa 4800 60 5760 0.25
Ernst 6000 60 5760 0.75
Hunold 9000 60 5760 1
19).PERCENTILE_DISC
功能描述Q返回一个与输入的分布百分比值相对应的数据|分布癑ֈ比的计算Ҏ见函数CUME_DISTQ如果没有正好对应的数据|取大于该分布值的下一个倹{?br />
注意Q本函数与PERCENTILE_CONT的区别在找不到对应的分布值时q回的替代值的计算Ҏ不同
SAMPLEQ下例中0.7的分布值在部门30中没有对应的Cume_Dist|所以就取下一个分布?.83333333所对应的SALARY来替?/font>
SELECT last_name, salary, department_id,
PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary )
OVER (PARTITION BY department_id) "Percentile_Disc",
CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary) "Cume_Dist"
FROM employees
WHERE department_id in (30, 60);
LAST_NAME SALARY DEPARTMENT_ID Percentile_Disc Cume_Dist
------------------------- ---------- ------------- --------------- ----------
Colmenares 2500 30 3100 .166666667
Himuro 2600 30 3100 .333333333
Tobias 2800 30 3100 .5
Baida 2900 30 3100 .666666667
Khoo 3100 30 3100 .833333333
Raphaely 11000 30 3100 1
Lorentz 4200 60 6000 .2
Austin 4800 60 6000 .6
Pataballa 4800 60 6000 .6
Ernst 6000 60 6000 .8
Hunold 9000 60 6000 1
20).RANK
功能描述Q根据ORDER BY子句中表辑ּ的|从查询返回的每一行,计算它们与其它行的相对位|。组内的数据按ORDER BY子句排序Q然后给每一行赋一个号Q从而Ş成一个序列,该序列从1开始,往后篏加。每ơORDER BY表达式的值发生变化时Q该序列也随之增加。有同样值的行得到同L数字序号Q认为null时相{的Q。然而,如果两行的确得到同样的排序,则序数将随后跌。若两行序数?Q则没有序数2Q序列将l组中的下一行分配?QDENSE_RANK则没有Q何蟩跃?br />
SAMPLEQ下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号Q注意与DENSE_RANK函数的区别)
SELECT d.department_id , e.last_name, e.salary, RANK()
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND d.department_id IN ('60', '90');
DEPARTMENT_ID LAST_NAME SALARY DRANK
------------- ------------------------- ---------- ----------
60 Lorentz 4200 1
60 Austin 4800 2
60 Pataballa 4800 2
60 Ernst 6000 4
60 Hunold 9000 5
90 Kochhar 17000 1
90 De Haan 17000 1
90 King 24000 3
21).RATIO_TO_REPORT
功能描述Q该函数计算expression/(sum(expression))的|它给出相对于L的百分比Q即当前行对sum(expression)的A献?br />
SAMPLEQ下例计每个员工的工资占该cd工d资的癑ֈ?/font>
SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr
FROM employees
WHERE job_id = 'PU_CLERK';
LAST_NAME SALARY RR
------------------------- ---------- ----------
Khoo 3100 .223021583
Baida 2900 .208633094
Tobias 2800 .201438849
Himuro 2600 .18705036
Colmenares 2500 .179856115
22).REGR_ (Linear Regression) Functions
功能描述Q这些线性回归函数适合最二乘法回归U,?个不同的回归函数可用?br />
REGR_SLOPEQ返回斜率,{于COVAR_POP(expr1, expr2) / VAR_POP(expr2)
REGR_INTERCEPTQ返回回归线的y截距Q等?br />
AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)
REGR_COUNTQ返回用于填充回归线的非I数字对的数?br />
REGR_R2Q返回回归线的决定系敎ͼ计算式ؓQ?br />
If VAR_POP(expr2) = 0 then return NULL
If VAR_POP(expr1) = 0 and VAR_POP(expr2) != 0 then return 1
If VAR_POP(expr1) > 0 and VAR_POP(expr2 != 0 then
return POWER(CORR(expr1,expr),2)
REGR_AVGXQ计回归线的自变量(expr2)的^均|L了空?expr1, expr2)后,{于AVG(expr2)
REGR_AVGYQ计回归线的应变量(expr1)的^均|L了空?expr1, expr2)后,{于AVG(expr1)
REGR_SXXQ?q回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr2)
REGR_SYYQ?q回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr1)
REGR_SXY: q回值等于REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)
Q下面的例子都是在SH用户下完成的Q?br /> SAMPLE 1Q下例计?998q最后三个星期中两种产品Q?60?70Q在周末的销售量中已开发票数量和L量的累积斜率和回归线的截?/font>
SELECT t.fiscal_month_number "Month", t.day_number_in_month "Day",
REGR_SLOPE(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_SLOPE,
REGR_INTERCEPT(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_ICPT
FROM sales s, times t
WHERE s.time_id = t.time_id
AND s.prod_id IN (270, 260)
AND t.fiscal_year=1998
AND t.fiscal_week_number IN (50, 51, 52)
AND t.day_number_in_week IN (6,7)
ORDER BY t.fiscal_month_desc, t.day_number_in_month;
Month Day CUM_SLOPE CUM_ICPT
---------- ---------- ---------- ----------
12 12 -68 1872
12 12 -68 1872
12 13 -20.244898 1254.36735
12 13 -20.244898 1254.36735
12 19 -18.826087 1287
12 20 62.4561404 125.28655
12 20 62.4561404 125.28655
12 20 62.4561404 125.28655
12 20 62.4561404 125.28655
12 26 67.2658228 58.9712313
12 26 67.2658228 58.9712313
12 27 37.5245541 284.958221
12 27 37.5245541 284.958221
12 27 37.5245541 284.958221
SAMPLE 2Q下例计?998q?月每天的累积交易数量
SELECT UNIQUE t.day_number_in_month,
REGR_COUNT(s.amount_sold, s.quantity_sold)
OVER (PARTITION BY t.fiscal_month_number ORDER BY t.day_number_in_month)
"Regr_Count"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND t.fiscal_year = 1998 AND t.fiscal_month_number = 4;
DAY_NUMBER_IN_MONTH Regr_Count
------------------- ----------
1 825
2 1650
3 2475
4 3300
.
.
.
26 21450
30 22200
SAMPLE 3Q下例计?998q每月销售量中已开发票数量和L量的累积回归U决定系?/font>
SELECT t.fiscal_month_number,
REGR_R2(SUM(s.amount_sold), SUM(s.quantity_sold))
OVER (ORDER BY t.fiscal_month_number) "Regr_R2"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND t.fiscal_year = 1998
GROUP BY t.fiscal_month_number
ORDER BY t.fiscal_month_number;
FISCAL_MONTH_NUMBER Regr_R2
------------------- ----------
1
2 1
3 .927372984
4 .807019972
5 .932745567
6 .94682861
7 .965342011
8 .955768075
9 .959542618
10 .938618575
11 .880931415
12 .882769189
SAMPLE 4Q下例计?998q?2月最后两周?60的销售量中已开发票数量和L量的累积q_?/font>
SELECT t.day_number_in_month,
REGR_AVGY(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month)
"Regr_AvgY",
REGR_AVGX(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month)
"Regr_AvgX"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND s.prod_id = 260
AND t.fiscal_month_desc = '1998-12'
AND t.fiscal_week_number IN (51, 52)
ORDER BY t.day_number_in_month;
DAY_NUMBER_IN_MONTH Regr_AvgY Regr_AvgX
------------------- ---------- ----------
14 882 24.5
14 882 24.5
15 801 22.25
15 801 22.25
16 777.6 21.6
18 642.857143 17.8571429
18 642.857143 17.8571429
20 589.5 16.375
21 544 15.1111111
22 592.363636 16.4545455
22 592.363636 16.4545455
24 553.846154 15.3846154
24 553.846154 15.3846154
26 522 14.5
27 578.4 16.0666667
SAMPLE 5Q下例计?60?70?998q?月周末销售量中已开发票数量和L量的累积REGR_SXY, REGR_SXX, and REGR_SYYl计?/font>
SELECT t.day_number_in_month,
REGR_SXY(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxy",
REGR_SYY(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_syy",
REGR_SXX(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxx"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND prod_id IN (270, 260)
AND t.fiscal_month_desc = '1998-02'
AND t.day_number_in_week IN (6,7)
ORDER BY t.day_number_in_month;
DAY_NUMBER_IN_MONTH Regr_sxy Regr_syy Regr_sxx
------------------- ---------- ---------- ----------
1 18870.4 2116198.4 258.4
1 18870.4 2116198.4 258.4
1 18870.4 2116198.4 258.4
1 18870.4 2116198.4 258.4
7 18870.4 2116198.4 258.4
8 18870.4 2116198.4 258.4
14 18870.4 2116198.4 258.4
15 18870.4 2116198.4 258.4
21 18870.4 2116198.4 258.4
22 18870.4 2116198.4 258.4
23).ROW_NUMBER
功能描述Q返回有序组中一行的偏移量,从而可用于按特定标准排序的行号?br />
SAMPLEQ下例返回每个员工再在每个部门中按员工号排序后的序?/font>
SELECT department_id, last_name, employee_id, ROW_NUMBER()
OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id
FROM employees
WHERE department_id < 50;
DEPARTMENT_ID LAST_NAME EMPLOYEE_ID EMP_ID
------------- ------------------------- ----------- ----------
10 Whalen 200 1
20 Hartstein 201 1
20 Fay 202 2
30 Raphaely 114 1
30 Khoo 115 2
30 Baida 116 3
30 Tobias 117 4
30 Himuro 118 5
30 Colmenares 119 6
40 Mavris 203 1
24).STDDEV
功能描述Q计当前行关于l的标准偏离。(Standard DeviationQ?br />
SAMPLEQ下例返回部?0按雇佣日期排序的薪水值的累积标准偏离
SELECT last_name, hire_date,salary,
STDDEV(salary) OVER (ORDER BY hire_date) "StdDev"
FROM employees
WHERE department_id = 30;
LAST_NAME HIRE_DATE SALARY StdDev
------------------------- ---------- ---------- ----------
Raphaely 07-12?94 11000 0
Khoo 18-5?-95 3100 5586.14357
Tobias 24-7?-97 2800 4650.0896
Baida 24-12?97 2900 4035.26125
Himuro 15-11?98 2600 3649.2465
Colmenares 10-8?-99 2500 3362.58829
25).STDDEV_POP
功能描述Q该函数计算M标准偏离Qƈq回M变量的^ҎQ其q回gVAR_POP函数的^Ҏ相同。(Standard DeviationQPopulationQ?br />
SAMPLEQ下例返回部?0?0?0的薪水值的M标准偏差
SELECT department_id, last_name, salary,
STDDEV_POP(salary) OVER (PARTITION BY department_id) AS pop_std
FROM employees
WHERE department_id in (20,30,60);
DEPARTMENT_ID LAST_NAME SALARY POP_STD
------------- ------------------------- ---------- ----------
20 Hartstein 13000 3500
20 Fay 6000 3500
30 Raphaely 11000 3069.6091
30 Khoo 3100 3069.6091
30 Baida 2900 3069.6091
30 Colmenares 2500 3069.6091
30 Himuro 2600 3069.6091
30 Tobias 2800 3069.6091
60 Hunold 9000 1722.32401
60 Ernst 6000 1722.32401
60 Austin 4800 1722.32401
60 Pataballa 4800 1722.32401
60 Lorentz 4200 1722.32401
26).STDDEV_SAMP
功能描述Q?该函数计篏U样本标准偏,q返回M变量的^ҎQ其q回gVAR_POP函数的^Ҏ相同。(Standard DeviationQSampleQ?br />
SAMPLEQ下例返回部?0?0?0的薪水值的h标准偏差
SELECT department_id, last_name, hire_date, salary,
STDDEV_SAMP(salary) OVER
(PARTITION BY department_id ORDER BY hire_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_sdev
FROM employees
WHERE department_id in (20,30,60);
DEPARTMENT_ID LAST_NAME HIRE_DATE SALARY CUM_SDEV
------------- ------------------------- ---------- ---------- ----------
20 Hartstein 17-2?-96 13000
20 Fay 17-8?-97 6000 4949.74747
30 Raphaely 07-12?94 11000
30 Khoo 18-5?-95 3100 5586.14357
30 Tobias 24-7?-97 2800 4650.0896
30 Baida 24-12?97 2900 4035.26125
30 Himuro 15-11?98 2600 3649.2465
30 Colmenares 10-8?-99 2500 3362.58829
60 Hunold 03-1?-90 9000
60 Ernst 21-5?-91 6000 2121.32034
60 Austin 25-6?-97 4800 2163.33077
60 Pataballa 05-2?-98 4800 1982.42276
60 Lorentz 07-2?-99 4200 1925.61678
27).SUM
功能描述Q该函数计算l中表达式的累积和?br />
SAMPLEQ下例计同一l理下员工的薪水累积?/font>
SELECT manager_id, last_name, salary,
SUM (salary) OVER (PARTITION BY manager_id ORDER BY salary
RANGE UNBOUNDED PRECEDING) l_csum
FROM employees
WHERE manager_id in (101,103,108);
MANAGER_ID LAST_NAME SALARY L_CSUM
---------- ------------------------- ---------- ----------
101 Whalen 4400 4400
101 Mavris 6500 10900
101 Baer 10000 20900
101 Greenberg 12000 44900
101 Higgins 12000 44900
103 Lorentz 4200 4200
103 Austin 4800 13800
103 Pataballa 4800 13800
103 Ernst 6000 19800
108 Popp 6900 6900
108 Sciarra 7700 14600
108 Urman 7800 22400
108 Chen 8200 30600
108 Faviet 9000 39600
28).VAR_POP
功能描述Q(Variance PopulationQ该函数q回非空集合的M变量Q忽略nullQ,VAR_POPq行如下计算Q?br />
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)
SAMPLEQ下例计?998q每月销售的累积M和样本变量(本例在SH用户下运行)
SELECT t.calendar_month_desc,
VAR_POP(SUM(s.amount_sold))
OVER (ORDER BY t.calendar_month_desc) "Var_Pop",
VAR_SAMP(SUM(s.amount_sold))
OVER (ORDER BY t.calendar_month_desc) "Var_Samp"
FROM sales s, times t
WHERE s.time_id = t.time_id AND t.calendar_year = 1998
GROUP BY t.calendar_month_desc;
CALENDAR Var_Pop Var_Samp
-------- ---------- ----------
1998-01 0
1998-02 6.1321E+11 1.2264E+12
1998-03 4.7058E+11 7.0587E+11
1998-04 4.6929E+11 6.2572E+11
1998-05 1.5524E+12 1.9405E+12
1998-06 2.3711E+12 2.8453E+12
1998-07 3.7464E+12 4.3708E+12
1998-08 3.7852E+12 4.3260E+12
1998-09 3.5753E+12 4.0222E+12
1998-10 3.4343E+12 3.8159E+12
1998-11 3.4245E+12 3.7669E+12
1998-12 4.8937E+12 5.3386E+12
29).VAR_SAMP
功能描述Q(Variance SampleQ该函数q回非空集合的样本变量(忽略nullQ,VAR_POPq行如下计算Q?br />
(SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1)
SAMPLEQ下例计?998q每月销售的累积M和样本变?/font>
SELECT t.calendar_month_desc,
VAR_POP(SUM(s.amount_sold))
OVER (ORDER BY t.calendar_month_desc) "Var_Pop",
VAR_SAMP(SUM(s.amount_sold))
OVER (ORDER BY t.calendar_month_desc) "Var_Samp"
FROM sales s, times t
WHERE s.time_id = t.time_id AND t.calendar_year = 1998
GROUP BY t.calendar_month_desc;
CALENDAR Var_Pop Var_Samp
-------- ---------- ----------
1998-01 0
1998-02 6.1321E+11 1.2264E+12
1998-03 4.7058E+11 7.0587E+11
1998-04 4.6929E+11 6.2572E+11
1998-05 1.5524E+12 1.9405E+12
1998-06 2.3711E+12 2.8453E+12
1998-07 3.7464E+12 4.3708E+12
1998-08 3.7852E+12 4.3260E+12
1998-09 3.5753E+12 4.0222E+12
1998-10 3.4343E+12 3.8159E+12
1998-11 3.4245E+12 3.7669E+12
1998-12 4.8937E+12 5.3386E+12
30).VARIANCE
功能描述Q该函数q回表达式的变量QOracle计算该变量如下:
如果表达式中行数?Q则q回0
如果表达式中行数大于1Q则q回VAR_SAMP
SAMPLEQ下例返回部?0按雇佣日期排序的薪水值的累积变化
SELECT last_name, salary, VARIANCE(salary)
OVER (ORDER BY hire_date) "Variance"
FROM employees
WHERE department_id = 30;
LAST_NAME SALARY Variance
------------------------- ---------- ----------
Raphaely 11000 0
Khoo 3100 31205000
Tobias 2800 21623333.3
Baida 2900 16283333.3
Himuro 2600 13317000
Colmenares 2500 11307000
=====================================
q箋求和问题Q?br />
select name,sum(cnt) over(order by rownum) from t1;
{:Q,他们都是oracle数据库中的大对象数据cdQoracle提供专门的包对其操作?/p>
2Qblob、clob、nclob 三种大型对象(LOB)Q用来保存较大的囑Ş文g或带格式的文本文Ӟ如Miceosoft Word文档Q以及音频、视频等非文本文Ӟ最大长度是4GB?nbsp;
LOB有几U类型,取决于你使用的字节的cdQOracle 8i实实在在地将q些数据存储在数据库内部保存?nbsp;
可以执行d、存储、写入等Ҏ操作
CLOB(Character Large Object) 用于存储对应于数据库定义的字W集的字W数据。(cM于longcdQ?nbsp;
BLOB(Binary Large Object) 可用来存储无l构的二q制数据。(cM于row和long rowQ?/p>
二、请问LOB的BLOB、CLOB、BFILE有什麽区别,都用在什麽情况?怎样操作Q?/p>
{:
BLOB ——内部二q制大对象?nbsp;
CLOB ——内部字W大对象?nbsp;
NCLOB ——内部定长多字节字符大对象?nbsp;
BFILE ——外部二q制文g?nbsp;
LOB ׃部分l成Q数据(|和指向数据的指针Q定位器Q。尽g表自w一起存储,但是一个LOB 列ƈ不包含|仅有它的定位指针。更q一步,Z使用大对象,E序必须?明定位器cd的本地变量。你在本章后面见到P L / S Q L 接口使用定位器如同操作系l的文g 处理一栗当LOBQ除了BFILE Q被创徏Ӟ定位器被存放在列中,D存放在LOB D中Q?nbsp; LOB D|在数据库内部表的一部分。当 BFILE 被创建时Q定位器如同q_一样存储在列中
三、blob和clob最大是多少Q还是没有最大限Ӟ
{:它们的最大上限就是4GQ?nbsp; Clob可以存储单字节字W数据,Blob可以存储无结构的二进制数?/p>
Oracle存储q程可以有无参数存储q程和带参数存储q程?/font>
一、无参程序过E语?/font>
被kill掉的session,状态会被标Cؓkilled,Oracle会在该用户下一ơtouch时清除该q程.
我们发现当一个session被kill掉以后,该session的paddr被修改,如果有多个session被killQ那么多个session
的paddr都被更改为相同的q程地址
在这U情况下,很多时候,资源是无法释攄,我们需要查询spidQ在操作pȝU来killq些q程.
但是׃此时v$session.paddr已经改变Q我们无法通过v$session和v$process兌来获得spid
那还可以怎么办呢?
我们来看一下下面的查询:
SELECT P.ADDR FROM V$PROCESS P WHERE PID <> 1
MINUS
SELECT S.PADDR FROM V$SESSION S;
现在我们获得了进E地址Q就可以在v$process中找到spidQ然后可以用Kill或者orakill在系l来杀掉这些进E?
实际?应该?
当在Oracle中kill session以后, Oracle只是单的把相关session的paddr 指向同一个虚拟地址.
此时v$process和v$session失去兌,q程此中断.
然后Oracleq待PMONL除这些Session.所以通常{待一个被标记为Killed的Session退出需要花费很长的旉.
如果此时被Kill的processQ重新尝试执行Q务,那么马上会收到进E中断的提示Qprocess退出,此时Oracle会立卛_动PMON
来清除该session.q被作ؓ一ơ异怸断处?
相关Q?br />
orakill sid spid 其中sid为实例名Qspid为线E号
不过我运行时L报错:
Could not attach to Oracle instance sid?br />
alter table qq drop column TIME
alter table qq set unused ("TIME") cascade constraints;(注意TIME为字D名Q要大写)
W一个命令直接删除一个列Q适合应付比较的表,
W二个命令将一个列标识为unused
然后在系l负载比较轻的时候?br />
alter table drop unused columns
删除该列占用的存储空间?br />
可以使用参数指定一ơ删除多行
适合负蝲比较重,或者表比较大的情况
7.新徏一个表旉要赋权限和徏同义?br />
GRANT ALL ON DBOWN.PROD TO APPUSER;
GRANT SELECT,DELETE,UPDATE,INSERT ON DBOWN.ORDSTYLES TO APPUSER;
CREATE OR REPLACE PUBLIC SYNONYM ORDSTYLES FOR ORDSTYLES;
8.物化视图
EXEC DBMS_SNAPSHOT.refresh('GRANTEDPRIV');
若不?/font>"+"q算W的表中的一个行不直接匹配于?/font>"+"预算W的表中的Q何行,则前者的行与后者中的一个空行相匚wq被q回.
若二者均不带"+",则二者中无法匚w的均被返?/font>.
利用外部联接"+",可以替代效率十分低下?/font> not in q算,大大提高q行速度.
例如:?/font>A和表B,B的部分内容包含在A?/font>,两个表关联后,要求昄A的所有内?/font>,B不能?/font>A匚w的就用空格显C?/font>,则两者的表达为左联接: A=B(+)
2.左右q接的表带有条g?条g为is null ?is not null
SELECT A.ORDSEQ,B.ORDTY,A.RELORD FROM ORDREL A,ORD B
WHERE A.ORDSEQ = B.ORDSEQ(+)
AND A.RELORD = 5339
AND B.ISSUPPLY (+) IS NOT NULL
3.当A表和B表进行左q接?C因ؓ是B的子?所以B表也要和C表进行左q接,q样B表没记录?C表也会没记录,相当于A表也和C表进行了左连?保证A表的数据都能正常昄
SELECT A.ORDSEQ,B.ORDTY,A.RELORD FROM ORDREL A,ORD B,ORDITM C
WHERE A.ORDSEQ = B.ORDSEQ(+)
AND A.RELORD = 5339
AND B.ISSUPPLY (+) IS NOT NULL
AND B.ORDSEQ = C.ORDSEQ
4.和字W串的右q接
AND RT.TRANSACTION_TYPE (+)= 'RETURN TO VENDOR'
每个Oracle用户都有一个名字和口o,q拥有一些由其创建的表、视囑֒其他资源。Oracle角色QroleQ就是一l权限(privilegeQ?或者是每个用户Ҏ其状态和条g所需的访问类?。用户可以给角色授予或赋予指定的权限Q然后将角色赋给相应的用戗一个用户也可以直接l其他用h权?/span>
数据库系l权限(Database System PrivilegeQ允许用h行特定的命o集。例如,CREATE TABLE权限允许用户创徏表,GRANT ANY PRIVILEGE权限允许用户授予Mpȝ权限?/span>
数据库对象权限(Database Object PrivilegeQ得用戯够对各个对象q行某些操作。例如DELETE权限允许用户删除表或视图的行QSELECT权限允许用户通过select从表、视图、序列(sequencesQ或快照 QsnapshotsQ中查询信息?/span>
一、创建用?/span>
Oracle内部有两个徏好的用户QSYSTEM和SYS。用户可直接d到SYSTEM用户以创建其他用P因ؓSYSTEMh创徏别的用户的权限。在安装OracleӞ用户或系l管理员首先可以己徏立一个用戗例如:
create user user01 identified by u01;
该命令还可以用来讄其他权限Q详l情况参见自学资料。要改变一个口令,可以使用alter user命oQ?/span>
alter user user01 identified by usr01;
现在user01的口令已?#8220;u01”改ؓ“usr01”?/span>
除了alter user命o以外Q用戯可以使用password命o。如果用password命oQ用戯入的新口令将不在屏幕上显C。有dbaҎ的用户可以通过password命o改变M其他用户的口令;其他用户只能改变自己的口令?/span>
当用戯入password命oӞpȝ提C用戯入旧口o和新口oQ如下所C:
password
Changing password for user01
Old password:
New password:
Retype new password:
当成功地修改了口令时Q用户会得到如下的反馈:
Password changed
二、删除用?/span>
删除用户Q可以用drop user命oQ如下所C:
drop user user01;
如果用户拥有对象Q则不能直接删除Q否则将q回一个错误倹{指定关键字CASCADEQ可删除用户所有的对象Q然后再删除用户。下面的例子用来删除用户与其对象Q?/span>
drop user user01 CASCADE;
三?U标准角?/span>
QracleZ兼容以前的版本,提供了三U标准的角色QroleQ:CONNECT、RESOURCE和DBA?/span>
1. CONNECT Role(q接角色)
临时用户Q特别是那些不需要徏表的用户Q通常只赋予他们CONNECTrole。CONNECT是用Oracle的简单权限,q种权限只有在对其他用户的表有访问权Ӟ包括select、insert、update和delete{,才会变得有意义。拥有CONNECT role的用戯能够创徏表、视图、序列(sequenceQ、簇QclusterQ、同义词Qsynonym Q、会话(sessionQ和与其他数据库的链QlinkQ?/span>
2. RESOURCE Role(资源角色)
更可靠和正式的数据库用户可以授予RESOURCE role。RESOURCE提供l用户另外的权限以创Z们自q表、序列、过E(procedureQ、触发器QtriggerQ、烦引(indexQ和(clusterQ?/span>
3. DBA Role(数据库管理员角色)
DBA role拥有所有的pȝ权限----包括无限制的I间限额和给其他用户授予各种权限的能力。SYSTEM由DBA用户拥有。下面介l一些DBAl常使用的典型权限?/span>
Q?QgrantQ授权)命o
下面对刚才创建的用户user01授权Q命令如下:
grant connect, resource to user01;
Q?QrevokeQ撤消)权限
已授予的权限可以撤消。例如撤消(1Q中的授权,命o如下Q?/span>
revoke connect, resource from user01;
一个具有DBA角色的用户可以撤消Q何别的用L臛_的DBA的CONNECT、RESOURCE 和DBA的其他权限。当Ӟq样是很危险的,因此Q除非真正需要,DBA权限不应随便授予那些不是很重要的一般用戗?/span>
撤消一个用L所有权限,q不意味着从Oracle中删除了q个用户Q也不会破坏用户创徏的Q何表Q只是简单禁止其对这些表的访问。其他要讉Kq些表的用户可以象以前那样地讉Kq些表?/span>
四、创?/span>
除了前面讲到的三U系l角?---CONNECT、RESOURCE和DBAQ用戯可以在Oracle创徏自己的role。用户创建的role可以p或系l权限或两者的l合构成。ؓ了创建roleQ用户必d有CREATE ROLEpȝ权限。下面给Z个create role命o的实例:
create role STUDENT;
q条命o创徏了一个名为STUDENT的role?/span>
一旦创Z一个roleQ用户就可以l他授权。给role授权的grant命o的语法与对对用户的语法相同。在lrole授权Ӟ在grant命o的to子句中要使用role的名Uͼ如下所C:
grant select on CLASS to STUDENT;
现在Q拥?strong>STUDENT角色的所有用户都h?strong>CLASS表的select权限?br />
撤销权限:
revoke select on CLASS from STUDENT;
五、删除角?/span>
要删除角Ԍ可以使用drop role命oQ如下所C:
drop role STUDENT;
指定的roleq同与之相关的权限将从数据库中全部删除?/span>
以下内容转自|络Q感觉这个比较有用。收藏一下?br />
The following are number examples for the to_char function.
to_char(1210.73, '9999.9') would return '1210.7' to_char(1210.73, '9,999.99') would return '1,210.73' to_char(1210.73, '$9,999.00') would return '$1,210.73' to_char(21, '000099') would return '000021'
The following is a list of valid parameters when the to_char function is used to convert a date to a string. These parameters can be used in many combinations.
Parameter Explanation YEAR Year, spelled out YYYY 4-digit year YYY
YY
YLast 3, 2, or 1 digit(s) of year. IYY
IY
ILast 3, 2, or 1 digit(s) of ISO year. IYYY 4-digit year based on the ISO standard Q Quarter of year (1, 2, 3, 4; JAN-MAR = 1). MM Month (01-12; JAN = 01). MON Abbreviated name of month. MONTH Name of month, padded with blanks to length of 9 characters. RM Roman numeral month (I-XII; JAN = I). WW 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. W Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh. IW Week of year (1-52 or 1-53) based on the ISO standard. D Day of week (1-7). DAY Name of day. DD Day of month (1-31). DDD Day of year (1-366). DY Abbreviated name of day. J Julian day; the number of days since January 1, 4712 BC. HH Hour of day (1-12). HH12 Hour of day (1-12). HH24 Hour of day (0-23). MI Minute (0-59). SS Second (0-59). SSSSS Seconds past midnight (0-86399). FF Fractional seconds.
The following are date examples for the to_char function.
to_char(sysdate, 'yyyy/mm/dd'); would return '2003/07/09' to_char(sysdate, 'Month DD, YYYY'); would return 'July 09, 2003' to_char(sysdate, 'FMMonth DD, YYYY'); would return 'July 9, 2003' to_char(sysdate, 'MON DDth, YYYY'); would return 'JUL 09TH, 2003' to_char(sysdate, 'FMMON DDth, YYYY'); would return 'JUL 9TH, 2003' to_char(sysdate, 'FMMon ddth, YYYY'); would return 'Jul 9th, 2003'
You will notice that in some examples, the format_mask parameter begins with "FM". This means that zeros and blanks are suppressed. This can be seen in the examples below.
to_char(sysdate, 'FMMonth DD, YYYY'); would return 'July 9, 2003' to_char(sysdate, 'FMMON DDth, YYYY'); would return 'JUL 9TH, 2003' to_char(sysdate, 'FMMon ddth, YYYY'); would return 'Jul 9th, 2003'
The zeros have been suppressed so that the day component shows as "9" as opposed to "09".
Oracle函数to_char转化数字型指定小数点位数的用?/strong>
to_charQ函数功能,是数值型或者日期型转化为字W型?/p>
比如最单的应用Q?/p>
接下来再看看下面Q?/p>
上面的结?'.123' 在大多数情况下都不是我们惌的结果,我们惌的应该是 '0.123'?/p>
我们来看一下to_char函数的具体用法:
TO_CHAR ( n [, fmt [, 'nlsparam']] )
通过上面的了解,再查看fmt的一些格式,我们可以用以下表辑ּ得到'0.123'的|
' 0.123'是出来了Q可是前面又多了一个空根{?/p>
对于 100.12 的值却?#####Q以?1.12'的值变成了 '1.120'?/p>
我们重新定一个新的需求:
1、去I格
2、小数点最?位,最保?位?/p>
1--->'1.00'Q?.1--->'1.00'Q?.12-->'1.12'Q?.1234--->'1.1234'Q?/p>
1.12345--->'1.1235'
最l实现如下:
PLSQL经验一?Oracle的to_char()函数功能很强大但是在用它格式化数值型数据时应该请注意以下几项。如果是数如:0.23q样的数据经qto_char后再昄会变?23Q如果你Z让它昄出原来的0.23的话得用To_char(要格式化的数?’0.999’)保留三个数Qƈ昄但这里就要注意了。他Z截取数的时候是四舍五入了。所以如果是要求截掉数而不四舍五入的话应该自己写个函数截下去后再规格化。以保证它不四舍五入?
二?To_char(1.9999,’FM90.0999’)q个函数规格化时90.0999的含义是?的地方如果有数字显C如果没有数字就不显C,?的地方在没有数字的时候也会有Q来占位.但这样做也有一个很大的~点,是如果是整数时它也仍然会显C?#8221;.”,不要瞧q个?一般来讲页面上要显C的话这个点是多余?也给我们造成了不的ȝ.q要自己再写函数来把q个点搞定.
三?对于日期型的Oracle倒时提供了一个好的处理方?可以把日期做成数值型?然后再To_charp昄Z所需要的cd?
四?在用select into时一定要注意,q种Ҏ你一定要认肯定会有数据被查出时才能使用.如果查询l果为空时会D报错.q有一U情冉|查出来的数据是多条也会报?所以应该尽量便宜游标来?会减错误生的机率.
五?q有注意一点rownum不支持排?是说你想用q个来控制行数的话就会发C没有按你指定的排序方式显C?,q是一个很隑֊的事.而且如果你用rownum=2q样的语句来输出W二行的话也是行不通的. 六?最恶心的一ҎOracle对null的判断变态到极点.如果你说某个变量 aa=null它是判断不出来的.管aa的确是空.即在选择条g里也是判断不出来?不知道ؓ什?只好用nvl()q个函数来判断了.在条件之外可以用 aa is null 来判?
?补充一?是在写存储q程时要注意参数名不能与数据库字D名相同.否则Oracle会把q个参数名看成是字段名的,即你用表的别名区分也不?所以v参数名的时候一定要注意q点.?
-------------
SELECT TO_CHAR(SYSDATE,'YYMMDD') FROM DUAL
l果: 080924
如何学习Oracle
l常有一些Oracle的初学者问到这个问题,q里是一个统一{复?
1、如果有一定的数据库基Q知道SQL是怎么回事Q即使写不出来简单的SQLQ但可以看动它们Q你可以蟩?。否则请先看一下数据库基础和SQL语言Q不需要很深,更不需要去记忆那些复杂的SQL命oQ这些可以留在以后边应用边学习、记忆?/span>
2、要惛_好ORACLEQ首先要学习ORACLE的体pȝ构,现在你不需要深入理解它们,但要分清几个关键的概念:
instance & database, memory structure , process & those files ,such as data file, control file, init parameter file etc 以及database , tablespace , data file和tablespace, segmnet, extent & block它们之间的关pR?/span>
当然q要分清undo tablespace & redo log file{,
对于很多初学者来_能够对这些概忉|个较为清晰的认识q不是一件容易的事,而这些ƈ非Oracle的全部?/span>
3?是有关ORACLE的一些基本概念,下面要学习的是一些简单的的实际操作,是如何ȝ理ORACLE数据库,当然不是理全部的ORACLE。在此过E中你将对SQL和ORACLE体系l构有个更深入的了解?/span>
4、到了这一步你基本上算是初步掌握了ORACLEQ下面将要根据你的方向来具体学习其它的ORACLE知识了。如果你是开发h员,则需要更多地d习PL/SQL以及DEVELOPERQ而这是一门新的课E。如果你是一名DBAQ请l箋?/span>
5、现在你可以Ҏ自己的实际情况,q行有选择的学习,也就是说下面的内Ҏ有特别顺序要求。可以选择深入学习ORACLE的管理、备份与恢复、性能调整、网l等。当然在学习q些知识的过E中Q如果有实际的工作更好,q样你可以在实际中成长,学会TROUBLE SHOOTING?/span>
6、当然在学习的过E中Q你可以在网站或论坛中与他hq行交流Q可以看别h的一些经验文章,也可以自己写一些心得体会?/span>
我说一下我学习oracle的经?/span>
必须对insert/update/delete/select很熟?br />
q是基本?br />
OS
在NT上安装OEM可以帮助你理解Oracle 的objects 的概?br />
熟悉对应的SQL语句
Linux上的oracle也必要?br />
所以你要熟悉linux的命?br />
q是你提高的必经之\
架构
理解Oracle的结?br />
什么是instance/db/tablespace/datafile/segment/rollback segment
initSID.ora file/password file
书很?买本,M3?br />
数据字典
q一兛_难过?br />
那么多数据字?记忆h好麻?br />
不过q是要记...
不过如果你是DBA那就好多?br />
每天接触q些字典
你肯定有你熟悉的数据字典
用v来也很顺?br />
Tuning
DBA的最高境?也是个永恒的话题
g
大型的数据库肯定不在PCZ
一般的大机器都有硬件厂商的支持
你要了解一些硬件知?br />
如光U通道/RAID/HA/
q有存储
你要知道
volumn manage/AIX lvm{等
软g
一U以上的Unixpȝ
solaris/AIX/HPUnix/Sco unix/Tru64 etc
OCP
OCP的资料一定是要看?br />
考不考由?br />
OCM
哈哈q个?..据说和CCIE差不?br />
国内q没有考试,要去HK
Oracle公司
如果你能去oracle公司,?...........h吃饭?br />
哈哈
如何学习Oracle-eygle的方法经验谈
很多朋友l常问v学习Oracle的方法,在这里我把写在《Oracle数据库性能优化》一书前面的话脓在这里,供大家参考!
-------------------------------------------------------------------------------
l常有朋友会问,应该如何学习OracleQ怎样才能快速提高?我把自己的一点心得写在这里,供大家参考?/span>
其实学习M东西都是一P没有太多的捷径可赎ͼ必须打好了坚实的基础Q才有可以在q一步学习中得到快速提高?br /> 王国l在他的《h间词话》中曄概括了ؓ学的三种境界Q我在这里套用一下:
古今之成大事业、大学问者,|不l过三种之境界?br />
“昨夜襉K凋碧树。独上高|望尽天路?#8221;此第一境界也?br />
“衣带渐宽l不悔,Z消得人憔悴?#8221;此第二境界也?br />
“众里M千百度,蓦然回首Q那人却在灯火阑珊处?#8221;此第三境界也?/span>
学习OracleQ这也是你必ȝ历的三种境界?br /> W一层境界是_学习的\是O漫的Q你必须做好充分的思想准备Q如果半途而废q不如不要开始?br /> q里Q注意一??字,在开始学习的q程中,你必d分阅读Oracle的基文档Q概忉|册、管理手册、备份恢复手册等Q这些你都可以在http://tahiti.oracle.com 上找刎ͼQOCP认证的教材也值得仔细阅读。打好基之后你才具备了进一步提升的能力Q万丈高楼都是由地而v?/span>
W二层境界是_管l历挫折、打凅R灰心、沮丧,也都要坚持不攑ּQ具备了基础知识之后Q你可以对自己感兴趣或者工作中遇到的问题进行深入的思考,由浅入深从来都不是轻而易丄Q甚臛_多时候你会感到自己停滞不前了Q但是不要动摇,学习及理解上的突破也需要时间?/span>
W三ơ境界是_l历了那么多努力以后Q你会发玎ͼ那苦苦思考的问题Q那百思不得其解的法原理Q原来答案就在手边,你的思\豁然开朗,宛如拨云见月。这个时候,学习对你来说Q不再是个难题,也许是种享受Q也许成术?/span>
所以如果你想问我如何速成Q那我是没有{案的?br /> 不经一番寒彻骨Q哪得梅花扑鼻香?/span>
当然q三U境界在实际中也许是交叉的,在不断的学习中,不断有蓦然回首的收获?br /> 我自己在学习的过E中Q经常是采用"q及面??br /> 当遇C个问题后Q一定是深入下去Q穷I根本,q样你会发现Q一个简单的问题也必定会带v一大片的知识点Q如果你能对很多问题q行深入思考和研究Q那么在深处Q你会发玎ͼq些面逐渐接合Q慢慢的延到oracle的所有层面,逐渐的你p融会贯通。这时候,你会d的去试全面学习OracleQ扫除你的知识盲点,学习已经成ؓ一U需要?br /> 由实践触发的学习才最有针Ҏ,才更能让你深入的理解书本上的知识Q正所谓:“U怸得来l觉,l知此事要躬?#8221;。实늚l验于我们是至ؓ宝贵的?/span>
如果说有Q那么这Q就是我的捷径?/span>
x自己Q经常是"每有所P便欣然忘?Q兴才是我们最好的老师?/span>
Oracle的优化是一门学问,也是一门艺术,理解透彻了,你会知道Q优化不q是在各U条件之下做出的均衡与折中?br /> 内存、外存;CPU、IO...对这一切你都需要有充分的认识和相当的了解,理数据库所需要的知识q不单纯?/span>
作ؓ一个数据库理人员Q你需要做的就是能够根据自q知识以及l验在各U复杂情况下做出快速正的判断。当问题出现Ӟ你需要知道用怎样的手D发现问题的ҎQ找到问题之后,你需要运用你的知识找到解决问题的Ҏ?br /> q当然ƈ不容易,N若轻q是举轻若重Q取决于你具备怎样的基以及l验U篏?/span>
在网l上QHoward J. Rogers最q创造了一个新词组:Voodoo TuningQ用以Ş定w些没有及时更新自q知识技能的所谓的Oracle技术专家。由于知识的陈旧或者理解的肤浅Q他们提供的很多调整是错误的、容易解的Q甚x荒诞的。他们提供的某些在有些情况下也许是正的Q如果你愿意回到Oracle5版或?版的q代Q但是这些徏议在Oracle7.0,8.0 或?Oracle8i以后往往是完全错误的?br /> 后来ZcM问题触发了互联网内Oracle高手的一pd深入讨论QTOM、Jonathan Lewis、HJR{h都参与其中,在我的网站上( www.eygle.com )上对q些内容及相关链接作了简要介l,有兴的可以参考?/span>
HJRl我们提了很好的一个提C?对你所需要调整的内容Q你必须h充分的认识,否则你做出的判断有可能是错误的?br /> q也是我想给自己和大家的一个徏?学习和研IOracleQ严谨和认真必不可少?br /> 当然你还需要勤奋,我所熟悉的在Oracle领域有所成就的技术h员,他们共同的特点就是勤奋?br /> 如果你觉得掌握的东西没有别h多,那么也许是因ؓQ你不如别h勤奋?/span>
要是你觉得这一切过于复杂了Q那我还有一句简单的话送给大家:不积跬步Q无以至千里。学习正是在逐渐U篏q程中的提高?/span>
现在Itpubl我们提供了很好的交场所Q很多问题都可以在这里找到答案,互相讨论Q互相学习。这是我们的q运Q我也因此非常感谢这个网l时代?/span>
Itpub的第二本书即出版,谨以此祝愿Itpub来好Q也愿我们的书能l大家带来知识和帮助?/span>
- Eygle 2005-03-09 于北?/span>
q类语句是用来徏立数据库基本lg的,例如建立表,建立视图{等。包?/span>create语句?/span>drop语句?/span>alter语句、truncate、comment、grant、revoke
q类语句的作用是Ҏ需要写入、删除、更新数据库中的数据。主要包?/span>select、insert、update、delete、call、explain、lock table
q类语句主要用来实现用户的权限授予或者取消,保证数据的安全性。主要包?/span>COMMIT、SAVEPOINT、ROLLBACK、SET TRANSACTION
Oracle的数据库对象分ؓ五种Q表Q视图,序列Q烦引和同义词?/span>
视图是基于一个表或多个表或视囄逻辑表,本n不包含数据,通过它可以对表里面的数据q行查询和修攏V视囑֟于的表称为基表?/span>
视图是存储在数据字典里的一?/span>select语句?/span>通过创徏视图可以提取数据的逻辑上的集合或组合?/span>
视图的优点:
1.Ҏ据库的访问,因ؓ视图可以有选择性的选取数据库里的一部分?/span>
2.用户通过单的查询可以从复杂查询中得到l果?/span>
3.l护数据的独立性,试图可从多个表检索数据?/span>
4.对于相同的数据可产生不同的视图?/span>
视图分ؓ单视囑֒复杂视图Q?/span>
单视囑֏从单表里获取数据
复杂视图从多?/span>
单视图不包含函数和数据组
复杂视图包含
单视囑֏以实?/span>DML操作
复杂视图不可?/span>.
视图的创建:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
其中Q?/span>
OR REPLACE Q若所创徏的试囑ַl存在,ORACLE自动重徏该视图;
FORCE Q不基表是否存?/span>ORACLE都会自动创徏该视图;
NOFORCE Q只有基表都存在ORACLE才会创徏该视图:
alias Qؓ视图产生的列定义的别名;
subquery Q一条完整的SELECT语句Q可以在该语句中定义别名Q?/span>
WITH CHECK OPTION Q?/span>
插入或修改的数据行必L囑֮义的U束Q?/span>
WITH READ ONLY Q?/span>
该视图上不能q行MDML操作?/span>
例如Q?/span>
CREATE OR REPLACE VIEW dept_sum_vw
(name,minsal,maxsal,avgsal)
AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.dname;
视图的定义原则:
1.视图的查询可以用复杂的SELECT语法Q包括连?/span>/分组查询和子查询Q?/span>
2.在没?/span>WITH CHECK OPTION?/span> READ ONLY 的情况下Q查询中不能使用
ORDER BY 子句Q?/span>
3.如果没有?/span>CHECK OPTIONU束命名Q系l会自动Z命名QŞ式ؓSYS_Cn;
4.OR REPLACE选项可以不删除原视图便可更改其定义ƈ重徏Q或重新授予对象
权限?/span>
视图的查询:
视图创徏成功后,可以从视图中索数据,q点和从表中索数据一栗?/span>
q可以查询视囄全部信息和指定的数据行和列?/span>
如:
索数据:
SQL>SELECT * FROM dept_sum_vwQ?/span>
查询视图定义Q?/span>
SELECT view_name,text from user_views;
其中text昄的内容ؓ视图定义?/span>SELECT语句Q可通过DESC USER_VIEWS
得到相关信息?/span>
修改视图Q?/span>
通过OR REPLACE 重新创徏同名视图卛_?/span>
视图上的DML 操作Q?/span>
DML操作应遵循的原则Q?/span>
1.单视囑֏以执?/span>DML操作Q?/span>
2.在视囑?/span>GROUP 函数Q?/span>GROUP BY子句Q?/span>DISTINCT关键字时不能
删除数据行;
3.在视图不出现下列情况时可通过视图修改数据或插入数据:
a.视图中包?/span>GROUP 函数Q?/span>GROUP BY子句Q?/span>DISTINCT关键字;
b.使用表达式定义的列;
c.ROWNUM伪列?/span>
d.中未在视图中选择的其他列定义为非IZ无默认倹{?/span>
视图可用于保持数据库的完整性,但作用有限?/span>
通过视图执行引用完整性约束可在数据库U执行约束?/span>
WITH CHECK OPTION 子句限定Q?/span>
通过视图执行?/span>INSERTS?/span>UPDATES操作不能创徏该视图检索不到的数据行,
因ؓ它会Ҏ入或修改的数据行执行完整性约束和数据有效性检查?/span>
例如Q?/span>
CREATE OR REPLACE VIEW vw_emp20
AS SELECT * FROM emp
WHERE deptno=20
WITH CHECK OPTION constraint vw_emp20_ck;
视图已徏立?/span>
查询l果Q?/span>
SELECT empno,ename,job FROM vw_emp20;
EMPNO ENAME JOB
--------------------- -------------- -------------
7369 SMITH CLERK
7566 JONES MANAGER
7902 FORD ANALYST
修改Q?/span>
UPDATE vw_emp20
SET deptno=20
WHERE empno=7902;
生错误:
UPDATE vw_emp20
*
ERROR 位于W一行:
ORA-01402Q视?/span>WITH CHECK OPTION q反WHERE 子句
视图的删除:
DROP VIEW VIEW_NAME语句删除视图?/span>
删除视图的定义不影响中的数据?/span>
只有视图所有者和具备DROP VIEW权限的用户可以删除视图?/span>
视图被删除后Q基于被删除视图的其他视图或应用无效?/span>
用来查询数据库,获取记录集合Q结果集Q的指针Q可以让开发者一ơ访问一行结果集Q在每条l果集上作操作?/span>
分类Q?/span>
静态游标:
分ؓ昑ּ游标和隐式游标?/span>
REF游标Q?br /> 是一U引用类型,cM于指针?/span>
昑ּ游标Q?/span>
CURSOR 游标?( 参数 ) [q回值类型] IS
Select 语句
生命周期Q?/span>
1.打开游标(OPEN)
解析Q绑定。。。不会从数据库检索数?/span>
2.从游标中获取记录(FETCH INTO)
执行查询Q返回结果集。通常定义局域变量作Z游标获取数据的缓冲区?/span>
3.关闭游标(CLOSE)
完成游标处理Q用户不能从游标中获取行。还可以重新打开?/span>
选项Q参数和q回cd
(1).
declare
cursor emp_cur ( p_deptid in number) is
select * from employees where department_id = p_deptid;
l_emp employees%rowtype;
begin
dbms_output.put_line('Getting employees from department 30');
open emp_cur(30);
loop
fetch emp_cur into l_emp;
exit when emp_cur%notfound;
dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');
dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);
end loop;
close emp_cur;
dbms_output.put_line('Getting employees from department 90');
open emp_cur(90);
loop
fetch emp_cur into l_emp;
exit when emp_cur%notfound;
dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');
dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);
end loop;
close emp_cur;
end;
(2).
declare
CURSOR DEPT_CR IS SELECT DEPT_ID,DEPT_NAME FROM DEPT;
W_ID NUMBER;
W_NAME VARCHAR2(240);
begin
OPEN DEPT_CR;
LOOP
FETCH DEPT_CR INTO W_ID,W_NAME;
EXIT WHEN DEPT_CR%NOTFOUND;
DBMS_OUTPUT.put_line(W_ID||' '||W_NAME);
END LOOP;
CLOSE DEPT_CR;
end;
(3).
declare
CURSOR DEPT_CR IS SELECT DEPT_ID,DEPT_NAME FROM DEPT;
DEPT_REC DEPT_CR%ROWTYPE;
begin
OPEN DEPT_CR;
LOOP
FETCH DEPT_CR INTO DEPT_REC;
EXIT WHEN DEPT_CR%NOTFOUND;
DBMS_OUTPUT.put_line(DEPT_REC.DEPT_ID);
END LOOP;
CLOSE DEPT_CR;
end;
隐式游标Q?/span>
不用明确建立游标变量Q分两种Q?br /> 1.在PL/SQL中用DML语言Q用ORACLE提供的名为SQL的隐C游?br /> 2.CURSOR FOR LOOPQ用于for loop 语句
1举例Q?/span>
declare
begin
update departments set department_name=department_name;
--where 1=2;
dbms_output.put_line('update '|| sql%rowcount ||' records');
end;
2举例Q?/span>
declare
begin
for my_dept_rec in ( select department_name, department_id from departments)
loop
dbms_output.put_line(my_dept_rec.department_id || ' : ' || my_dept_rec.department_name);
end loop;
end;
3举例Q?/span>
单独select
declare
l_empno emp.EMPLOYEE_ID%type;
-- l_ename emp.ename%type;
begin
select EMPLOYEE_ID
into l_empno
from emp;
--where rownum =1;
dbms_output.put_line(l_empno);
end;
使用INTO获取|只能q回一行?/span>
游标属性:
%FOUNDQ变量最后从游标中获取记录的时候,在结果集中找C记录?br /> %NOTFOUNDQ变量最后从游标中获取记录的时候,在结果集中没有找到记录?br /> %ROWCOUNTQ当前时dl从游标中获取的记录数量?br /> %ISOPENQ是否打开?/span>
隐式游标:
declare
CURSOR DEPT_CR IS SELECT DEPT_ID,DEPT_NAME FROM DEPT;
begin
FOR DEPT_REC IN DEPT_CR
LOOP
DBMS_OUTPUT.put_line(DEPT_REC.DEPT_ID||' '||DEPT_REC.DEPT_NAME);
END LOOP;
end;
昑ּ和隐式游标的区别Q?/span>
量使用隐式游标Q避免编写附加的游标控制代码Q声明,打开Q获取,关闭Q,也不需要声明变量来保存从游标中获取的数据?/span>
REF CURSOR游标Q?/span>
动态游标,在运行的时候才能确定游标用的查询。分c:
强类型(限制QREF CURSORQ规定返回类?
q型(非限ӞREF CURSORQ不规定q回cdQ可以获取Q何结果集?/span>
TYPE ref_cursor_name IS REF CURSOR [RETURN return_type]
Declare
Type refcur_t is ref cursor;
Type emp_refcur_t is ref cursor return employee%rowtype;
Begin
Null;
End;
举例:
declare
TYPE TY_DEPTREFCUR IS REF CURSOR;
CR_DEPT TY_DEPTREFCUR;
REC_DEPT DEPT%ROWTYPE;
begin
OPEN CR_DEPT FOR
SELECT * FROM DEPT;
LOOP
FETCH CR_DEPT INTO REC_DEPT;
EXIT WHEN CR_DEPT%NOTFOUND;
DBMS_OUTPUT.put_line(REC_DEPT.DEPT_ID||' '||REC_DEPT.DEPT_NAME);
END LOOP;
CLOSE CR_DEPT;
end;
强类型D例:
declare
--声明记录cd
type emp_job_rec is record(
employee_id number,
employee_name varchar2(50),
job_title varchar2(30)
);
--声明REF CURSORQ返回gؓ该记录类?br />
type emp_job_refcur_type is ref cursor
return emp_job_rec;
--定义REF CURSOR游标的变?br />
emp_refcur emp_job_refcur_type;
emp_job emp_job_rec;
begin
open emp_refcur for
select e.employee_id,
e.first_name || ' ' ||e.last_name "employee_name",
j.job_title
from employees e, jobs j
where e.job_id = j.job_id and rownum < 11 order by 1;
fetch emp_refcur into emp_job;
while emp_refcur%found loop
dbms_output.put_line(emp_job.employee_name || '''s job is ');
dbms_output.put_line(emp_job.job_title);
fetch emp_refcur into emp_job;
end loop;
end;
ORACLE8i是不直接支持完全外连接的语法Q也是说不能在左右两个表上同时加上(+)Q下面是在ORACLE8i可以参考的完全外连接语?br />
select t1.id,t2.id from table1 t1,table t2 where t1.id=t2.id(+)
union
select t1.id,t2.id from table1 t1,table t2 where t1.id(+)=t2.id
q接cd | 定义 | 囄 | 例子 |
内连?/font> | 只连接匹配的?/font> | ![]() |
select A.c1,B.c2 from A join B on A.c3 = B.c3; |
左外q接 | 包含左边表的全部行(不管双的表中是否存在与它们匚w的行Q以及右边表中全部匹配的?/font> | ![]() |
select A.c1,B.c2 from A left join B on A.c3 = B.c3; |
叛_q接 | 包含双表的全部行(不管左边的表中是否存在与它们匚w的行Q以及左边表中全部匹配的?/font> | ![]() |
select A.c1,B.c2 from A right join B on A.c3 = B.c3; |
全外q接 | 包含左、右两个表的全部行,不管在另一边的表中是否存在与它们匹配的?/font> | ![]() |
select A.c1,B.c2 from A full join B on A.c3 = B.c3; |
QthetaQ连?/font> | 使用{g外的条g来匹配左、右两个表中的行 | ![]() |
select A.c1,B.c2 from A join B on A.c3 != B.c3; |
交叉q接 | 生成W卡积——它不用Q何匹配或者选取条gQ而是直接一个数据源中的每个行与另一个数据源的每个行一一匚w | select A.c1,B.c2 from A,B; |
CREATE OR REPLACE TRIGGER trigger_name AFTER|BEFORE INSERT ON table_name FOR EACH ROW [WHEN (Boolean expression)] DECLARE Local declarations BEGIN Trigger Body written PL/SQL END;
2.TYPE IS TABLE OF
如果想用PL/SQL表中的具体一?再加?
TYPE cg$table_type IS TABLE OF I_FIELD_MAPPED_COLUMN%ROWTYPE
INDEX BY BINARY_INTEGER;
cg$table cg$table_type;
--cg$I_FIELD_MAPPED_COLUMN包名
idx BINARY_INTEGER := 1;
cg$I_FIELD_MAPPED_COLUMN.cg$table(cg$I_FIELD_MAPPED_COLUMN.idx).FIELD_MAPPED_COLUMN_ID
:= cg$rec.FIELD_MAPPED_COLUMN_ID;
清空临时表空?/p>
1.startup --启动数据?/p>
2.创徏中{临时表空?nbsp;
CREATE TEMPORARY TABLESPACE TEMP2
TEMPFILE 'D:\ORACLE\ORADATA\DB\DATAFILE\TEMP_T02.DBF' SIZE 200M
3.改变~省临时表空?为刚刚创建的C时表I间temp2
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP2;
4.删除原来临时表空?br /> DROP TABLESPACE TEMP_T INCLUDING CONTENTS AND DATAFILES;
5.重新创徏临时表空?br />
CREATE TEMPORARY TABLESPACE TEMP_T
TEMPFILE 'D:\ORACLE\ORADATA\DB\DATAFILE\TEMP_T011.DBF' SIZE 10M
6.重置~省临时表空间ؓ新徏的temp_t表空?br /> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP_T;
7.删除中{用时表I间
DROP TABLESPACE TEMP2 INCLUDING CONTENTS AND DATAFILES;
8.重新指定用户表空间ؓ重徏的时表I间
ALTER USER IDA TEMPORARY TABLESPACE TEMP_T;
从两个表辑ּq回一个非 null 倹{?br />
select nvl(a.name,'I得') as name from student a join school b on a.ID=b.ID 注意Q两个参数得cd要匹?/p>
2.TO_CHAR(date,'format') TO_CHAR(SYSDATE,'YY 3.Oracle函数之substr substr函数有三个参敎ͼ允许你将目标字符串的一部䆾输出Q?/p>
W一个参Cؓ目标字符Ԍ W二个字W串是将要输出的子串的v点, W三个参数是要输出的子串的长度?br />
substr('ABCDEFG', 2, 3) = 'BCD' 例子2Q?/p>
substr('ABCDEFG', -2) = 'FG' substr('ABCDEFG', -4) = 'DEFG'
语法
NVL(eExpression1, eExpression2)
参数
eExpression1, eExpression2
如果 eExpression1 的计结果ؓ null |?NVL( ) q回 eExpression2。如?eExpression1 的计结果不?null |则返?eExpression1。eExpression1 ?eExpression2 可以是Q意一U数据类型。如?eExpression1 ?eExpression2 的结果皆?null |?NVL( ) q回 .NULL.?br />
q回值类?/strong>
字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null ?br />
说明
在不支持 null 值或 null 值无关紧要的情况下,可以使用 NVL( ) 来移去计或操作中的 null 倹{?/p>
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
-------------------
2004/05/09 21:14:41
select TO_CHAR(1,'FM09') from dual result: 0
例子1Q?/p>
如果W二个参Cؓ负数Q那么将会从源串的尾部开始向前定位至负数的绝对值的位置?/p>
4.Oracle 函数之round
描述 : 传回一个数|该数值是按照指定的小C元数q行四舍五入q算的结果?
SELECT ROUND( number, [ decimal_places ] ) FROM DUAL
参数:
number : Ʋ处理之数?
decimal_places : 四舍五入 , 数取几?( 预设?0 )
Sample :
select round(123.456, 0) from dual; 回传 123
select round(123.456, 1) from dual; 回传 123.5
select round(123.456, 2) from dual; 回传 123.46
不过最大长度不会超q?6?br />
SELECT ROUND(112211111111263.451,6) FROM DUAL; 回传112211111111263
]]>
1。select * from v$nls_parameters
查询nls的参敎ͼ获得数据库服务器端的字符~码
NLS_LANGUAGE
NLS_CHARACTERSET
2。修Ҏ地环境变量,讄
NLS_LANG = SIMPLIFIED CHINESE.ZHS16GBK //q个是我们的数据库字W编?/p>
NLS_LANG格式Q?br />
NLS_LANG = language_territory.charset
有三个组成部分(语言、地域和字符集)Q每个成分控制了NLS子集的特性。其中:language 指定服务器消息的语言?br />
territory 指定服务器的日期和数字格式?br />
charset 指定字符?
需要保证要讄客户端字W集与服务器端字W集一?/span>
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, EZCONNECT, ONAMES, HOSTNAME)
W一行是可以用计机的名U默认登录,如果你的文g中没有这一行,则不能用计算机名dQ像我们在SQL*PLUS中,可以用这样SQL>sqlplus / as sysdba 方式q行dQ? ׃表以本机;
W二行就是用数据库的用户名和密码q行d?br />
listener.ora是你要d本机数据库时的监听配|,当你要远E登录其它计机的数据库时这个就不用Q有q个你就得开启相应的监听服务E序?br />
tnsnames.ora 的配|就是你用像PL/SQLd数据库时Q弹出的d界面W三行可以选择的数据库名;我们可以在里面写多个q接q程数据库的代码D,当连接远E数据库时就不用开启本机的数据库服务和监听服务
l段代码好明?br />
VERSION9 = //自己命名的,昄在登录数据库时可选的数据?br />
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = version9)(PORT = 1521)) //host计算机名Qport端口?br />
)
(CONNECT_DATA =
(SERVICE_NAME = db) //db数据库名
)
)
2. Oracle数据导入导出 imp/exp
功能Q?a class="keyword" >Oracle数据导入导出imp/expq当与oracle数据q原与备份?br />
大多情况都可以用Oracle数据导入导出完成数据的备份和q原Q不会造成数据的丢失)?br />
查询服务器的字符?br />
select * from nls_database_parameters t where t.parameter = 'NLS_CHARACTERSET'
如果 value=utf8
则设|客LNLS_LANG=AMERICAN_AMERICA.UTF8
其它的字W集
AMERICAN_AMERICA.WE8ISO8859P1
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
导出:
exp scott/tiger tables=(s_region) file=d:\scott.dmp log=d:\scott.log
导入:
imp scott/tiger file=d:\scott.dmp tables=(s_region) ignore=y
imp userid=dbown/dbown@db file=staff.dmp ignore=y log=staff_imp.log
我发现没有后面的ignore=y(忽略为yes)导入会有?在数据库中查不到数据
3. 理数据
/*create index*/
example:
/*创徏一般烦?/
create index index_name on table_name(column_name) tablespace tablespace_name;
/*创徏位图索引*/
create bitmap index index_name on table_name(column_name1,column_name2) tablespace tablespace_name;
/*索引中不能用pctused*/
create [bitmap] index index_name on table_name(column_name) tablespace tablespace_name pctfree 20 storage(inital 100k next 100k) ;
/*大数据量的烦引最好不要做日志*/
create [bitmap] index index_name table_name(column_name1,column_name2) tablespace_name pctfree 20 storage(inital 100k next 100k) nologging;
/*创徏反{索引*/
create index index_name on table_name(column_name) reverse;
/*创徏函数索引*/
create index index_name on table_name(function_name(column_name)) tablespace tablespace_name;
/*时创建约束条?/
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;
/*l创建bitmap index分配的内存空间参敎ͼ以加速徏索引*/
show parameter create_bit;
/*改变索引的存储参?/
alter index index_name pctfree 30 storage(initial 200k next 200k);
/*l烦引手工分配一个分?/
alter index index_name allocate extent (size 200k datafile '$ORACLE/oradata/..');
/*释放索引中没用的I间*/
alter index index_name deallocate unused;
/*索引重徏*/
alter index index_name rebuild tablespace tablespace_name;
/*普通烦引和反{索引的互?/
alter index index_name rebuild tablespace tablespace_name reverse;
/*重徏索引Ӟ不锁?/
alter index index_name rebuild online;
/*l烦引整理碎?/
alter index index_name COALESCE;
/*分析索引,事实上是更新l计的过E?/
analyze index index_name validate structure;
desc index_state;
drop index index_name;
alter index index_name monitoring usage;-----监视索引是否被用?
alter index index_name nomonitoring usage;----取消监视
/*有关索引信息的视?/
select * from dba_indexes/dba_ind_columns/dbs_ind_expressions/v$object_usage;
########## 数据完整性的理(Maintaining data integrity) ##########
alter table table_name drop constraint constraint_name;----drop U束
alter table table_name add constraint constraint_name primary key(column_name1,column_name2);-----创徏主键
alter table table_name add constraint constraint_name unique(column_name1,column_name2);---创徏唯一U束
/*创徏外键U束*/
alter table table_name add constraint constraint_name foreign key(column_name1) references table_name(column_name1);
/*不效验老数据,只约束新的数据[enable/disableQ约?不约束新数据;novalidate/validate:不对/对老数据进行验证]*/
alter table table_name add constraint constraint_name check(column_name like 'B%') enable/disable novalidate/validate;
select 'ALTER TABLE '||TABLE_NAME||' MODIFY CONSTRAINT '||CONSTRAINT_NAME||' ENABLE NOVALIDATE;'
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('STAFFBASE','STAFFCLAIM','STAFFJOB','STAFFPAY','STAFFREF','STAFFTIME','STAFF')
/*修改U束条gQg旉证,commit旉?/
alter table table_name modify constraint constraint_name initially deferred;
/*修改U束条gQ立即验?/
alter table table_name modify constraint constraint_name initially immediate;
alter session set constraints=deferred/immediate;
/*drop一个有外键的主键表,带cascade constraints参数U联删除*/
drop table table_name cascade constraints;
/*当truncate外键表时Q先外键设为无效,再truncate;*/
truncate table table_name;
/*讄束条件无?/
alter table table_name disable constraint constraint_name;
alter table table_name enable novalidate constraint constraint_name;
/*无效约束的数据行放入exception的表中,此表记录了违反数据约束的行的行号Q在此之前,要先建exceptions?/
alter table table_name add constraint constraint_name check(column_name >;15) enable validate exceptions into exceptions;
/*q行创徏exceptions表的脚本*/
start $ORACLE_HOME/rdbms/admin/utlexcpt.sql;
/*获取U束条g信息的表或视?/
select * from user_constraints/dba_constraints/dba_cons_columns;
4.Devloper Form 6i 中导入Javacd?
PDE-UJI002: Unable to find required Java importer classes 问题的解x?br />
讄classpath=.;C:\orant\TOOLS\COMMON60\JAVA\IMPORTER.JAR
5.数据库文?br />
a.查询数据文g
SELECT * FROM DBA_TABLESPAC
b.查看表空间的IZ大小
SELECT TABLESPACE_NAME,SUM(BYTES/1024/1024) MB FROM DBA_FREE_SPACE GROUP BY
TABLESPACE_NAME;
c. 查看数据文g存放路径
SELECT TABLESPACE_NAME,BYTES/1024/1024 FILE_SIZE_MB,FILE_NAME FROM DBA_DATA_FILES;
查询Oracle日期格式
----------------------------------
select * from nls_database_parameters;
得到l果如下? 表中NLS_DATE_FORMAT表示日期格式.
PARAMETER VALUE
----------------------------------- -----------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET ZHS16GBK
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_NCHAR_CHARACTERSET ZHS16GBK
NLS_RDBMS_VERSION 8.1.7.0.0
或者查询V$NLS_PARAMETERS?
select * from V$NLS_PARAMETERS;
也有cMl果
SQL>select to_date('2004-11-12 12-07-32','yyyy-mm-dd hh24-mi-ss') value from dual;
VALUE
-------------------
2004.11.12 12:07:32
SQL>select to_date('20041015') value from dual;
VALUE
-------------------
2004.10.15 00:00:00
SQL>select to_date('20041315') value from dual;
ERROR 位于W?1 ?
ORA-01861: 文字与格式字W串不匹?
sysdate 当前日期和时?
SQL>select sysdate value from dual;
VALUE
-------------------
2003.11.23 17:09:01
last_day 本月最后一?
SQL>select last_day(sysdate) value from dual;
VALUE
-------------------
2003.11.30 17:08:17
add_months(d,n) 日期d后推n个月
SQL>select add_months(sysdate,2) value from dual;
VALUE
-------------------
2005.01.23 17:10:21
next_day(d,day) 日期d之后的第一周中,指定的那?指定星期的第几天)是什么日?
SQL>select next_day(sysdate,1) value from dual;
VALUE
-------------------
2004.11.28 17:38:55
[oracle/plsql]oracle日期处理完全?/p>
日期处理完全?
TO_DATE格式
Day:
dd number 12
dy abbreviated fri
day spelled out friday
ddspth spelled out, ordinal twelfth
Month:
mm number 03
mon abbreviated mar
month spelled out march
Year:
yy two digits 98
yyyy four digits 1998
24时格式下时间范围ؓQ?0:00:00 - 23:59:59....
12时格式下时间范围ؓQ?1:00:00 - 12:59:59 ....
1.
日期和字W{换函数用法(to_date,to_charQ?
2.
select to_char( to_date(222,'J'),'Jsp') from dual
昄Two Hundred Twenty-Two
3.
求某天是星期?
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;
星期一
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from
dual;
monday
讄日期语言
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
也可以这?
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')
4.
两个日期间的天数
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;
5. 旉为null的用?
select id, active_date from table1
UNION
select 1, TO_DATE(null) from dual;
注意要用TO_DATE(null)
6.
a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')
那么12?1号中?2点之后和12?L12点之前是不包含在q个范围之内的?
所以,当时间需要精的时候,觉得to_charq是必要?
7. 日期格式冲突问题
输入的格式要看你安装的ORACLE字符集的cd, 比如: US7ASCII, date格式的类型就? '01-Jan-01'
alter system set NLS_DATE_LANGUAGE = American
alter session set NLS_DATE_LANGUAGE = American
或者在to_date中写
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from
dual;
注意我这只是举了NLS_DATE_LANGUAGEQ当然还有很多,
可查?
select * from nls_session_parameters
select * from V$NLS_PARAMETERS
8.
select count(*)
from ( select rownum-1 rnum
from all_objects
where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-
02-01','yyyy-mm-dd')+1
)
where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )
not
in ( '1', '7' )
查找2002-02-28?002-02-01间除星期一和七的天?
在前后分别调用DBMS_UTILITY.GET_TIME, 让后结果相?得到的是1/100U? 而不是毫U?.
9.
select months_between(to_date('01-31-1999','MM-DD-YYYY'),
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1
select months_between(to_date('02-01-1999','MM-DD-YYYY'),
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1.03225806451613
10. Next_day的用?
Next_day(date, day)
Monday-Sunday, for format code DAY
Mon-Sun, for format code DY
1-7, for format code D
11
select to_char(sysdate,'hh:mi:ss') TIME from all_objects
注意Q第一条记录的TIME 与最后一行是一L
可以建立一个函数来处理q个问题
create or replace function sys_date return date is
begin
return sysdate;
end;
select to_char(sys_date,'hh:mi:ss') from all_objects;
12.
获得时?
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer
SQL> select sysdate ,to_char(sysdate,'hh') from dual;
SYSDATE TO_CHAR(SYSDATE,'HH')
-------------------- ---------------------
2003-10-13 19:35:21 07
SQL> select sysdate ,to_char(sysdate,'hh24') from dual;
SYSDATE TO_CHAR(SYSDATE,'HH24')
-------------------- -----------------------
2003-10-13 19:35:21 19
获取q月日与此类?
13.
q月日的处理
select older_date,
newer_date,
years,
months,
abs(
trunc(
newer_date-
add_months( older_date,years*12+months )
)
) days
from ( select
trunc(months_between( newer_date, older_date )/12) YEARS,
mod(trunc(months_between( newer_date, older_date )),
12 ) MONTHS,
newer_date,
older_date
from ( select hiredate older_date,
add_months(hiredate,rownum)+rownum newer_date
from emp )
)
14.
处理月䆾天数不定的办?
select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual
16.
扑և今年的天?
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual
闰年的处理方?
to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )
如果?8׃是闰q?
17.
yyyy与rrrr的区?
'YYYY99 TO_C
------- ----
yyyy 99 0099
rrrr 99 1999
yyyy 01 0001
rrrr 01 2001
18.不同时区的处?
select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate
from dual;
19.
5U钟一个间?
Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')
from dual
2002-11-1 9:55:00 35786
SSSSS表示5位秒?
20.
一q的W几?
select TO_CHAR(SYSDATE,'DDD'),sysdate from dual
310 2002-11-6 10:03:51
21.计算时,?U?毫秒
select
Days,
A,
TRUNC(A*24) Hours,
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds
from
(
select
trunc(sysdate) Days,
sysdate - trunc(sysdate) A
from dual
)
select * from tabname
order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');
//
floor((date2-date1) /365) 作ؓq?
floor((date2-date1, 365) /30) 作ؓ?
mod(mod(date2-date1, 365), 30)作ؓ?
23.next_day函数
next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算赗?
SQL> 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> select status from v$instance; STATUS ------------ MOUNTED SQL>
To open the database for normal access, we can alter the database again.
SQL> alter database open; Database altered.
The shutdown proccess is the simply opposite of the startup.
SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down.
q行 SQL> alter database open; ERROR at line 1:
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: 'E:\SALES_DATA01.DBF'
依次使用
alter database datafiel 'E:\SALES_DATA01.DBF' offline drop;
alter database datafiel 'E:\SALES_DATA02.DBF' offline drop;
{方法把数据文g全部脱机删除,再运行SQL>alter database open;可以了