1、在ORACLE中返回游标结果集
写包:
create or replace package pag_cs_power as
type c_Type is ref cursor;
FUNCTION FUN_CS_GETDICTLIST(
v_DictIndex in varchar2) return c_Type;
end pag_cs_power;
函数:
FUNCTION FUN_CS_GETDICTLIST(
v_DictIndex in varchar2) return c_Type
as
c_cursor c_Type;
begin
open c_cursor for
select DICTID,DICTNAME FROM SYS_DICT WHERE DICTINDEX=v_DictIndex;
return c_cursor;
end FUN_CS_GETDICTLIST;
2、单引号的插入问题
SQL> insert into a values('i''m good'); --两个''可以表示一个'
SQL> insert into a values('i'||chr(39)||'m good'); --chr(39)代表字符'
SQL> insert into a values('a'||'&'||'b');
3、全数据库的导入与导出
exp username/password full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y
4、exp与imp的具体用法
exp username/password@mzbs_61 full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y
exp mzbs/mzbs@mzbs_61 file=c:/zzzzzzz.dmp grants=y rows=y
imp mzbs/mzbs@mzbs_61 file=c:/zzzzzzz.dmp grants=y ignore=y FULL=Y
5、如果在like的变量中,是以‘%’开头的话,是不会使用index的。反之,不是以‘%‘开头,而又有相应的index,是会使用index的。具体可以用plain plan来看一下。6、复制空表结构
create table new_table
as select * from old_table where 1=2;
复制表(含记录)
create table new_table
as select * from old_table ;
7、把一个用户下的表导入到另一个用户下,但需要改名
先用exp导出所有的表;
用imp将导出的表导入到新用户;
在新用户下,执行
select 'RENAME TABLE '||tname||' TO NEW_'||tname||';'
from tab
where tabtype='TABLE';
将上面的查询结果保存到一个sql文件中,处理后执行就可以了。
8、审计步骤
修改参数文件init.ora,参数audit_trail值为true;
重新启动数据库;
打开审计audit session; (audit session by username)
执行登录操作;
察看审计结果:
select * from dba_audit_session;
select * from sys.aud$;
select * from dba_audit_trail;
select * from dba_audit_exists;
关于审计:
为了使oracle8i的审计功能可用,必须在数据库参数文件中修改audit_trail初始参数,而这个修改并不支配oracle8i把生成的审计记录记入审计痕迹中,
由于状态,特权和模式对象已被修改,因而审计的默认值不可用,其参数应设置为none.下面列出了audit_trail 可用的参数
db_使数据库审计和全部直属审计记录到数据库审计的痕迹中
os_是数据库审计依据直属审计记入到操作系统的审计很集中
none_不可用
9、如何在Windows 2000下将Oracle完全卸载?
一、系统环境:
(1)、操作系统:Windows 2000 Server,机器内存128M
(2)、数据库: Oracle 8i R2 (8.1.6) for NT 企业版
(3)、安装路径:D:/ORACLE
二、卸载步骤:
(1)、开始->设置->控制面板->管理工具->服务
停止所有Oracle服务。
(2)、开始->程序->Oracle - OraHome81->Oracle Installation Products->Universal Installer
卸装所有Oracle产品
(3)、运行regedit,选择
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE,按del键删除这个入口。
(4)、运行regedit,选择
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services,滚动这个列表,删除所有Oracle入口
(5)、从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标
(6)、重新启动计算机,重起后才能完全删除Oracle所在目录
(7)、删除与Oracle有关的文件,选择Oracle所在的缺省目录C:/Oracle,删除这个入口目录及所有子目录,
并从Windows 2000目录(一般为C:/WINNT)下删除以下文件
ORACLE.INI、oradim80.INI
(8)、WIN.INI文件中若有[ORACLE]的标记段,删除该段
10、如何使用OEM
先启数据库服务,再启oracle manager服务。
否则重建档案资料库
如果还不行就把
ORACLEHOME/NETWORK/sqlnet.ora文件的内容
sqlnet.authentication_services=(NTS)
改成
sqlnet.authentication_services=(NONE)
登录 sysman/oem_temp
11、分析表
analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT;
12、表空间管理和用户管理
--查看表空间和数据文件
select file_name,tablespace_name,autoextensible from dba_data_files;
--数据表空间
CREATE TABLESPACE USER_DATA
LOGGING
DATAFILE 'D:/ORACLE/ORADATA/ORCL/test.DBF' SIZE 50m REUSE ,
'c:/USERS01112.DBF' SIZE 50m REUSE
AUTOEXTEND
ON NEXT 1280K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL
--修改二手游戏账号转让表空间数据文件的路径
ALTER TABLESPACE app_data
RENAME
DATAFILE '/DISK4/app_data_01.dbf'
TO '/DISK5/app_data_01.dbf';
ALTER DATABASE
RENAME FILE '/DISK1/system_01.dbf'
TO '/DISK2/system_01.dbf';
--临时表空间
CREATE TEMPORARY
TABLESPACE USER_DATA_TEMP TEMPFILE 'D:/TEMP0111.DBF'
SIZE 50M REUSE AUTOEXTEND
ON NEXT 1024K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL UNIFORM
SIZE 1024K
--增加数据文件
ALTER TABLESPACE USER_DATA
ADD DATAFILE 'c:/USERS01113.DBF' SIZE 50M;
ALTER TABLESPACE USER_DATA
ADD DATAFILE 'c:/USERS01114.DBF' SIZE 50M
AUTOEXTEND ON
;
--删除表空间
DROP TABLESPACE USER_DATA INCLUDING CONTENTS;
--修改表空间的存储参数
ALTER TABLESPACE tablespacename
MINIMUM EXTENT 2M;
ALTER TABLESPACE tablespacename
DEFAULT STORAGE (
INITIAL 2M
NEXT 2M
MAXEXTENTS 999 );
--表空间联机/脱机/只读
ALTER TABLESPACE tablespacename OFFLINE/ONLINE/READ ONLY;
--修改数据文件大小
ALTER DATABASE
DATAFILE 'c:/USERS01113.DBF' RESIZE 40M;
--创建用户、赋予权限
CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY USER_DATA
DEFAULT
TABLESPACE USER_DATA TEMPORARY
TABLESPACE USER_DATA ACCOUNT UNLOCK;
GRANT CONNECT TO USER_DATA;
GRANT RESOURCE TO USER_DATA;
13、表的管理
--创建表
CREAE TABLE TABLENAME
(COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)
(COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);
--建表的索引存储分配
CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx,
last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,
dept_id NUMBER(7))
TABLESPACE data;
--修改表的存储分配
ALTER TABLE tablename
PCTFREE 30
PCTUSED 50
STORAGE(NEXT 500K
MINEXTENTS 2
MAXEXTENTS 100);
ALTER TABLE tablename
ALLOCATE EXTENT(SIZE 500K
DATAFILE '/DISK3/DATA01.DBF');
--把表移到另一个表空间
ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;
--回收空闲的空间(回收到High-water mark)
全部回收需要TRUNCATE TABLE tablename
ALTER TABLE tablename
DEALLOCATE UNUSED;
--删除表(连同所用constraint)
DROP TABLE tablename
CASCADE CONSTRAINTS;
--给表增加列
ALTER TABLE TABLENAME
ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;
--删除表中的列
ALTER TABLE tablename
DROP COLUMN columnname;
ALTER TABLE tablename
DROP COLUMN columnname
CASCADE CONSTRAINTS CHECKPOINT 1000;
--标记列不可用
ALTER TABLE tablename
SET UNUSED COLUMN columnname
CASCADE CONSTRAINTS;
--删除标记为不可用的列
ALTER TABLE tablename
DROP UNUSED COLUMNS CHECKPOINT 1000;
--继续删除列选项
ALTER TABLE tablename
DROP COLUMNS CONTINUE CHECKPOINT 1000;
--把表放到BUFFER_POOL中去
ALTER TABLE tablename
STORAGE (BUFFER_POOL RECYCLE);
--避免动态分配EXTENT
ALTER TABLE tablename ALLOCATE EXTENT;
--把表放到CACHE中去
ALTER TABLE tablename ALLOCATE CACHE/NOCACHE;
14、索引管理
--创建索引
CREATE INDEX indexname ON TABLENAME(COLUMNNAME);
CREATE INDEX indexname ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;
--重新建立索引
ALTER INDEX indexname REBUILD TABLESPACE TABLESPACE;
--索引分配参数
ALTER INDEX indexname
STORAGE(NEXT 400K
MAXEXTENTS 100);
--释放索引空间
ALTER INDEX indexname
ALLOCATE EXTENT (SIZE 200K
DATAFILE '/DISK6/indx01.dbf');
ALTER INDEX indexname
DEALLOCATE UNUSED;
--重新整理索引表空间碎片
ALTER INDEX indexname COALESCE;
--删除索引
DROP INDEX indexname
--把索引放到BUFFER_POOL中
ALTER INDEX cust_name_idx
REBUILD
STORAGE (BUFFER_POOL KEEP);
15、约束管理
--建立主键
ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)
--使约束无效
ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT constraintname;
ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT constraintname;
--删除约束
ALTER TABLE tablename DROP CONSTRAINT constraintname;
DROP TABLE tablename CASCADE CONSTRAINTS;(删除表后将所用的外键删除)
--给列增加缺省值
ALTER TABLE TABLENAME
MODIFY columnname DEFAULT(value) NOT NULL;
--给表增加外键
ALTER TABLE tablename
ADD CONSTRAINT constraintname
FOREIGN KEY(column) REFERENCES table1name(column1);
16、日志文件管理
--切换日志文件
ALTER SYSTEM SWITCH LOGFILE;
--增加日志文件
ALTER DATABASE ADD LOGFILE
('/DISK3/log3a.rdo',
'/DISK4/log3b.rdo') size 1M;
--增加日志成员
ALTER DATABASE ADD LOGFILE MEMBER
'/DISK4/log1b.rdo' TO GROUP 1
'/DISK4/log2b.rdo' TO GROUP 2;
--删除日志文件
ALTER DATABASE DROP LOGFILE GROUP 3;
--删除日志成员
ALTER DATABASE DROP LOGFILE MEMBER '/DISK4/log2b.dbf';
--清除日志文件内容
ALTER DATABASE CLEAR LOGFILE '/DISK3/log2a.rdo';
17、Oracle常见服务
几个主要的:
OracleOraHome81TNSListener 监听服务
OracleServiceSID ORACLE服务
OracleOraHome81Agent 智能代理服务
OracleOraHome81CMan 连接管理服务
OracleOraHome81HTTPServer APACHE WEB 服务
OracleOraHome81ManagementServer ORACLE 企业管理器服务
OracleOraHome81Names ORACLE命名服务
18、ORACLE的热备份
在不关闭数据库的时候进行ORACLE的备份。
原理停复杂的,你去找本书看看吧。
举个简单的例子:备份表空间USERS
ALTER TABLESPACE USERS BEGIN BACKUP
COPY USERS TABLESPACE 的数据文件到备份目录
ALTER TABLESPACE USERS END BACKUP
19、导致索引不起作用的解决办法
问题是由optimizer_mode参数引起的,该参数的默认值为choose,即为如表有statis则查询走基于cost的方式,否则走基于rule的方式,因些你可以有以下几个解决方法。
(1)、简单的在init.ora中设optimizer_mode=rule,重起数据库。
(2)、使用analyze table table_name(索引基表) delete statistics;
(3)、最后一个万能办法,将表和索引drop掉,重建。
20、关于数据库进程的问题。
(1).查看相关进程在数据库中的会话
Select a.sid,a.serial#,agram, a.status ,
substr(a.machine,1,20), a.terminal,b.spid
from v$session a, v$process b
where a.paddr=b.addr
and b.spid=&spid;
(2).查看数据库中被锁住的对象和相关会话
select a.sid,a.serial#,a.username,agram,
c.owner, c.object_name
from v$session a, v$locked_object b, all_objects c
where a.sid=b.session_id and
c.object_id=b.object_id;
(3).查看相关会话正在执行的SQL
select sql_text from v$sqlarea where address=
( select sql_address from v$session where sid=&sid );
21、查看IP地址
select SYS_CONTEXT('USERENV','IP_ADDRESS') from dual;
22、运行SQLPLUS时不用输入用户名和密码,进入之后使用CONNECT
SQLPLUS /NOLOG
SQL>CONNECT SCOTT/TIGER
23、查看当前会话
userenv() 函数
select userenv('language') from dual 字符集
select userenv('isdba') from dual 是否DBA
select userenv('sessionid') from dual sessionid
select userenv('TERMINAL') from dual 客户端名字
select userenv('INSTANCE') from dual 实例数
SYS_CONTEXT() 函数
select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') from dual; 当前模式
select SYS_CONTEXT('USERENV','CURRENT_SCHEMAID') from dual; 当前模式ID
select SYS_CONTEXT('USERENV','CURRENT_USER') from dual; 当前用户
select SYS_CONTEXT('USERENV','DB_NAME') from dual; 数据库
select SYS_CONTEXT('USERENV','HOST') from dual; 主机
24、删除重复列的方法
(1) DELETE FROM table_name A WHERE ROWID > (
SELECT min(rowid) FROM table_name B
WHERE A.key_values=B.key_values);
(2) create table table2 as select distinct * from table1;
drop table1;
rename table2 to table1;
(3) Delete from mytable where rowid not in(
select max(rowid) from mytable
group by column_name );
(4) delete from mytable t1
where exists (select 'x' from my_table t2
where t2.key_value1=t1.key_value1
and t2.key_value2=t1.key_value2
...
and t2.rowid > t1.rowid);
25、ORA-12571: TNS:packet writer failure(包写入程序失败)
(1) 这个错误在客户端遇到过,通常重新连接一下服务器就好了。
服务器重新启动的时候,在client也会遇到该错误。
这个错误你是在server还是client上遇到的?最常用的办法就是加上跟踪,查看一下 跟踪记录,分析分析错误的原因。
网络问题也会出现该错误,比如网络路由没有配置好。
(2) 安装的杀毒软件导致的
(3) 服务器端的IP是否被改动
(4) 最后不行的话,重新创建监听器
26、ORACLE服务不能自动启动的解决办法
把
ORACLEHOME/network/ADMIN/sqlnet.ora
文件中的
sqlnet.authentication_service=(nts)
注释掉就可以了
27、不完全的时间点恢复
shutdown immediate
copy 备份文件到需要恢复的目录下
startup mount
recover database until time '2002-12-26 09:00:00'
alter database open resetlogs
自己仔细检查一下,不会发生这样的问题的。
28、oracle如何设置查询超时
select /+ timeout 30/ * from veryLargeTable
29、修改字符集
(1)、ALTER DATABAE CHARACTER SET SIMPLIFIED CHINESE_CHINA.ZHS16GBK ;
(2)、update props$ set value$='ZHS16CGB231280'
where name='NLS_CHARACTERSET';
update props$ set value$='ZHS16CGB231280'
where name='NLS_NCHAR_CHARACTERSET';
建议不使用(2)
注意:
(1)、执行ALTER DATABASE CHARACTER SET必须有SYSDBA权限,并且在STARTUP RESTRICT模式下执行
(2)、原字符集必须是目标字符集的一个真子集(就是浪子所说的只能从WE8ISO8859P1转到ZHS16GBK的原因)
(3)、CLOB字段装换可能有问题,建议在转换以前把有CLOB字段的表导出后DROP,转换以后再导回
(4)、该转换不可逆,所以在做这个操作以前建议做数据库全备份
30、修改数据库名字
(1)、启动svrmgrl,以文本方式备份控制文件
oracle>svrmgrl
svrmgrl>connect internal
svrmgrl>alter system backup controlfile to trace
(2)、编辑产生的跟踪文件,在udump目录下
改CREATE CONTROLFILE REUSE DATABASE 'CTC' NORESETLOGS ARCHIVELOG
中的REUSE为SET
然后把create controlfile这段语句拷出
(3)、正常宕库,后启动到nomount下
svrmgrl>shutdown immediate
svrmgrl>startup nomount
(4)、执行create controlfile那段语句
(5)、打开数据库
svrmgrl>alter database open
如提示用resetlogs选项则使用
svrmgrl>alter database open resetlogs
(8)、相应修改初始化参数
31、rownum的用法
SELECT a.ksppinm NAME,
b.ksppstdf default_val,
a.ksppdesc DESCRIPTION
FROM x$ksppi a,
x$ksppcv b
WHERE a.indx=b.indx
AND substr(a.ksppinm,1,1)='_'
ORDER BY a.ksppinm
32、如何查看表空间还有多少可以用
(1)、
SELECT upper(f.tablespace_name) 表空间名,
d.Tot_grootte_Mb '表空间大小(M)',
d.Tot_grootte_Mb - f.total_bytes '已使用空间(M)',
round((d.Tot_grootte_Mb - f.total_bytes) / d.Tot_grootte_Mb * 100,2) '使用比',
f.total_bytes '空闲空间(M)',
f.max_bytes '最大块(M)'
FROM
(SELECT tablespace_name,
round(SUM(bytes)/(1024*1024),2) total_bytes,
round(MAX(bytes)/(1024*1024),2) max_bytes
FROM sys.dba_free_space
GROUP BY tablespace_name) f,
(SELECT dd.tablespace_name, round(SUM(dd.bytes)/(1024*1024),2) Tot_grootte_Mb
FROM sys.dba_data_files dd
GROUP BY dd.tablespace_name) d
WHERE d.tablespace_name=f.tablespace_name
ORDER BY 4 DESC
(2)、select tablespace_name,round(sum(bytes)/1024/1024,2) 'M' from dba_free_space
group by tablespace_name
33、使索引无效
ALTER INDEX idx UNUSABLE;
ALTER INDEX idx_acctno DISABLE;(only to a function based index)
34、在SQLPLUS中给指定用户进行 set autotrace on/off
以SCOTT用户为例:
SQL>CONNECT scott/tiger
connected.
SQL>@$ORACLE_HOME/RDBMS/ADMIN/UTLXPLAN.SQL
Table created.
SQL>CONNECT / AS SYSDBA
connected.
SQL>@$ORACLE_HOME/SQLPLUS/ADMIN/PLUSTRCE.SQL
drop role plustrace;
Role dropped.
create role plustrace;
Role created.
.
grant plustrace to dba with admin option;
Grant succeeded.
SQL>GRANT PLUSTRACE TO SCOTT;
Grant succeeded.
SQL>CONNECT SCOTT/TIGER
connected.
SQL>set autotrace on
35、表空间管理和用户管理
--查看表空间和数据文件
select file_name,tablespace_name,autoextensible from dba_data_files;
--数据表空间
CREATE TABLESPACE USER_DATA
LOGGING
DATAFILE 'D:/ORACLE/ORADATA/ORCL/test.DBF' SIZE 50m REUSE ,
'c:/USERS01112.DBF' SIZE 50m REUSE
AUTOEXTEND
ON NEXT 1280K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL
--临时表空间
CREATE TEMPORARY
TABLESPACE USER_DATA_TEMP TEMPFILE 'D:/TEMP0111.DBF'
SIZE 50M REUSE AUTOEXTEND
ON NEXT 1024K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL UNIFORM
SIZE 1024K
--增加数据文件
ALTER TABLESPACE USER_DATA
ADD DATAFILE 'c:/USERS01113.DBF' SIZE 50M;
ALTER TABLESPACE USER_DATA
ADD DATAFILE 'c:/USERS01114.DBF' SIZE 50M
AUTOEXTEND ON
;
--删除表空间
DROP TABLESPACE USER_DATA INCLUDING CONTENTS;
--修改数据文件大小
ALTER DATABASE
DATAFILE 'c:/USERS01113.DBF' RESIZE 40M;
--创建用户、赋予权限
CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY USER_DATA
DEFAULT
TABLESPACE USER_DATA TEMPORARY
TABLESPACE USER_DATA ACCOUNT UNLOCK;
GRANT CONNECT TO USER_DATA;
GRANT RESOURCE TO USER_DATA;
--把表移到另一个表空间
ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;
--创建索引
CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME);
CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;
--重新建立索引
ALTER INDEX INDEXNAME REBUILD TABLESPACE TABLESPACE;
--创建表
CREAE TABLE TABLENAME
(COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)
(COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);
--建表的索引存储分配
CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx,
last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,
dept_id NUMBER(7))
TABLESPACE data;
--建立主键
ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)
--使约束无效
ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT CONSTRANAME;
ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT CONSTRANAME;
--删除约束
ALTER TABLE TABLENAME DROP CONSTRAINT constraintname;
DROP TABLE TABLENAEM CASCADE CONSTRAINTS;(删除表后将所用的外键删除)
--给表增加列
ALTER TABLE TABLENAME
ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;
--给列增加缺省值
ALTER TABLE TABLENAME
MODIFY COLUMNNAME DEFAULT(VALUE) NOT NULL;
--给表增加外键
ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME
FOREIGN KEY(COLUMN) REFERENCES TABLE1NAME(COLUMN1);