BBY-Oracle笔记第二篇

在win7下安装oracle 10g
修改Oracle 10G\database\stage\prereq\db\refhost.xml
在</SYSTEM>
<CERTIFIED_SYSTEMS>后面添加
<!--Microsoft Windows 7-->
<OPERATING_SYSTEM>
<VERSION VALUE="6.1"/>
</OPERATING_SYSTEM>
再到install目录中找到oraparam.ini文件,找到
#Windows=4.0,5.0,5.1,5.2
修改成
#Windows=4.0,5.0,5.1,5.2,6.1
在后面添加
[Windows-6.1-required]
#Minimum display colours for OUI to run
MIN_DISPLAY_COLORS=256
#Minimum CPU speed required for OUI
#CPU=300
[Windows-6.1-optional]
运行,还是出现错误
解决办法:在setup上右键,属性->兼容性->以兼容模式运行这个程序 windows xp(service pack 3),以管理员身份运行安装,Ok!
在进行数据库导入的时候,出现IMP-00013: 只有 DBA 才能导入由其他 DBA 导出的文件的解决方法:
当exp 导出的用户拥有dba的角色,但imp导入的用户不拥有dba的角色时,
在imp导入时将会出现上面的错误。
可以在exp导出之前,回收用户dba的角色 revoke dba  from user。再exp导出数据。
这样导入数据则不会报错。
或者把dba角色赋予给imp导入的用户
grant dba  to username
Oracle dual讲解
1. dual 确实是一张表.是一张只有一个字段,一行记录的表.
2.习惯上,我们称之为'伪表'.因为他不存储主题数据.
3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.
如:select * from mytable ;
select * from myview;
等等.
但如果我们不需要从具体的表来取得表中数据,而是单纯地为了得到一些我们想得到的信息,并要通过select 完成时,就要借助一个对象,这个对象,就是dual;
如我们要计算 999*999 的值,可以用:
select 999*999 from dual;
来实现;
要拼接一个电话信息:
select concat('010-','88888888')||'转23' 高乾竞电话 from dual;
就变成了我们想要的格式输出.
4.当然,我们不一定要dual ,也可以这样做.例如:
create table mydual( dummy varchar2(1));
也可以实现和dual 同样的效果:
select 999*999 from mydual;
不过,dual 我们都用习惯了,就无谓自己再搞一套了。
一些命令
show user;查看当前用户;
show user_tablespaces表空间;
查看当前用户的缺省表空间
  SQL>select username,default_tablespace from user_users;
  查看当前用户的角色
  SQL>select * from user_role_privs;
  查看当前用户的系统权限和表级权限
  SQL>select * from user_sys_privs;
  SQL>select * from user_tab_privs;
  查看用户下所有的表
  SQL>select * from user_tables;
  1、用户
  查看当前用户的缺省表空间
  SQL>select username,default_tablespace from user_users;
  查看当前用户的角色
  SQL>select * from user_role_privs;
  查看当前用户的系统权限和表级权限
  SQL>select * from user_sys_privs;
  SQL>select * from user_tab_privs;
  显示当前会话所具有的权限
  SQL>select * from session_privs;
  显示指定用户所具有的系统权限
  SQL>select * from dba_sys_privs where grantee='GAME';
  2、表
  查看用户下所有的表
  SQL>select * from user_tables;
  查看名称包含log字符的表
  SQL>select object_name,object_id from user_objects
  where instr(object_name,'LOG')>0;
  查看某表的创建时间
  SQL>select object_name,created from user_objects where object_name=upper('&table_name');
  查看某表的大小
  SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
  where segment_name=upper('&table_name');
  查看放在ORACLE的内存区里的表
  SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;
  3、索引
  查看索引个数和类别
  SQL>select index_name,index_type,table_name from user_indexes order by table_name;
  查看索引被索引的字段
  SQL>select * from user_ind_columns where index_name=upper('&index_name');
  查看索引的大小
  SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
  where segment_name=upper('&index_name');
  4、序列号
  查看序列号,last_number是当前值
  SQL>select * from user_sequences;
  5、视图
  查看视图的名称
  SQL>select view_name from user_views;
  查看创建视图的select语句
  SQL>set view_name,text_length from user_views;
  SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小
  SQL>select text from user_views where view_name=upper('&view_name');
  6、同义词
  查看同义词的名称
  SQL>select * from user_synonyms;
  7、约束条件
  查看某表的约束条件
SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
  from user_constraints where table_name = upper('&table_name');
  SQL>select c.constraint_name,c.constraint_type,cc.column_name
  from user_constraints c,user_cons_columns cc
  where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
  and c.owner = cc.owner and c.constraint_name = cc.constraint_name
  order by cc.position;
  8、存储函数和过程
  查看函数和过程的状态
  SQL>select object_name,status from user_objects where object_type='FUNCTION';
  SQL>select object_name,status from user_objects where object_type='PROCEDURE';
  查看函数和过程的源代码
 SQL>select text from all_source where owner=user and name=upper('&plsql_name');
查询所有用户和表空间对应情况
select a.username,b.tablespace_name,c.file_name
from dba_users a,dba_tablespaces b,dba_data_files c
where a.DEFAULT_TABLESPACE=b.TABLESPACE_NAME and b.TABLESPACE_NAME=c.TABLESPACE_NAME
查看所有用户
select username from dba_users;
Oracle导入数据注意事项
数据库实例名字可以不同,但表空间名必须相同;
查看DBlink语句:
select db_link from dba_db_links;
查看快照
select * from dba_snapshots;
查看job
select * from dba_jobs;
9i导到10g需要用9i的Exp和10g的Imp,而10g导到9i需要用9i的Exp和Imp
一个用户数据导给另一个用户
imp venusln/venusln file=aa.dmp fromuser=venus touser=venusln log=aa.log buffer=655000 ignore=y rows=y
1、||用法
select id,name,pinyin || '' from venus_acc_master where rownum<5;
当pinyin字段为null时,选出’’值。
2、case when then else end 用法(类似decode)
select id,name,pinyin || '', (case when id='5' then 'a' when id='6' then 'b' else 'x' end) xxx from venus_acc_master where rownum<3;
create table a as select * from venus_acc_master;
SQL语法:
结构化查询
我们经常会将一个比较复杂的目录树存储到一个表中。或者将一些部门存储到一个表中,而这些部门互相有隶属关系。这个时候你就会用到connect by prior start with。
connect by 是结构化查询中用到的,其基本语法是:
  select ... from tablename start with 条件1
  connect by prior 条件2
  where 条件3;
  例:
  select * from table
  start with org_id = 'HBHqfWGWPy'
  connect by prior org_id = parent_id;
  简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:
  org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。
  用上述语法的查询可以取得这棵树的所有记录。
  其中:
  条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
  条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。
  条件3 是过滤条件,用于对返回的所有记录进行过滤。
Substr-字符串截取,substr(t.name,0,3)-从name字段第一位开始截取三位,等同于substr(t.name,1,3);substr(t.name,3)-从name字段第三位开始截取;
Replace-字符替换,如replace(t.filename,'A','Q')-将name字段A字符替换成Q字符;
nvl-类似程序里边的?选择函数,如nvl(t.name,’QQ’)-如果name为空返回’QQ’,否则返回name本身值;
wmsys.wm_concat
将选出的结果以”,”号连接;
select wmsys.wm_concat(hostname) from venus_auth_sys_res;
sysdate-1
天减一;
to_date(to_char(sysdate - 1, 'yyyy-mm-dd') || ' 23:59:59','yyyy-mm-dd hh24:mi:ss')-上一天23:59:59的时间;
||
用于向选出的字段后连接其他字符串,如select t.name || 'QQQ' from venus_acc_master t where rownum<'5';原来t.name为”hu”,选出后为”huQQQ”;
With as
简单的例子
with a as (select * from test)
select * from a;
其实就是把一大堆重复用到的SQL语句放在with as 里面,取一个别名,后面的查询就可以用它
这样对于大批量的SQL语句起到一个优化的作用,而且清楚明了;
组织树查询实例
select o.AUTOID,o.id,substr(sys_connect_by_path(o.NAME, '-'),2) orgname,
o.name orgdishiname from venus_acc_organizationview o start with (o.PARENTORGID = 0 or o.parentorgid = -1) connect by prior o.ID = o.PARENTORGID
case-when-then类似于decode
decode (expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default);
case when expression1 then result1 when expression2 then result2 ....else result end);
可以在转义字段值同时转义字段名称;
Oracle帐号解锁
alter user venus account unlock;
commit;
Oracle导出指定表结构
Exp venus/venus123321@oracle9i tables=(a,b,c)
只导出表结构:rows=n
查看当前用户表空间:
select username,default_tablespace from user_users
Oracle用户查询实例
select * from gv$instance;
或者
select * from v$instance;
或者
select instance_name from v$instance;
导出Oracle所有表、序列、视图结构
用pl/sql的export user objects功能
表结构复制
create table venus_acc_slave_test as select * from venus_acc_slave where 1=2;
表复制(连带数据)
create table venus_acc_slave_test as select * from venus_acc_slave
查Oracle最大游标数
show parameter open_cursors;
替换字段中字符串
update venus_workflow_form set formcontent = replace(formcontent,';','\u0007');
查询数据库DBLINK
select owner,object_name from dba_objects where object_type='DATABASE LINK';
select * from ALL_DB_LINKS;
Oracle索引知识
--4.索引(INDEX)
--4.1 唯一(unique)索引
--格式:
  create unique index <名称>
  on 表(列);
 
  create unique index i_club_unique
  on club(club_id);

--4.2 反向(reverse)索引:字段唯一性很好的时候可以创建
--格式:
  create index <名称>
  on 表(列) reverse
 
--4.3 位图(bitmap)索引:字段唯一性很差的时候可以创建
--格式:
  create bitmap index <名称>
  on 表(列)
即位图索引为非唯一索引
SQL中exists用法
select count(*) from venus_acc_slave s where 1=1
       and exists (select 1 from venus_auth_masterauth a where s.id=a.slaveid);
SQL中having的用法
having称为分组滤过条件,也就是说是分组需要的条件,所以必须与group by联用;
常用分组统计SQL语句如下:
select t.id,t.cybercaname,count(*) as count
from venus_acc_master t left join venus_auth_masterauth a on t.id=a.id 
group by t.id,t.cybercaname having count(*)>6;
删除关联
Drop table cascade constraints;
Oracle日志组丢失导致无法连接解决办法
SQL> sqlplus /nolog;
SQL> conn / as sysdba;
SQL> shutdown normal;---有时关不掉尝试abort参数
SQL> startup mount;
SQL> recover database until cancel;---时间比较久
SQL> alter database open resetlogs;
SQL> shutdown immediate;
SQL> startup;
简单JOB编写
Command窗口下:
SQL> variable job1 number;
SQL> begin
  2  dbms_job.submit(:job1,'get4adata_proc;',sysdate,'sysdate+1/48');--30
  3  end;
  4  /
SQL> begin
  2  dbms_job.run(:job1);
  3  end;
  4  /
创建存储过程
CREATE OR REPLACE PROCEDURE get4AData_proc AS
BEGIN
--Merge into用法
merge into res_primary_account2 r
      using SAP.venus_acc_master@venusdblink m
      on (r.primaryaccountid = m.id)
      when matched then
      update
      set r.primaryaccountname=m.name,
      r.rellyname=m.realname,
      r.adminorgid=m.orgof,
      r.cover='1'
      when not matched then
      insert
      values(m.id,m.name,m.realname,m.orgof,'0','0','0','1','0','0','0','0');
commit;
END get4AData_proc;
删除JOB
SQL> begin
 2 dbms_job.remove(:job1);
   3 end;
   4 /
查看创建的job
查看相关job信息
1、相关视图
dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在运行job相关信息。
Oracle10G安装检查
在安装oracle 10g时,在先行条件检测时会出现
  “正在检查网络配置需求...检查完成。此次检查的总体结果为: 未执行 <<<<解决方案: Oracle 支持在具有 DHCP 分配的 IP 地址的系统上进行安装。但在安装之前, 必须将 Microsoft LoopBack Adapter 配置为系统的主网络适配器。有关在配置有 DHCP 的系统上安装软件的详细信息, 请参阅 Installation Guide。”
解决方法:
在安装ORACLE 10g前系统会检测安装的一些前提条件是否满足,往往会提示说:将Microsoft LoopBack Adapter配置为系统的主网络适配器。
  如果你没有这样配置,且你不希望安装过程由于这个而出现问题,那么可以按如下过程操作:
  控制面板->添加硬件,在向导中选择“是,已经连接了此硬件”→添加新硬件设备→安装我手动列表选择硬件(高级)→网络适配器→厂商:Microsoft 网卡:Microsoft Loopback Adapter,添加完成,你会发现新建了个“本地连接”,用的就是这个假的“Microsoft Loopback Adapter”(因为根本就没有连接这个硬件,只是骗下Oracle而已)。把这个本地连接的IP设置一下(例如192.168.0.1)。好了,现在回去重新让Oracle检测一遍吧,应该通过了吧。
改表字段属性
alter table res_admin_org modify adminorgname varchar2(200);
抽样函数(0.1%)
select * from res_subaccount sample (0.1) where subaccountname like 'T90000%';
帐号解锁
Sqlplus /nolog
Conn / as sysdba
Alter user SAP account unlock;
Commit;
Exit;
改列长度:
alter table res_admin_org modify (adminorgname varchar2(200));
杀死正在执行的事物ora-00054:resource busy and acquire with nowait specified
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;

alter system kill session '50,40838';
SQL英文或数字过滤
name字段不全为英文或数字的记录
select * from venustech.venus_acc_master where not regexp_like(name,'^[A-Za-z0-9]+$') and status <>'9';
name字段不全为英文的记录
select * from venustech.venus_acc_master where not regexp_like(name,'^[A-Za-z]+$') and status <>'9';
Oracle新建/删除唯一键

constraint UNIQ_SCENE_CODE unique (SCENE_CODE)

alter table venus_cashbox_scene drop constraint uniq_scene_code;
SQL基础结构
虽然 SELECT 语句的完整语法较复杂,但是其主要的子句可归纳如下:
  SELECT select_list
  [ INTO new_table ]
  FROM table_source
  [ WHERE search_condition ]
  [ GROUP BY group_by_expression ]
  [ HAVING search_condition ]
  [ ORDER BY order_expression [ ASC | DESC ] ]
  可以在查询之间使用 UNION 运算符,以将查询的结果组合成单个结果集。
按时间段统计登录次数
select to_char(starttime,'yyyy-mm-dd hh24') as "时间段",count(starttime) as "登录次数"
from venus_audit_session_hist t where t.category='VENUS4A'
and to_char(starttime,'yyyy-mm-dd') > '2012-05-01'
group by to_char(starttime,'yyyy-mm-dd hh24')  having count(starttime) >= 5 order by to_char(starttime,'yyyy-mm-dd hh24') desc;

你可能感兴趣的:(oracle)