Oracle Long类型转换为Clob类型
INSERT INTO sammy_test_clob SELECT TO_LOB (report_xml) FROM qm_s_report WHERE report_name = 'Sammy';TO_LOB函数和LONG类型一样,限制有很多。简单的说,TO_LOB一般只用在CREATE TABLE或INSERT TABLE语句后面的子查询中。在其他地方使用会报错,比如UPDATE语句。这还不是最大的问题,最大的问题在于,TO_LOB函数似乎并没有真正的将LONG类型转化为LOB数据类型。个人感觉,Oracle只是对LONG类型做了一些处理,使之可以存放到一个LOB类型中去。[@more@]LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长
Oracle SQL baseline
Oracle SQL baseline是Oracle用来取代outline的新功能。其原理和outline比较类似,都是将预先设定好的plan或者hint存储在数据字典中,当SQL匹配的时候,采用预订好的plan。 通常用在第三方程序的SQL中,这样的SQL Text通常不能被重写,如果CBO不能自动生成理想的执行计划,则需要DBA通过添加hint等方法人工干预。也常用来固定关键SQL的执行计划。如应用从开发数据库部署到产品数据库,可以将outline或者baseline从测试库输出输入到产品数据库中。也用在数据库升级的时候,防止因为升级带来的optimzer或者其他参数变化导致升级后SQL执行计
Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数 转载
oracle的分析函数over 及开窗函数 一:分析函数over Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返回一行。 下面通过几个例子来说明其应用。 1:统计某商店
使用LAG和LEAD函数统计
Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值。这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率。以下是LAG和LEAD的例子: SQL> select year,region,profit ,lag (profit,1) over (order by year) 2 as last_year_exp from test; YEAR REGION PROFIT LAST_YEAR_EXP ---- ------- ---------- ------------- 2003 West 88 2003 West 88 88 2003 Central 101 88 2003 Central 100 101
使用Bulk Collect提高Oracle查询效率
Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使用批查询,批查询在某些情况下能显著提高查询效率。现在,我们对该特性进行一些简单的测试和分析。 1. 首先,我们创建一个表,并插入100000条记录 在SQL/Plus中执行下列脚本: drop table empl_tbl / create table empl_tbl(last_name varchar2(20), first_name varchar2(10), salary number(10)) / begin for i in 3000..102999 loop insert into empl_tbl(last_name,first_name,salary) values('carl'||(i-3000),'wu'||(103000-i),i); end loop;
cursor参数
declarecursor t is select * from mao.tabs where rownum<10;cursor c(t_name tabs.table_name%type) is select * from mao.cols where cols.table_name=t_name;t_r tabs%rowtype;c_r cols%rowtype;begin for t in (select * from mao.tabs where rownum<10) loop dbms_output.put_line(t.owner||' '||t.table_name||': '); dbms_output.put_line('-------'); for c in(select * from mao.cols where table_name=t.table_name) loop dbms_output.put_line(c.column_name); end loop; dbms_output.put_line('-
forall
declare Type Array_type is Table Of number Index by Binary_Integer; My_Array Array_type; Begin For I In 1..100000 Loop My_Array(I) := I; End Loop; forall i in my_array.first..my_array.last insert into order_header values(my_array(i),'jerry '||to_char(my_array(i))); End;[@more@]
pl/sql数组
declareType Array_type is Table Of number Index by Binary_Integer; My_Array Array_type;Begin For I In 1..10 Loop My_Array(I) := I*2; End Loop; For I In 1..10 Loop Dbms_Output.Put_line(To_char(My_Array(I))); End Loop; Dbms_Output.Put_line(My_Array.first||' '||My_Array.last);End;[@more@]
EXECUTE IMMEDIATE动态SQL的使用总结
1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交 如果通过EXECUTE IMMEDIATE处理DML命令, 那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分. 如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据 2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors. 3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号. 4. 在Oracle手册中,未详细覆盖这些功能。 下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便
ORACLE中带参数、REF游标及动态SQL实例
Normal 0 7.8 pt 0 2 false false false MicrosoftInternetExplorer4 st1:*{behavior:url(#ieooui) } /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.