﻿<?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>IT博客-Java Oracle .net study</title><link>http://www.cnitblog.com/wangbin/</link><description>主要适用于Web开发的应用</description><language>zh-cn</language><lastBuildDate>Mon, 04 May 2026 22:21:23 GMT</lastBuildDate><pubDate>Mon, 04 May 2026 22:21:23 GMT</pubDate><ttl>60</ttl><item><title>oracle学习笔记</title><link>http://www.cnitblog.com/wangbin/archive/2007/09/05/33024.html</link><dc:creator>王彬</dc:creator><author>王彬</author><pubDate>Wed, 05 Sep 2007 14:37:00 GMT</pubDate><guid>http://www.cnitblog.com/wangbin/archive/2007/09/05/33024.html</guid><wfw:comment>http://www.cnitblog.com/wangbin/comments/33024.html</wfw:comment><comments>http://www.cnitblog.com/wangbin/archive/2007/09/05/33024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/wangbin/comments/commentRss/33024.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/wangbin/services/trackbacks/33024.html</trackback:ping><description><![CDATA[&nbsp;
<p align=left><span>1、case表达式</span></p>
<p align=left><span>select country_name,region_id, case region_id when 1 then 'europe' when 2 then 'america' when 3</span></p>
<p align=left><span>then 'asia' else 'other' end continent from countries where country_name like 'I%';</span></p>
<p align=left><span>在9i中提供的case表达式，可以在sql语句中达到if then else逻辑。</span></p>
<p align=left><span>2、order by</span></p>
<p align=left><span>order by子句中可以使用列名，列别名，或者列的位置。位置必须是select-list表达式的数目</span></p>
<p align=left><span>select name，sex from v_table order by 2</span></p>
<p align=left><span>3、oracle单行函数</span></p>
<p align=left><span>通用函数</span></p>
<p align=left><span>nvl(expr1,expr2) 判断第一个字符是否null,是显示expr2</span></p>
<p align=left><span>nvl2(expr1,expr2,expr3) 判断第一字符是否null，是显示expr3,不是显示expr2</span></p>
<p align=left><span>nullif(expr1,expr2)如果两个字符相等，则返回空，否则返回expr1</span></p>
<p align=left><span>coalesce(expr1,expr2,...exprn)判断每个参数是否未空，直到不为空显示出来，如果都是空则报错</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>日期函数</span></p>
<p align=left><span>to_number,to_date,</span></p>
<p align=left><span>to_char(date,'format-model')</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>format-model:</span></p>
<p align=left><span>{</span></p>
<p align=left><span>yyyy full year in numbers</span></p>
<p align=left><span>year year spelled out</span></p>
<p align=left><span>mm two-digit value for month</span></p>
<p align=left><span>month full name of the month</span></p>
<p align=left><span>mon three-letter abbreviation of the month</span></p>
<p align=left><span>dy three-letter abbreviation of the day of the week</span></p>
<p align=left><span>day full name of the day of the week</span></p>
<p align=left><span>dd numeric day of month</span></p>
<p align=left><span>}</span></p>
<p align=left><span>to_char(number,'format-model')</span></p>
<p align=left><span>{</span></p>
<p align=left><span>9 prepresents a number</span></p>
<p align=left><span>0 forces a zero to be displayed</span></p>
<p align=left><span>$ places a floating dollar sign</span></p>
<p align=left><span>L 使用本地货币符号</span></p>
<p align=left><span>. prints a decimal point</span></p>
<p align=left><span>, prints a thousand indicator</span></p>
<p align=left><span>}</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>months_between</span></p>
<p align=left><span>add_months</span></p>
<p align=left><span>next_day</span></p>
<p align=left><span>last_day</span></p>
<p align=left><span>round</span></p>
<p align=left><span>trunc</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>字符函数</span></p>
<p align=left><span>lower，upper，initcap(大小写转化函数)</span></p>
<p align=left><span>initcap('SQL Cource') result is Sql Cource</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>concat，substr,length,instr,lpad|rpad,trim,replace</span></p>
<p align=left><span>concat字符连接，等于||</span></p>
<p align=left><span>substr截断字符串substr(column,1,5)</span></p>
<p align=left><span>substr(column,-1,5)从右边开始取</span></p>
<p align=left><span>length字符长度</span></p>
<p align=left><span>instr字符所在的位置</span></p>
<p align=left><span>trim压缩空格</span></p>
<p align=left><span>lpad左填充</span></p>
<p align=left><span>rpad右填充</span></p>
<p align=left><span>数字函数</span></p>
<p align=left><span>round四舍五入round(45.926,2)---45.93</span></p>
<p align=left><span>trunc截取数字trunc(45.926,2)---45.92</span></p>
<p align=left><span>mod求余数mod(1500,200)--100</span></p>
<p align=left><span>转换函数</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>4、sql*plus</span></p>
<p align=left><span>set wrap off</span></p>
<p align=left><span>set linesize 1000</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>5、case when else end </span></p>
<p align=left><span>6、decode简化的if then else</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>7、oracle中对层次结构数据的递归查询</span></p>
<p align=left><span>create table Dept(</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>DepartNO&nbsp;varchar2(10),</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>DepartName&nbsp;varchar2(20),</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>TopNo<span>&nbsp;&nbsp;&nbsp; </span>varchar2(10));</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>insert into Dept values('001','董事会','0');</span></p>
<p align=left><span>insert into Dept values('002','总裁办','001');</span></p>
<p align=left><span>insert into Dept values('003','财务部','001');</span></p>
<p align=left><span>insert into Dept values('004','市场部','002');</span></p>
<p align=left><span>insert into Dept values('005','公关部','002');</span></p>
<p align=left><span>insert into Dept values('006','销售部','002');</span></p>
<p align=left><span>insert into Dept values('007','分销处','006');</span></p>
<p align=left><span>insert into Dept values('008','业务拓展处','004');</span></p>
<p align=left><span>insert into Dept values('009','销售科','007');</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>connect by prior<span>&nbsp;&nbsp;&nbsp; </span>start with</span></p>
<p align=left><span>例子：</span></p>
<p align=left><span>select departname,level,sys_connect_by_path(departname,'|') from dept </span></p>
<p align=left><span>connect by prior departno = topno</span></p>
<p align=left><span>start with departname='董事会' </span></p>
<p align=left>&nbsp;</p>
<p align=left><span>departname<span>&nbsp;&nbsp; </span>level</span></p>
<p align=left><span>市场部<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2</span></p>
<p align=left><span>公关部<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2</span></p>
<p align=left><span>销售部<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2</span></p>
<p align=left><span>或</span></p>
<p align=left><span>select departname,level,sys_connect_by_path(departname,'|') from dept </span></p>
<p align=left><span>where level=2</span></p>
<p align=left><span>connect by departno =prior topno</span></p>
<p align=left><span>start with departname='总裁办' </span></p>
<p align=left>&nbsp;</p>
<p align=left><span>Sys_connect_by_path(x,c)x是列，从是单字符，适用层次化查询。</span></p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left><span>prior位置表示是往父亲节点搜索还是往子节点搜索</span></p>
<p align=left><span>level表示搜索深度</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>8，insert with check option</span></p>
<p align=left><span>9、插入的值显示的定义为default值</span></p>
<p align=left><span>insert into departments(department_id,name)</span></p>
<p align=left><span>values(300,default)</span></p>
<p align=left><span>name值由表定义时的default值填充，强制用当前column定义的default值</span></p>
<p align=left><span>10、merge语句，要不更新，要不插入</span></p>
<p align=left><span>merge into table_name ....</span></p>
<p align=left><span>merge into ttt ...</span></p>
<p align=left><span>when metched then update set</span></p>
<p align=left><span>...</span></p>
<p align=left><span>when not matched then</span></p>
<p align=left><span>&nbsp;insert values....</span></p>
<p align=left><span>11、隐式事务</span></p>
<p align=left><span>没有提交的数据，别人不能修改</span></p>
<p align=left><span>通过回滚段实现读一致性</span></p>
<p align=left><span>语句级</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>&nbsp;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>12、rollup、cube等分析函数</span></p>
<p align=left><span>select decode(cust_gender,'F','男','M','女') cust_gender,count(cust_gender)</span></p>
<p align=left><span>from sh.customers</span></p>
<p align=left><span>group by cust_gender</span></p>
<p align=left><span>union select '合计'cust_gender,count(cust_gender) from sh.customers</span></p>
<p align=left><span>order by cust_gender desc</span></p>
<p align=left><span>普通的写法</span></p>
<p align=left><span>select cust_gender gender,nvl(cust_marital_status,'unknow') marital_status,count(*),grouping(cust_gender),grouping(nvl(cust_marital_status,'unknow'))</span></p>
<p align=left><span>from sh.customers</span></p>
<p align=left><span>group by rollup(cust_gender,nvl(cust_marital_status,'unknow'))</span></p>
<p align=left><span>rullup写法</span></p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left><span>13、rank、dense_rank函数</span></p>
<p align=left><span>select department_id,rank(10000) within group(order by salary desc nulls last) dense_rank_10k</span></p>
<p align=left><span>from hr.employees</span></p>
<p align=left><span>group by department_id</span></p>
<p align=left><span>判断10000在salary中排在第几，按dept分组</span></p>
<p align=left><span>select department_id,salary,rank() over(partition by department_id order by salary desc) dense_rank_10k</span></p>
<p align=left><span>from hr.employess列出在部门排第几</span></p>
<p align=left><span>dence_rank在并列关系是，相关等级不会跳过。rank则跳过。</span></p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left><span>14、select length('HELLO WORLD!')-length(replace(translate('HELLO WORLD!','L',chr(13)),chr(13),'')) from dual;</span></p>
<p align=left><span>判断字符串中的某个字符的个数</span></p>
<p align=left><span>select length('HELLO WORLD!')-length(replace('HELLO WORLD!','L')) from dual;</span></p>
<p align=left><span>更简洁</span></p>
<p align=left><span>select (length('你好你好LLO WOR你好LD!')-length(replace('你好你好LLO WOR你好LD!','你好')))/length('你好') from dual;</span></p>
<p align=left><span>可以同时处理汉字和英文</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>15 alter table add / modify cName</span></p>
<p align=left><span>drop column cName</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>涉及到数据删除时所需要的时间，可以使用set unused使column无用，在系统空闲的时候可以drop column</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>delete删除时做很多日志记录，效率低下</span></p>
<p align=left><span>truncate是ddl，不能rollback！速度效率都高，同时也清空索引和存储空间还原</span></p>
<p align=left><span>comment on table tName is 'comment content';给对象增加注释</span></p>
<p align=left><span>查看注释信息：all_col_comments,user_col_comments,all_tab_comments,user_tab_comments</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>16、约束 including constraints 数据完整性 列完整性，实体完整性</span></p>
<p align=left><span>约束类型：(列一级的 not null,check),unique,primary key,foreign key</span></p>
<p align=left><span>create table test(</span></p>
<p align=left><span>id int not null,</span></p>
<p align=left><span>lname varchar(20),</span></p>
<p align=left><span>rname varchar(20),</span></p>
<p align=left><span>rid int not null,</span></p>
<p align=left><span>constraint test_u_1 unique(lname,rname)</span></p>
<p align=left><span>)</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>alter table test add constraint pk_test primary key(id);增加主键</span></p>
<p align=left><span>alter table test add constraint fk_test foreign key(rid) references test1(id);</span></p>
<p align=left><span>级联删除 on delete cascade,或者on delete set null</span></p>
<p align=left><span>check 不能用系统函数、sequence、查询</span></p>
<p align=left><span>alter table drop constraint c_name</span></p>
<p align=left><span>alter table disable/enable constraint c_name</span></p>
<p align=left><span>alter table drop column col_name cascade constraint删除列的时候连constraint一块删除</span></p>
<p align=left><span>查看constaint select * from user_constraints/user_cons_columns</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>17、视图view</span></p>
<p align=left><span>view是一个逻辑结构，不含有数据</span></p>
<p align=left><span>create force view viewname as ...</span></p>
<p align=left><span>force 强制视图编译通过，不管后面的select语句是否成功</span></p>
<p align=left><span>with check option constraint ...</span></p>
<p align=left><span>with read only constraint ...</span></p>
<p align=left><span>透过视图可以发生数据改变，改变基表！带有group by，函数，rownum，distinct等不可改变</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>18、greatest、least</span></p>
<p align=left><span>greatest(p1,p2,p3...)找出其中最大的</span></p>
<p align=left><span>least(p1,p2,p3...)找出最小的</span></p>
<p align=left><span>coalesce计算多个值的非空值</span></p>
<p align=left><span>coalesce(null,null,'a')返回a</span></p>
<p align=left><span>coalesce(overtime,faultreorttime)如果同一行中overtime为null，faultreporttime不为null返回faultreporttime</span></p>
<p align=left><span>greatest、least函数不将日期格式的直接量串作为日期处理，还是当作串处理</span></p>
<p align=left><span>extract代替to_char来选择日期值的成分（如从一个日期中选择月份和天）</span></p>
<p align=left><span>extract(Month from sysdate)</span></p>
<p align=left><span>BUN_TO_NUM(1)二进制转换成十进制</span></p>
<p align=left><span>translate(string,if,then)在一个字符串中进行逐字符的替换</span></p>
<p align=left><span>translate(7671234,234567890,'BCDEFGHIJ')&nbsp;结果 GFG1BCD</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>19、not in、not exists和外连接</span></p>
<p align=left><span>一般情况下用外部连接代替not in，可以极大的提高性能。not exists也可以替代not in，只是性能提升不够。</span></p>
<p align=left><span>select vipid,vipName from t_vip where vipid not in (select v.vipid from t_vip v,t_vip_detail d where v.vipid=d.vipid)</span></p>
<p align=left><span>select v.vipid,v.vipName from t_vip v where not exists (select 'x' from t_vip_detail d where v.vipid=d.vipid)</span></p>
<p align=left><span>select t_vip_detail.vipid,t_vip.vipName from t_vip left join t_vip_detail on t_vip.vipid=t_vip_detail.vipid where t_vip_detail.vipid is null</span></p>
<p align=left><span>以上三个效果一样</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>20、union(并)、intersect(交)和minus(差) </span></p>
<p align=left><span>union相同的只显示一次，对这中重复现象可以用union all</span></p>
<p align=left><span>intersect包含在两个查询基表都出现的</span></p>
<p align=left><span>in子句的优选级比union高</span></p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left><span>21、建立临时表</span></p>
<p align=left><span>create global temporary table tableName()</span></p>
<p align=left><span>on commit preserve rows子句指定是否在整个会话期间都存在</span></p>
<p align=left><span>on commit delete rows子句指定是否在事务处理完成时删除它的行</span></p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left><span>22、索引编排表(Index-Organized Table)</span></p>
<p align=left><span>根据表的主键列对数据进行排序，索引编排表存储数据时就像把整个表存储在一个索引中那样。</span></p>
<p align=left><span>create table命令的organization index子句来建立一个索引编排表</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>23、分区表</span></p>
<p align=left><span>a、改善表的查询性能</span></p>
<p align=left><span>b、使表更容易管理</span></p>
<p align=left><span>c、备份和恢复操作会执行得更好</span></p>
<p align=left><span>对表分区可以使用create table子句的partition by range</span></p>
<p align=left><span>eg:partition by range(CategoryName)(</span></p>
<p align=left><span>partition part1 values less than ('B')</span></p>
<p align=left><span>&nbsp;tablespace part1_ts,</span></p>
<p align=left><span>partition part2 values less than (MAXVALUE)</span></p>
<p align=left><span>&nbsp;tablespace part2_ts</span></p>
<p align=left><span>);</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>by range 是范围分区</span></p>
<p align=left><span>by hash 是散列分区</span></p>
<p align=left><span>by list 是列表分区</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>24、索引</span></p>
<p align=left><span>构造较少的索引但每个索引中列数较多比构造较多索引但每个所以列数较少更好。</span></p>
<p align=left><span>索引类型：一般索引（Not Sorted 传统索引（B树索引）对于包含有大量编号数据的列是非常有用的）、</span></p>
<p align=left><span>位图索引(bitmap)、唯一索引(unique)、函数索引(function)</span></p>
<p align=left><span>表空间：增加表空间的空间，可以扩展相应的数据文件或者增加新的数据文件</span></p>
<p align=left><span>簇(Cluster)是一种存储表的方式，这些表密切相关并精彩一起连接进磁盘的同一区域。</span></p>
<p align=left><span>例如：表A表B的数据行可以一起插入到称为簇的单个区域中，而不是将两个表放置在磁盘不同扇区。</span></p>
<p align=left><span>簇键可以是多列，将这些表在查询中连接起来。</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>CREATE CLUSTER TEST</span></p>
<p align=left><span>(</span></p>
<p align=left><span>&nbsp;DDD<span>&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>VARCHAR2(21 BYTE)</span></p>
<p align=left><span>)</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>CREATE TABLE TTT</span></p>
<p align=left><span>(</span></p>
<p align=left><span>&nbsp;TITLE&nbsp;VARCHAR2(21 BYTE),</span></p>
<p align=left><span>&nbsp;NAME<span>&nbsp;&nbsp; </span>VARCHAR2(22 BYTE)</span></p>
<p align=left><span>)</span></p>
<p align=left><span>CLUSTER TEST(TITLE);</span></p>
<p align=left><span>在使用表ttt之前必须建立簇索引</span></p>
<p align=left><span>CREATE INDEX HR.ssss</span></p>
<p align=left><span>&nbsp;ON CLUSTER HR.TEST</span></p>
<p align=left><span>&nbsp;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>25、数据库连接(DataBase Link 或DB Link)</span></p>
<p align=left><span>提供一个特别的途径访问远程数据库，数据库链接允许用户把一组分布式数据库视为一个独立的、一体化的数据库。</span></p>
<p align=left><span>使用hr用户访问unicom，select * from t_vip@Romote_connect </span></p>
<p align=left><span>建立数据库链接:create database link Romote_connect connect to unicom identified by password using 'ora9i';</span></p>
<p align=left><span>使用同义词来隐藏远程链接：create synonym t_vip for t_vip@Romote_connect</span></p>
<p align=left><span>这样可以直接访问select * from t_vip;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>26、实体化视图</span></p>
<p align=left><span>实体化视图是基于查询的数据拷贝，基于远程数据的实体化视图也称为快照</span></p>
<p align=left><span>间隔刷新、基于事务的刷新</span></p>
<p align=left><span>必须有Create materialized view权限</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>27、使用Oracle Text进行文本搜索</span></p>
<p align=left><span>可以利用Oracle Text完成通配符搜索、模糊匹配、关联分级、近似搜索，项加权和单词扩展</span></p>
<p align=left><span>使用两种类型的索引context、ctxcat</span></p>
<p align=left><span>示例脚本：</span></p>
<p align=left><span>REM *****************************</span></p>
<p align=left><span>REM The BOOK_REVIEW_CONTEXT Table</span></p>
<p align=left><span>REM *****************************</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>create table BOOK_REVIEW_CONTEXT</span></p>
<p align=left><span>(Title<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>VARCHAR2(100) primary key,</span></p>
<p align=left><span>Reviewer<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>VARCHAR2(25),</span></p>
<p align=left><span>Review_Date&nbsp;DATE,</span></p>
<p align=left><span>Review_Text&nbsp;VARCHAR2(4000));</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>insert into BOOK_REVIEW_CONTEXT values</span></p>
<p align=left><span>('MY LEDGER', 'EMILY TALBOT', sysdate,</span></p>
<p align=left><span>'A fascinating look into the transactions and finances of G. B. Talbot and Dora Talbot as they managed a property in New Hampshire around 1900.&nbsp;The stories come through the purchases - for medicine, doctor visits and gravesites - for workers during harvests - for gifts at the general store at Christmas.&nbsp;A great read. ');</span></p>
<p align=left><span>create index Review_Index_Context on BOOK_REVIEW_CONTEXT(Review_Text)</span></p>
<p align=left><span>indextype is ctxsys.context;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>REM ****************************</span></p>
<p align=left><span>REM The BOOK_REVIEW_CTXCAT Table</span></p>
<p align=left><span>REM ****************************</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>create table BOOK_REVIEW_CTXCAT</span></p>
<p align=left><span>(Title<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>VARCHAR2(100) primary key,</span></p>
<p align=left><span>Reviewer<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>VARCHAR2(25),</span></p>
<p align=left><span>Review_Date&nbsp;DATE,</span></p>
<p align=left><span>Review_Text&nbsp;VARCHAR2(4000));</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>insert into BOOK_REVIEW_CTXCAT values</span></p>
<p align=left><span>('MY LEDGER', 'EMILY TALBOT', sysdate,</span></p>
<p align=left><span>'A fascinating look into the transactions and finances of G. B. Talbot and Dora Talbot as they managed a property in New Hampshire around 1900.&nbsp;The stories come through the purchases - for medicine, doctor visits and gravesites - for workers during harvests - for gifts at the general store at Christmas.&nbsp;A great read. ');</span></p>
<p align=left><span>create index Review_Index_Ctxcat on BOOK_REVIEW_CTXCAT(Review_Text)</span></p>
<p align=left><span>indextype is ctxsys.ctxcat;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>contains函数--context索引 两个参数，列名和搜索串</span></p>
<p align=left><span>select title from BOOT_REVIEW_CONTEXT where CONTAINS(Review_text,'property')&gt;0</span></p>
<p align=left><span>catsearch函数应用ctxcat索引 三个参数，列名，搜索串，索引集名</span></p>
<p align=left><span>select title from book_review_ctxcat where catsearch(review_text,'property',null)&gt;0</span></p>
<p align=left><span>多个单词精确匹配搜索</span></p>
<p align=left><span>contains(review_text,'property AND harvests')&gt;0</span></p>
<p align=left><span>catsearch(review_text,'property AND harvests',null)&gt;0</span></p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left><span>28、pl/sql</span></p>
<p align=left><span>游标，</span></p>
<p align=left><span>游标属性 </span></p>
<p align=left><span>%found<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>可在游标中取一个记录&nbsp;布尔型</span></p>
<p align=left><span>%notfound<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>不能从游标中再取到记录 布尔型</span></p>
<p align=left><span>%isopen<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>游标已经打开 布尔型</span></p>
<p align=left><span>%rowcount<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>迄今为止从游标中取出的行数</span></p>
<p align=left><span>declare pi constant number(9,7):=3.1415927;</span></p>
<p align=left><span>radius integer;</span></p>
<p align=left><span>area number(14,2);</span></p>
<p align=left><span>cursor rad_cursor is select * from AREAS;</span></p>
<p align=left><span>rad_val rad_cursor%ROWTYPE;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//声明变量rad_val,用于设定它的数据类型为rad_cursor游标的数据类型</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>rowtype,type使用%rowtype什么，变量将继承游标结果集中所有列和数据类型信息</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>%type，变量只能集成用于定义它的列的定义</span></p>
<p align=left><span>begin</span></p>
<p align=left><span>open rad_cursor;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//打开游标，执行声明该游标的查询，并且标出将要返回的记录</span></p>
<p align=left><span>fetch rad_cursor into rad_val;<span>&nbsp;&nbsp; </span>//取出记录</span></p>
<p align=left><span>area:=pi*power(rad_val.radius,2);</span></p>
<p align=left><span>insert into AREAS values(rad_val.radius,area);</span></p>
<p align=left><span>area:=pi*power(rad_val.area,2);</span></p>
<p align=left><span>insert into AREAS values(rad_val.area,area);</span></p>
<p align=left><span>close rad_cursor;&nbsp;//关闭游标</span></p>
<p align=left><span>end;</span></p>
<p align=left><span>/</span></p>
<p align=left><span>pl/sql的条件逻辑</span></p>
<p align=left><span>if condition </span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>then condition</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>elsif condition</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>then</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>else</span></p>
<p align=left><span>end if;</span></p>
<p align=left><span>嵌套if条件</span></p>
<p align=left><span>if condition</span></p>
<p align=left><span>then </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>if condition</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>then</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>end if;</span></p>
<p align=left><span>else condition</span></p>
<p align=left><span>end if;</span></p>
<p align=left><span>pl/sql循环</span></p>
<p align=left><span>三种类型循环：</span></p>
<p align=left><span>简单循环<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在循环中当执行到exit或exit when时跳出</span></p>
<p align=left><span>for循环<span>&nbsp;&nbsp; </span>指定的循环次数</span></p>
<p align=left><span>while循环&nbsp;在遇到某个条件时停止循环</span></p>
<p align=left><span>1、简单循环，以loop关键字开始，exit when确定何时退出，end loop为循环结束标志</span></p>
<p align=left><span>loop </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>fetch rad_cursor into rad_val;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>exit when rad_cursor%notfound</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>end loop</span></p>
<p align=left><span>2、for循环 </span></p>
<p align=left><span>for radius in 1..7 loop</span></p>
<p align=left><span>end loop</span></p>
<p align=left><span>for rad_val in rad_cursor 游标for循环<span>&nbsp;&nbsp; </span>//该语句隐式的打开了rad_cursor游标，并将值取出放在rad_val中。</span></p>
<p align=left><span>loop<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>//不需要检查游标的%notfound属性，它通过游标for循环自动检测的</span></p>
<p align=left><span>end loop<span>&nbsp;&nbsp;&nbsp; </span>//也不需要显示的定义rad_val变量</span></p>
<p align=left><span>3、while循环</span></p>
<p align=left><span>while rad_cursor%notfound</span></p>
<p align=left><span>loop</span></p>
<p align=left><span>end loop</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>case语句控制分支逻辑</span></p>
<p align=left><span>case</span></p>
<p align=left><span>when condition</span></p>
<p align=left><span>then command</span></p>
<p align=left><span>when condition</span></p>
<p align=left><span>then command</span></p>
<p align=left><span>else command</span></p>
<p align=left><span>end case;</span></p>
<p align=left><span>case子句中的else关键字与if-then子句中的else关键字相同，如果省略else关键字，pl/sql隐式增加else raise CASE_NOT_FOUND</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>29、触发器</span></p>
<p align=left><span>触发器类型：</span></p>
<p align=left><span>1、行级触发器，对DML语句影响的每个行执行一次，常用于与数据相关的活动，对于同步保存分布式数据很有用</span></p>
<p align=left><span>2、语句级出发器，对美国DML语句执行一次，不常用于与数据相关的活动</span></p>
<p align=left><span>3、before、after出发器</span></p>
<p align=left><span>4、instead of触发器（支持对象视图引入这种类型触发器，例如update视图时，instead of触发器运行处理基表的数据）</span></p>
<p align=left><span>5、模式触发器，模式级的操作上建立，eg：create table阻止DDL操作以及在DDL操作时提供额外的安全监控</span></p>
<p align=left><span>6、数据库级触发器，在数据库事件上触发的触发器，注册、关闭、启动、错误</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>create or replace trigger test</span></p>
<p align=left><span>before insert or update of fName on address<span>&nbsp;&nbsp; </span>//针对insert和update列fName在表address上触发</span></p>
<p align=left><span>for each row<span>&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;&nbsp;&nbsp;&nbsp; </span>//行级触发器</span></p>
<p align=left><span>begin</span></p>
<p align=left><span>if inserting then<span>&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>//有效的事务处理类型inserting、deleting、updating</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>elsif updating </span></p>
<p align=left><span>endif</span></p>
<p align=left><span>end;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>eg：</span></p>
<p align=left><span>CREATE OR REPLACE TRIGGER HR.TEST</span></p>
<p align=left><span>BEFORE INSERT</span></p>
<p align=left><span>ON HR.TTT </span></p>
<p align=left><span>FOR EACH ROW</span></p>
<p align=left><span>DECLARE</span></p>
<p align=left><span>tempval number;</span></p>
<p align=left><span>BEGIN</span></p>
<p align=left><span>&nbsp;:new.title:=UPPER(:new.title);</span></p>
<p align=left><span>&nbsp;select locations_seq.NEXTVAL into tempval from dual;&nbsp;//取得seq</span></p>
<p align=left><span>&nbsp;:new.id:=tempval;</span></p>
<p align=left><span>&nbsp;:new.ldate:=sysdate;<span>&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;&nbsp;&nbsp;&nbsp; </span>//设置系统时间</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//往表中填充数据</span></p>
<p align=left><span>END ;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>禁用触发器</span></p>
<p align=left><span>alter trigger booktest_up_row enable/disable</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>30、过程、函数和程序包</span></p>
<p align=left><span>系统权限：create procedure、execute any procedure</span></p>
<p align=left><span>过程、程序包和函数所需的权限不能来自角色，必须直接授予过程、程序包或者函数的拥有者</span></p>
<p align=left><span>函数可以返回一个值，可以在查询中直接使用</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>建立程序包，包括程序包说明和程序包体</span></p>
<p align=left><span>程序包说明</span></p>
<p align=left><span>create or replace package ... as </span></p>
<p align=left><span>程序包体</span></p>
<p align=left><span>create or replace package body ... as</span></p>
<p align=left><span>程序包体可以包括没有在程序包说明中列出的对象，这些是私有对象，程序包的用户不能使用</span></p>
<p align=left><span>初始化程序包：在程序包体声明的变量，以及直接begin开始的pl/sql块会在用户会话第一次执行包的函数或过程时执行</span></p>
<p align=left><span>begin没有自己的end子句，他使用程序包体的end子句</span></p>
<img src ="http://www.cnitblog.com/wangbin/aggbug/33024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/wangbin/" target="_blank">王彬</a> 2007-09-05 22:37 <a href="http://www.cnitblog.com/wangbin/archive/2007/09/05/33024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>