??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
]]>
在plsql developer Q选择procedure?test 》start debug
SQL> grant debug connect session to mw;
SQL> grant select on v_$session to mw;
授权成功?/p>
SQL> grant select on v_$sesstat to mw;
授权成功?/p>
SQL> grant select on v_$statname to mw;
授权成功?/p>
d完成?/p>
对于表而言(常规意义上的堆组l表)Q上q分区Ş式都可以应用(甚至可以Ҏ个分区指定compress属?Q只不过分区依赖列不能是lob,long之类数据cdQ每个表的分区或子分区数的L不能过1023个?/font>
对于索引l织表,只能够支持普通分区方式,不支持组合分区,常规表的限制对于索引l织表同h效,除此之外呢,q有一些其实的限制Q比如要求烦引组l表的分Z赖列必须是主键才可以{?/font>
注:本篇所有示例仅针对常规表,卛_l织?
对于索引Q需要区分创建的是全局索引Q或本地索引Q?/font>
l 全局索引(global index)Q即可以分区Q也可以不分区。即可以建range分区Q也可以建hash分区Q即可徏于分Q又可创Z非分上,是_全局索引是完全独立的Q因此它也需要我们更多的l护操作?/font>
l 本地索引(local index)Q其分区形式与表的分区完全相同,依赖列相同,存储属性也相同。对于本地烦引,其烦引分区的l护自动q行Q就是说你add/drop/split/ truncate 表的分区Ӟ本地索引会自动维护其索引分区?/font>
Oracle 如果单个表超q?G最好对其进行分区,对于大表创徏分区的好处是显而易见的Q这里不多论qwhyQ而将重点攑֜when以及how?/font>
WHEN
一、When使用Range分区
Range分区呢是应用范围比较q的表分区方式,它是以列的值的范围来做为分区的划分条gQ将记录存放到列值所在的range分区中,比如按照旉划分Q?008q?季度的数据放到a分区Q?8q?季度的数据放到b分区Q因此在创徏的时候呢Q需要你指定Z的列Q以及分区的范围|如果某些记录暂无法预范_可以创徏maxvalue分区Q所有不在指定范围内的记录都会被存储到maxvalue所在分ZQƈ且支持指定多列做Z赖列Q后面在讲how的时候会详细谈到?/font>
二、When使用Hash分区
通常呢,对于那些无法有效划分范围的表Q可以用hash分区Q这样对于提高性能q是会有一定的帮助。hash 分区会将表中的数据^均分配到你指定的几个分区中,列所在分区是依据分区列的hashD动分配,因此你ƈ不能控制也不知道哪条记录会被攑ֈ哪个分区中,hash分区也可以支持多个依赖列?/font>
三、When使用List分区
List分区与range分区和hash分区都有cM之处Q该分区与range分区cM的是也需要你指定列的|但这又不同与range分区的范围式列?--其分区值必L指定,也不同与hash分区---通过明确指定分区|你能控制记录存储在哪个分区。它的分区列只能有一个,而不能像range或者hash分区那样同时指定多个列做为分Z赖列Q不q呢Q它的单个分区对应值可以是多个?/font>
你在分区时必ȝ定分区列可能存在的|一旦插入的列g在分围内Q则插入/更新׃p|Q因此通常使用list分区Ӟ要创Z个default分区存储那些不在指定范围内的记录Q类似range分区中的maxvalue分区?/font>
四、When使用l合分区
如果某表按照某列分区之后Q仍然较大,或者是一些其它的需求,q可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式?/font>
l合分区呢在10g中有两种Qrange-hashQrange-list。注意顺序哟Q根分区只能是range分区Q子分区可以是hash分区或list分区?/font>
提示Q?1g在组合分区功能这块有所增强Q又推出了range-range,list-range,list-list,list-hashQ这q当于除hash外三U分?
创徏range-hashl合分区
语法如下Q图
需要我们指定的有:
column_list:分区依赖?支持多个Q中间以逗号分隔);
subpartition:子分区方式,有两处:
Subpartition_by_list:语法与list分区完全相同Q只不过把关键字partition换成subpartition
Subpartition_by_hash:语法与hash分区完全相同Q只不过把关键字partition换成subpartition
partition:分区名称;
range_partition_values_clause:与range分区范围值的语法;
tablespace_clause:分区的存储属性,例如所在表I间{属?可ؓI?Q默认承基表所在表I间的属性?/p>
l合分区相对于普通分区,语法上稍E复杂了一些,但也正因如此Q其子分区的创徏可以非常灉|Q下面分别D几个例子(注:仅示例,qID所有Ş?
① 为所有分区各创徏4个hash子分?/strong>
create table t_partition_rh (id number,name varchar2(50))
partition by range(id) subpartition by hash(name)
subpartitions 4 store in (tbspart01, tbspart02, tbspart03,tbspart04)(
partition t_r_p1 values less than (10) tablespace tbspart01,
partition t_r_p2 values less than (20) tablespace tbspart02,
partition t_r_p3 values less than (30) tablespace tbspart03,
partition t_r_pd values less than (maxvalue) tablespace tbspart04);
表已创徏?
-- RYID NAME XMONE XMTWO XMTHREE
---------- ---- ------ ------ -------
-- 1 張三 項目一 項目?項目?
-- 2 李四 項目一
SQL > create table test ( name varchar2 ( 4 ), text varchar2 ( 9 ));
SQL > create view test_view as select text from test where name = userenv ( 'client_info' );
SQL > insert into test values ( 'zxx' , 'boy' );
SQL > insert into test values ( 'taw' , 'gril' );
SQL > commit ;
SQL > exec dbms_application_info . set_client_info ( 'zxx' );
SQL > select * from test_view ;
TEXT
---------
boy
--
a
create or replace type emp_type
as object (
empno number(4),
ename varchar2(10)
);
/
create or replace type emp_type_table as table of emp_type;
/
create or replace function emp_of_dept(p_deptno in number)
return emp_type_table
pipelined as
l_emp_type emp_type;
begin
for l_myrow in (select empno, ename from emp
where deptno = p_deptno) loop
l_emp_type := emp_type(l_myrow.empno, l_myrow.ename);
pipe row (l_emp_type);
end loop;
return;
end emp_of_dept;
/
select * from table(emp_of_dept(10));
EMPNO ENAME
---------- ----------
7782 CLARK
7839 KING
7934 MILLER
select * from table(emp_of_dept(30));
EMPNO ENAME
---------- ----------
7499 ALLEN
7521 WARD
7654 MARTIN
7698 BLAKE
7844 TURNER
7900 JAMES
Tom - what do you think about this?
Followup:
I think it is alot more code then:
create or replace
procedure foo( p_deptno in number, p_result_set out sys_refcursor )
as
begin
open p_result_set for
select empno, ename from emp where deptno = p_deptno;
end;
and having the client (which is doing Oracle stuff anyway) issue
begin foo( :n, :m ); end;
It'll be less performant as well.
Neat "trick" but not best practice.
create or replace function f_test(p_num in number)
return sys_refcursor
is
Result sys_refcursor;
begin
open Result for
select * from t1 t where t1.c1=p_num;
return(Result);
exception
when others then
raise;
end;
select f_test(1) from dual;
--INDEX BY Pl/sql数组002
SET SERVEROUTPUT ON
declare
type T_customerTab is table of t_customer%rowtype index by binary_integer;
t_customers T_customerTab;
begin
select * into t_customers(1) from t_customer where rownum = 1;
DBMS_OUTPUT.put_line( 'customer_name: '||t_customers(1).customer_id || ' customer_name: '||t_customers(1).customer_name);
end;
--DBMS_UTILITY.format_call_stack
SET SERVEROUTPUT ON
DECLARE
v_CallStack VARCHAR2(2000);
BEGIN
DBMS_OUTPUT.put_line('C BEGIN');
v_CallStack := DBMS_UTILITY.format_call_stack;
DBMS_OUTPUT.put_line(v_CallStack);
DBMS_OUTPUT.put_line('C END');
END;
--l果
/*
C BEGIN
----- PL/SQL Call Stack -----
object line object
handle number name
135576A4 5 anonymous block
C END
*/
/**
CREATE OR REPLACE PROCEDURE C AS
v_CallStack VARCHAR2(2000);
BEGIN
v_CallStack := DBMS_UTILITY.format_call_stack;
END C;
CREATE OR REPLACE PROCEDURE B AS
BEGIN
C;
END B;
CREATE OR REPLACE PROCEDURE A AS
BEGIN
B;
END A;
--cMl果
C BEGIN
----- PL/SQL Call Stack -----
object line object
handle number name
135576A4 4 PROCEDURE C
135576A4 5 PROCEDURE B
135576A4 5 PROCEDURE A
135576A4 5 anonymous block
C END
*/
--EXCEPTION 001
SET SERVEROUTPUT ON
DECLARE
A exception;
B exception;
BEGIN
RAISE B;
BEGIN
RAISE A;
EXCEPTION
WHEN A THEN
DBMS_OUTPUT.put_line('IN EXCEPTION A!');
WHEN B THEN
DBMS_OUTPUT.put_line('IN EXCEPTION B!');
END;
EXCEPTION
WHEN A THEN
DBMS_OUTPUT.put_line('OUT EXCEPTION A!');
WHEN B THEN
DBMS_OUTPUT.put_line('OUT EXCEPTION B!');
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.put_line('OTHERS EXCEPTION!');
END;
--l果
--OUT EXCEPTION B!
--EXCEPTION 002
SET SERVEROUTPUT ON
DECLARE
A exception;
B exception;
BEGIN
BEGIN
RAISE A;
EXCEPTION
WHEN A THEN
DBMS_OUTPUT.put_line('IN EXCEPTION A!');
WHEN B THEN
DBMS_OUTPUT.put_line('IN EXCEPTION B!');
END;
RAISE B;
EXCEPTION
WHEN A THEN
DBMS_OUTPUT.put_line('OUT EXCEPTION A!');
WHEN B THEN
DBMS_OUTPUT.put_line('OUT EXCEPTION B!');
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.put_line('OTHERS EXCEPTION!');
END;
--l果
--IN EXCEPTION A!
--OUT EXCEPTION B!
--EXCEPTION 003
SET SERVEROUTPUT ON
DECLARE
A exception;
B exception;
BEGIN
BEGIN
RAISE A;
EXCEPTION
WHEN B THEN
DBMS_OUTPUT.put_line('IN EXCEPTION B!');
END;
RAISE B;
EXCEPTION
WHEN A THEN
DBMS_OUTPUT.put_line('OUT EXCEPTION A!');
WHEN B THEN
DBMS_OUTPUT.put_line('OUT EXCEPTION B!');
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.put_line('OTHERS EXCEPTION!');
END;
--l果
--OUT EXCEPTION A!
--EXCEPTION 004
SET SERVEROUTPUT ON
DECLARE
A exception;
B exception;
C exception;
BEGIN
RAISE C;
BEGIN
RAISE A;
EXCEPTION
WHEN B THEN
DBMS_OUTPUT.put_line('IN EXCEPTION B!');
END;
RAISE B;
EXCEPTION
WHEN A THEN
DBMS_OUTPUT.put_line('OUT EXCEPTION A!');
WHEN B THEN
DBMS_OUTPUT.put_line('OUT EXCEPTION B!');
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.put_line('OTHERS EXCEPTION!');
END;
--l果
--OTHERS EXCEPTION!
--EXCEPTION 005
SET SERVEROUTPUT ON
DECLARE
A exception;
B exception;
C exception;
BEGIN
BEGIN
RAISE A;
EXCEPTION
WHEN A THEN
RAISE C;
WHEN B THEN
DBMS_OUTPUT.put_line('IN EXCEPTION B!');
END;
RAISE B;
EXCEPTION
WHEN A THEN
DBMS_OUTPUT.put_line('OUT EXCEPTION B!');
WHEN B THEN
DBMS_OUTPUT.put_line('OUT EXCEPTION B!');
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.put_line('OTHERS EXCEPTION!');
END;
--l果Q?br />--OTHERS EXCEPTION!
--游标FOR循环
SET SERVEROUTPUT ON
DECLARE
v_t_customer t_customer%ROWTYPE;
v_customer_id t_customer.customer_id%TYPE;
v_customer_name t_customer.customer_name%TYPE;
CURSOR c_t_customer IS
--select customer_id,customer_name from t_customer where rownum <= 10;
select * from t_customer where rownum <= 10;
BEGIN
FOR v_t_customer IN c_t_customer LOOP
dbms_output.put_line('customer_id :'||v_t_customer.customer_id||' customer_name :'||v_t_customer.customer_name);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.put_line('exception');
END;
select a.*, level
from t_industry a
start with industry_id = 'B03'
connect by prior industry_id = parent_id
--connect String
select Substr('bbbcbdb',1,2) ||replace(Substr('bbbcbdb',3,4),'b','a') ||Substr('bbbcbdb',7,1) from dual
select Replace(customer_name, '->','') as all_customer_name,rownum from (
select sys_connect_by_path(customer_name, '->') customer_name from (
select a.customer_name, (level - 1) ll,level l
from t_customer a
start with customer_id = 'SH02110000893' connect by prior parent_cust_id=customer_id order by l desc
)
connect by prior ll= l order by level desc
) c where rownum <2
Ҏ字节Ҏ出全?br />with temp as(
select a.*, (level - 1) ll, level l
from t_content_type a
start with a.type_id = '20000000138418'
connect by prior a.parent_type_id = a.type_id
order by l desc
)
select sys_connect_by_path(temp.type_name, '/') path
from temp
start with temp.parent_type_id = '0'
connect by prior temp.type_id = temp.parent_type_id
Q启动oraclehome92TNSlistener服务?br />2.database instance没有赯v来。windowsq_如下操作Q开?--E序---理工具---服务Q打开服务
面板Q启动oracleserviceXXXX,XXXX是你的database SID.
3.注册表问题。regeditQ然后进入HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0该环境变量
ORACLE_SID讄为XXXX,XXXX是你的database SID.或者右几我的电脑,属?-高--环境变量---pȝ
变量--新徏Q变量名=oracle_sid,变量?XXXX,XXXX是你的database SID.或者进入sqlplus前,?/p>
command line下输set oracle_sid=XXXX,XXXX是你的database SID.
l过以上步骤Q就可以解决问题
1、ORAQ?2541QTNSQ没有监听器
原因Q没有启动监听器或者监听器损坏。如果是前者,使用命onet start
OracleOraHome81TNSListenerQ名字可能有出入Q即可;如果是后者,则用“Net8 Configuration
Assistant”工具向g“监听程序配|”增加一个监听器卛_Q基本不用写M信息Q一路OK。在d
之前可能需要把所有的监听器先删除Q)
2、ORAQ?2500QTNSQ监听程序无法启动专用服务器q程或ORAQ?2560QTNSQ协议适配器错?br /> 原因QORACLE的数据库服务没有启动。用命令net start ORACLESERVICEORADBQORADB为数据库?/p>
字)卛_。如果仍没有解决Q请l箋向下看?/p>
3、如果数据库服务启动p|Q则很有可能是其注册表项值损坏,最好的做法是以下两步:
1QORADIM -DELETE -SID oradb 删除数据库服务项
2QORADIM -NEW -SID oradb 新增数据库服务项
注:q个q程中如果出错,重启计机Q?br />4、ORAQ?2154QTNSQ能解析服务?br /> 原因QORACLE的网l服务名没有正确配置。请使用“Net8 Configuration Assistant”工具向g
“本地网l服务名配置”配|TNS卛_。如果仍没有解决Q请l箋向下看?br />5、ORAQ?034 QTNSQORACLE不可?br /> 原因QORACLE的数据库服务正确启动Q但是数据库没有打开Q?br /> 使用命oQ?br /> 1Qsvrmgrl 启动服务理?br /> 2Qconnect internal 以internalw䆾登陆
3Qstartup 打开数据?br />6、ORAQ?2560QTNSQ协议适配器错误(固性的Q?br /> 原因Q未知?br /> 解决Q必杀技Q-打开“Windowsd理器”,杀死ORACLE.exe及ORADIM.exeq程Q书写自q
ora_startup.batQ执行之Q?br />PSQ?br />1、我的ora_startup.batQ?br />net start OracleOraHome81TNSListener
net start ORACLESERVICEORADB
svrmgrl 一般情况下不用Q不q有时少不了它的Q具体步骤见W?步?br />2、我的ora_shutdown.batQ?br />net stop OracleOraHome81TNSListener
net stop ORACLESERVICEORADB
?br /> ORACLE_HOME=/u01/app/oracle/product/8.1.6
export ORACLE_HOME/包括Oracle软g的目录?
LD_LIBRARY_PATH=/u01/app/oracle/product/8.1.6/lib;
export LD_LIBRARY_PATH
ORACLE_BASE=/u01/app/oracle
export ORACLE_BASE/包括Oracle软g的目录和理软g的目录?
ORACLE_SID=ORCL
export ORACLE_SID/缺省数据库的标识?
ORACLE_TERM=vt100
export ORACLE_TERM
ORA_NLS33=/u01/app/oracle/product/8.1.6/
ocommon/nls/admin/data
export ORA_NLS33 /语a支持?
PATH=$PATH: /u01/app/oracle/product/8.1.6/bin
export PATH