Oracle 基础语法

oracle常用命令

文章目录

  • oracle常用命令
    • 一. 基础命令
      • 1.1.1 查看oracle数据库的单个表结构
      • 1.1.2 查看oracle单个数据表包含的索引
      • 1.1.3 更新多个记录
      • 1.1.4 锁表解决方案
      • 1.1.5 Oracle连接池监控
      • 1.1.6 新用户创建及授权
      • 1.1.7 [oracle中在一张表中新增字段和字段说明](https://www.cnblogs.com/Samuel-Leung/p/11683658.html)
      • 1.1.8 查看表注释
      • 1.1.9 oracle查看所有表的数据量
      • 1.1.10 分区表创建
      • 1.1.11 数据容量统计
      • 1.1.12 数据总量统计
      • 1.1.13 查询sql执行最慢的语句
      • 1.2.1 union all和union的区别 怎么使用
      • 1.2.2 解决Oracle出现以0开头的小数,开头的0消失的问题
      • 1.2.3 统计总数以及百分比
      • 1.2.4 oracle 查询某天的数据
    • 二、存储过程
      • 2.1.1 创建/调用 存储过程
      • 2.1.2 **Oracle字符集**
      • 2.1.3 oracle 字符串分割 去重、排序
      • 2.1.4 oracle group by 显示其他字段
      • 2.1.5 使用Oracle执行计划分析SQL性能
      • 2.1.6 Oracle 查询表字段和注释
      • 2.1.7 统计数据库每天的数据增长量
      • 2.1.8 创建索引
      • 2.1.9 **自动给表添加字段注释**
      • 2.1.10 插入多条记录
      • 2.1.11 oracle表数据误删恢复,表误删恢复
      • 2.1.12 Oracle DBA常用查询
      • 2.1.13 Oracle 树操作(select…start with…connect by…prior)
      • 2.1.14 用户管理
      • 2.1.15 **Oracle数据备份恢复**
      • 2.1.16 Oracle常用语句(时间格式、去重、去特殊符号、查询表空间等)
      • 2.1.17 like多条件
      • 2.1.18 存储过程创建和调用
      • 2.1.19
      • 2.1.20 [ORACLE查询字段中含有空格的数据](https://www.cnblogs.com/zougang/p/6418874.html)
      • 2.1.21 [oracle创建表空间自增长和创建用户](https://www.cnblogs.com/liushuaibiao/p/10783986.html)
      • 2.1.17
      • 2.1.17
      • 2.1.17
      • 2.1.17
      • 2.1.17
      • 2.1.17
      • 2.1.17
      • 2.1.17
      • 2.1.17
      • 2.1.17
  • PostgreSQL教程
    • 1.1 参考文档
      • PostgreSQL教程
    • 1.2 杂项

一. 基础命令

1.1.1 查看oracle数据库的单个表结构

--查看oracle数据库的单个表结构
select dbms_metadata.get_ddl('TABLE','TABLE_NAME') from dual;


select upper('ksj_gkt_flowinst') from dual;
select dbms_metadata.get_ddl('TABLE','KSJ_GKT_FLOWINST') from dual;

select table_name,column_name,comments from user_col_comments where table_name='JH';
select table_name,column_name,comments from user_col_comments where table_name='KSJ_GKT_FLOWINST';

1.1.2 查看oracle单个数据表包含的索引

--查看oracle单个数据表包含的索引
select * from user_indexes where table_name=upper('table_name');
select * from user_indexes where table_name=upper('ksj_gkt_flowinst');


--根据索引名查看索引包含的字段
select * from user_ind_columns where index_name = 'INDEXS_NAME';
select * from user_ind_columns where index_name = 'IDX_KSJ_GKT_FLOWINST_INSTID';

SELECT * FROM ksj_gkt_flowinst t t.instid



select a.uniqueness 索引类型,b.index_name 索引名称,b.column_name 字段 from user_indexes a ,user_ind_columns b
where a.table_name=b.table_name and a.index_name = b.index_name 
and a.table_owner=upper('ETL') and  a.table_name='HIS_BANKMENTRUST' order by a.uniqueness desc;


select a.uniqueness 索引类型,b.index_name 索引名称,b.column_name 字段 from user_indexes a ,user_ind_columns b
where a.table_name=b.table_name and a.index_name = b.index_name 
 and  a.table_name='JCK_FW_JCXX_LD' order by a.uniqueness desc;


---
--在数据库中查找表名
select * from user_tables where  table_name like 'tablename%';
select * from user_tables where  table_name like 'TMP_%';


--查看该表的所有索引
select * from all_indexes where table_name = 'tablename';
 
--查看该表的所有索引列
select* from all_ind_columns where table_name = 'tablename';


create index 索引名 on 表名(列名);




/*
利用Oracle中系统自带的两个视图可以实现查看表中主键信息,语句如下:
select a.constraint_name,  a.column_name 
from user_cons_columns a, user_constraints b 
where a.constraint_name = b.constraint_name 
  and b.constraint_type = 'P' and a.table_name = '大写的表名'
查看表的主键约束名称,以及主键约束的字段名称。如果没有,则返回空
*/
select a.constraint_name,  a.column_name 
from user_cons_columns a, user_constraints b 
where a.constraint_name = b.constraint_name 
  and b.constraint_type = 'P' and a.table_name = upper('ksj_gkt_flowinst');


/*
要求计算某个表所占表空间的大小,网上查了些资料用到了oracle的 3 个视图。具体sql如下

select segment_name as tablename,
       round(bytes /
             (select sum(a.bytes)
                from dba_data_files a, user_users b
                where a.tablespace_name = b.default_tablespace) * 100,3)
 from user_segments
 where segment_name = '表名'

*/
select segment_name as tablename,
       round(bytes /
             (select sum(a.bytes)
                from dba_data_files a, user_users b
                where a.tablespace_name = b.default_tablespace) * 100,3)
 from user_segments
 where segment_name = upper('ksj_gkt_flowinst'); -- 2.816
---
-- 一年的第几天     
select TO_CHAR(SYSDATE,'DDD'),sysdate from dual;

select   to_char(sysdate, 'yyyy-MM-dd   HH24:mi:ss ')   from   dual; -- //mi是分钟             2013-11-25 18:45:32
select   to_char(sysdate, 'yyyy-MM-dd   HH24:mm:ss ')   from   dual; -- //mm会显示月份   2013-11-25 18:11:32





alter session set nls_date_language='AMERICAN';         --以英语显示日期 
alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS.FF';

select * from nls_session_parameters where parameter='NLS_DATE_LANGUAGE';






1.1.3 更新多个记录

更新多个记录
Oracle写法1

Merge into PUR_PO A

   Using (SELECT TOTAL_AMOUNT,PO_NO FROM PUR_ACCEPT WHERE  FORM_NO=1021 AND ACCEPT_TYPE_VALUE=1) B
     on (A.FORM_NO=B.PO_NO  )
    when Matched then Update set A.a=A.a-B.TOTAL_AMOUNT,A.b=A.b+b.TOTAL_AMOUNT
 

-- example 00
Merge into xsq_glgxb A 
Using (SELECT distinct buildingbm,X,Y FROM ld) B
on (A.buildingbm=B.buildingbm)
when Matched then Update set A.X=B.X,A.Y=B.Y;
commit;

-- example 01
Merge into jck_rk_jcxx A 
Using (SELECT distinct zjhm,RKXQWYBJ X FROM ywk_rk_dagl) B
on (A.zjhm=B.zjhm)
when Matched then Update set A.RKXQWYBJ=B.X;
commit;


-- example 02
Merge into jck_rk_jcxx A
Using (SELECT distinct zjhm, JZFS, MZ, ZZMM, ZJXY, HYQK, ZGXL
         FROM ywk_rk_dagl) B
on (A.zjhm = B.zjhm)
when Matched then
  Update
     set A.JZFS = B.JZFS,
         A.MZ   = B.MZ,
         A.ZZMM = B.ZZMM,
         A.ZJXY = B.ZJXY,
         A.HYQK = B.HYQK,
         A.ZGXL = B.ZGXL;

commit;

-- example 03
Merge into t_entity_report A 
Using (SELECT * FROM kjk_dlst_s a where a.xl='城中村') B
on (A.report_id=B.kid)
when Matched then Update set A.area=B.mj;
commit;


Oracle写法2 

UPDATE PUR_PO p1 set(a, b)=(select p1.a - p2.total_amount, p1.b + p2.total_amount from PUR_ACCEPT p2 where p1.form_no=p2.po_no and p2.FORM_NO=1021 AND p2.ACCEPT_TYPE_VALUE=1)
where  exists(select * from PUR_ACCEPT p2 where p1.form_no=p2.po_no and p2.FORM_NO=1021 AND p2.ACCEPT_TYPE_VALUE=1)


--example01
update szs_ywk_tydz a 
set wgmc=(select wgmc from test_01 b where a.tydzbm = b.tydzbm)
where exists(select 1 from test_01 b where a.tydzbm = b.tydzbm);

--example02
update kjk_dlst_s a 
set (a.dlstmc,a.dz)=(select b.entity_name,b.entity_address from tmp_03 b where a.kid = b.report_id)
where exists(select 1 from tmp_03 b where a.kid = b.report_id);

--example03
update t_entity_report a 
set (a.username,a.usernumber,a.process_type)=(SELECT a1.username,a1.user_number,'28' gg FROM tb_user_info a1  where a.userid = a1.userid)
where a.xlstlxmc = '社康片区' and  exists(SELECT 2 FROM tb_user_info a1  where a.userid = a1.userid);
























1.1.4 锁表解决方案

select b.owner TABLEOWNER, b.object_name TABLENAME, c.OSUSER LOCKBY,
c.USERNAME LOGINID, c.sid SID, c.SERIAL# SERIAL
from v$locked_object a,dba_objects b, v$session c 
where b.object_id = a.object_id AND a.SESSION_ID =c.sid;

--通过SID, SERIAL解锁 
--alter system kill session 'SID, SERIAL';

alter system kill session '226, 5986';


select * from v$session;


SELECT OBJECT_NAME,SESSION_ID SID,MACHINE,VS.MODULE, 'ALTER SYSTEM KILL SESSION '''||SESSION_ID|| ', '||SERIAL#|| '''; ' KILL_SESSION,VS.STATUS,VS.ACTION,SERIAL#,ORACLE_USERNAME,OS_USER_NAME
FROM V$LOCKED_OBJECT VO, V$SESSION VS, ALL_OBJECTS AO 
WHERE VO.SESSION_ID = VS.SID AND AO.OBJECT_ID = VO.OBJECT_ID AND NVL(VS.ACTION, ' ') <> 'Service Management ' ORDER BY OBJECT_NAME,MACHINE,VS.MODULE;



SELECT OBJECT_NAME,
       SESSION_ID SID,
       MACHINE,
       VS.MODULE,
       'ALTER SYSTEM KILL SESSION ''' || SESSION_ID || ', ' || SERIAL# ||
       '''; ' KILL_SESSION,
       VS.STATUS,
       VS.ACTION,
       SERIAL#,
       ORACLE_USERNAME,
       OS_USER_NAME

  FROM V$LOCKED_OBJECT VO, V$SESSION VS, ALL_OBJECTS AO
 WHERE VO.SESSION_ID = VS.SID
   AND AO.OBJECT_ID = VO.OBJECT_ID
   AND NVL(VS.ACTION, ' ') <> 'Service Management '
 ORDER BY OBJECT_NAME, MACHINE, VS.MODULE;




SELECT sq.INST_ID,

       SQ.SQL_TEXT, /*SQL文本*/

       SE.SID, /*会话的唯一标识,通常要对某个会话进行分析前,首先就需要获得该会话的SID。*/

       SE.BLOCKING_SESSION,

       SQ.OPTIMIZER_COST AS COST_, /* COST 值*/

       SE.LAST_CALL_ET CONTINUE_TIME, /*执行时间*/

       SE.EVENT, /*等待事件*/

       SE.LOCKWAIT, /*是否等待LOCK(SE,P)*/

       SE.MACHINE, /*客户端的机器名。(WORKGROUP\PC-201211082055)*/

       SQ.SQL_ID, /*SQL_ID*/

       SE.USERNAME, /*创建该会话的用户名*/

       SE.LOGON_TIME, /*登陆时间*/

       'ALTER SYSTEM KILL SESSION ''' || SE.SID || ',' || SE.SERIAL# ||

       ''';' KILL --若存在锁情况,会用到KILL锁释放~

  FROM gV$SESSION SE, /*会话信息。每一个连接到ORACLE数据库的会话都能在该视图中对应一条记录,根据该视图中的信息可以查询该会话使用的用户,正在执行或者刚刚执行的SQL语句*/

       /**/

       gV$SQLAREA SQ /*跟踪所有SHARED POOL中的共享CURSOR信息,包括 执行次数,逻辑读,物理读等*/

WHERE SE.SQL_HASH_VALUE = SQ.HASH_VALUE

   AND SE.STATUS = 'ACTIVE'

   AND SE.SQL_ID = SQ.SQL_ID

   AND SE.USERNAME = SQ.PARSING_SCHEMA_NAME

      --过滤条件

   AND SE.USERNAME = 'FWSB' --用户名

   and se.BLOCKING_SESSION is not null;

1.1.5 Oracle连接池监控

--建表
create table process_history_count(id varchar2(32),machine varchar2(100),program varchar2(100),process_num int,createtime date);

--创建存储过程
create or replace procedure PROC_PROCESS_HISTORY_COUNT as 
begin
	insert into process_history_count
select to_char(sysdate,'yyyymmddhh24mi'), b.MACHINE, b.PROGRAM , count(*),sysdate from v$process a, v$session b where a.ADDR = b.PADDR and  b.USERNAME is not null   group by  b.MACHINE  , b.PROGRAM order by count(*) desc;
commit;
end;

--创建job
begin
  sys.dbms_scheduler.create_job(job_name            => 'SYS.JOB_PROCESS_HISTORY_COUNT',
                                job_type            => 'STORED_PROCEDURE',
                                job_action          => 'PROC_PROCESS_HISTORY_COUNT',
                                start_date          => to_date('27-05-2020 14:00:00', 'dd-mm-yyyy hh24:mi:ss'),
                                repeat_interval     => 'Freq=Minutely;Interval=5',
                                end_date            => to_date(null),
                                job_class           => 'DEFAULT_JOB_CLASS',
                                enabled             => true,
                                auto_drop           => false,
                                comments            => '监控连接池');
end;



连接池满的问题可以先用这个脚本监控下,便于问题原因分析。脚本中建job是使用的sys账号,如果有sys账号就直接使用。
没有sys账号,找个具有查看V$session 和V$process视图权限的账号也可以。





1.1.6 新用户创建及授权


create user jyw identified by jyw123456;
grant connect,resource,dba to jyw;

create user cw identified by 123456;
grant connect,resource,dba to cw;

create user abc identified by 123456;
grant connect,resource,dba to abc;


很多时候我们用拥有DBA权限的用户 从oracle数据库导出数据,那么再导入新的数据库时就还得需要DBA权限的用户,下面是如何创建一个新用户并授予DBA权限命令。

1.用有dba权限的用户登录:sys用户

2.创建一个新用户:create user abc identified by 123456;

3.授予DBA权限: grant connect,resource,dba to abc;

ok,创建好了,就可以用abc这个用户登录了,abc用户拥有dba权限。

select * from dba_users; 查看数据库里面所有用户,前提是你是有dba权限的帐号,如sys,system
select * from all_users; 查看你能管理的所有用户!
select * from user_users; 查看当前用户信息 !


create user aml identified by 123456;

-- drop user aml ;
grant create session to aml;

grant unlimited tablespace to aml;
grant create tablespace to aml;
grant alter tablespace to aml;
grant drop tablespace to aml;
grant manage tablespace to aml;


grant create table to aml; 



二、为用户授权角色\撤销授权

oracle提供三种标准角色(role):connect/resource和dba.

connect role(连接角色)
临时用户,特指不需要建表的用户,通常只赋予他们connect role.

connect是使用oracle简单权限,这种权限只对其他用户的表有访问权限,包括select/insert/updatedelete等。
拥有connect role 的用户还能够创建表、视图、序列(sequence)、簇(cluster)、同义词(synonym)、回话(session)和其他 数据的链(link)。

resource role(资源角色)
更可靠和正式的数据库用户可以授予resource role。

resource提供给用户另外的权限以创建他们自己的表、序列、过程(procedure)、触发器(trigger)、索引(index)和簇(cluster)。

dba role(数据库管理员角色)
dba role拥有所有的系统权限

包括无限制的空间限额和给其他用户授予各种权限的能力。



create user connect_admin identified by 123456;
grant connect to connect_admin;

create user resource_admin identified by 123456;
grant connect,resource to resource_admin;


-- 为用户user1授权:
grant connect, resource to user1;

-- 撤销对user1赋予的权限:
revoke connect, resource from user1;


-- 将空间分配给用户
 
语法:alert user username default tablespace tablespacename;
 alert user username default tablespace tablespacename;

alert user PINEAPPLE default tablespace plum;

alert user CW default tablespace plum;
alert user TEST default tablespace plum;
alert user JYW default tablespace plum;
alert user PINEAPPLE default tablespace plum;

-- 将名字为tablespacename的表空间分配给username

select * from tablespace;

grant create table,unlimited tablespace,create session,connect,resource,dba to PINEAPPLE;

CREATE TABLESPACE "WatermelonWatermelon"
 DATAFILE  'WatermelonWatermelon' SIZE 100 M AUTOEXTEND ON


首先,授权给指定用户。

          一个用户的默认表空间只能有一个,但是你可以试下用下面的语句为其授权在别的表空间中创建对像:

         alter user  username quota 0||unlimited on tablespace_name;

再者,创造表的命令。

          一个用户可以拥有多个表空间在创建表时:

          create table TABLE_NAME () tablespace TABLESPACE_NAME;这样你所创建的表便在指定的空间下了。



select t.default_tablespace,
       to_char(wmsys.wm_concat(username)) all_users
  from dba_users t
 group by t.default_tablespace;


select* from v$log;


select t.default_tablespace,
       to_char(wmsys.wm_concat(username)) all_users,
       min(t.created) minCreateTime
  from dba_users t
 group by t.default_tablespace
 order by minCreateTime;

CREATE USER "APPLE" IDENTIFIED BY "123456" DEFAULT TABLESPACE "Apple" TEMPORARY TABLESPACE "TEMP";

GRANT "DBA" TO "APPLE";

ALTER USER "APPLE" DEFAULT ROLE "DBA"


-- Oracle快速创建百万数据

create table myTestTable as 
select rownum as id,
               to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
               trunc(dbms_random.value(0, 100)) as random_id,
               dbms_random.string('x', 20) random_string
          from dual
        connect by level <= 1000000;







--1,查看表空间的名称及大小
SELECT t.tablespace_name,round(SUM(bytes /1024 * 1024)),0)ts_size 
FROM dba_tablespaces t,dba_data_files d 
WHERE t.tablespace_name = d.tablespace_name 
GROUP BY t。 tablespace_name; 
--2,查看表空间物理文件的名称和大小
选择tablespace_name,
file_id,
file_name,
round(bytes /1024 * 1024),0)total_space 
FROM dba_data_files 
ORDER BY tablespace_name; 
--3,查看回滚段名称及大小
SELECT segment_name,
表空间名称,
r.status,
(initial_extent / 1024)
initialextent ,(next_extent / 1024)nextextent,
max_extents,
v.curext curxtent 
来自dba_rollback_segs r,v $ rollstat v
其中r.segment_id = v.usn(+ORDER BY segment_name; 
--4,查看控制文件
从v $ controlfile中选择名称;
--5,查看日志文件
从v $ logfile中选择成员;
--6,查看表空间的使用情况
SELECT SUM(bytes)/1024 * 1024AS free_space,tablespace_name 
FROM dba_free_space 
GROUP BY tablespace_name; 
选择a.tablespace_name,
总共a.bytes,
已使用b.bytes,
可用c.bytes,
(b.bytes * 100/ a.bytes“%USED”,
(c.bytes * 100/a.bytes“%FREE “ 
FROM sys.sm $ ts_avail a,sys.sm $ ts_used b,sys.sm $ ts_free c 
WHERE a.tablespace_name = b.tablespace_name 
AND a.tablespace_name = c.tablespace_name; 
--7,查看数据库库对象
SELECT owner,object_type,status,COUNT(*)count#
FROM all_objects 
GROUP BY所有者,object_type,status; 
--8,查看数据库的版本  从product_component_version 
选择版本 WHERE substr(product,16='Oracle'; --9, 从v $ database选择SELECT创建,log_mode,log_mode;




--1G = 1024MB 
--1M = 1024KB 
--1K = 1024Bytes 
--1M = 11048576Bytes 
--1G = 1024 * 11048576Bytes = 11313741824Bytes 
SELECT a.tablespace_name“表空间名”,
总计“表空间大小”,
免费的“表空间”剩余大小”,
(总计-免费)“表空间使用大小”,
总计/1024 * 1024 * 1024)“表空间大小(G)”,
免费/1024 * 1024 * 1024)“表空间剩余大小(G )”,
(总计-空闲)/1024 * 1024 * 1024)“表空间使用大小(G)”,
round((总计-免费)/总数,4* 100“使用率%” 
FROMSELECT tablespace_name, SUM(bytes)free 
from dba_free_space 
GROUP BY tablespace_name)a,
(SELECT tablespace_name,总和(字节), 
来自dba_data_files 
GROUP BY表空间名称)b
其中a.tablespace_name = b.tablespace_name 


查自己拥有哪些系统权限
select * from session_privs; 


查询用户拥有哪里权限: 
SQL> select * from dba_role_privs;
SQL> select * from dba_sys_privs;
SQL> select * from role_sys_privs; 

删除用户
SQL> drop user 用户名 cascade;  //加上cascade则将用户连同其创建的东西全部删除
系统权限传递:
增加WITH ADMIN OPTION选项,则得到的权限可以传递。
SQL> grant connect, resorce to user50 with admin option;  //可以传递所获权限。
系统权限回收:系统权限只能由DBA用户回收
SQL> Revoke connect, resource from user50; 
说明: 
1)如果使用WITH ADMIN OPTION为某个用户授予系统权限,那么对于被这个用户授予相同权限的所有用户来说,取消该用户的系统权限并不会级联取消这些用户的相同权限。
2)系统权限无级联,即A授予B权限,B授予C权限,如果A收回B的权限,C的权限不受影响;系统权限可以跨用户回收,即A可以直接收回C用户的权限。 
实体权限管理 
实体权限分类
select, update, insert, alter, index, delete, all  //all包括所有权限
execute  //执行存储过程权限
user01:
SQL> grant select, update, insert on product to user02;
SQL> grant all on product to user02;
user02:
SQL> select * from user01.product; 
// 此时user02查user_tables,不包括user01.product这个表,但如果查all_tables则可以查到,因为他可以访问。
将表的操作权限授予全体用户:
SQL> grant all on product to public;  // public表示是所有的用户,这里的all权限不包括drop。
实体权限数据字典
SQL> select owner, table_name from all_tables; // 用户可以查询的表
SQL> select table_name from user_tables;  // 用户创建的表
SQL> select grantor, table_schema, table_name, privilege from all_tab_privs; // 获权可以存取的表(被授权的)
SQL> select grantee, owner, table_name, privilege from user_tab_privs;    // 授出权限的表(授出的权限)
DBA用户可以操作全体用户的任意基表(无需授权,包括删除):
DBA用户:
SQL> Create table stud02.product(
 id number(10),
 name varchar2(20));
SQL> drop table stud02.emp;

SQL> create table stud02.employee
 as
 select * from scott.emp; 
实体权限传递(with grant option):
user01:
SQL> grant select, update on product to user02 with grant option; // user02得到权限,并可以传递。
实体权限回收:
user01:
SQL>Revoke select, update on product from user02;  //传递的权限将全部丢失。
说明
1)如果取消某个用户的对象权限,那么对于这个用户使用WITH GRANT OPTION授予权限的用户来说,同样还会取消这些用户的相同权限,也就是说取消授权时级联的。 
Oracle 角色管理 
角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限。系统预定义角色是在数据库安装后,系统自动创建的一些常用的角色。下介简单的介绍一下这些预定角色。角色所包含的权限可以用以下语句查询:
sql>select * from role_sys_privs where role='角色名'; 
CONNECT, RESOURCE, DBA:这些预定义角色主要是为了向后兼容。其主要是用于数据库管理。oracle建议用户自己设计数据库管理和安全的权限规划,而不要简单的使用这些预定角色。将来的版本中这些角色可能不会作为预定义角色。
DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE, SELECT_CATALOG_ROLE:这些角色主要用于访问数据字典视图和包。
EXP_FULL_DATABASE, IMP_FULL_DATABASE:这两个角色用于数据导入导出工具的使用。
AQ_USER_ROLE, AQ_ADMINISTRATOR_ROLE:AQ:Advanced Query。这两个角色用于oracle高级查询功能。
SNMPAGENT:用于oracle enterprise manager和Intelligent Agent
RECOVERY_CATALOG_OWNER:用于创建拥有恢复库的用户。关于恢复库的信息,参考oracle文档《Oracle9i User-Managed Backup and Recovery Guide》
HS_ADMIN_ROLE:A DBA using Oracle's heterogeneous services feature needs this role to access appropriate tables in the data dictionary.
管理角色 
建一个角色
sql>create role role1; 
授权给角色
sql>grant create any table,create procedure to role1; 
授予角色给用户
sql>grant role1 to user1; 
查看角色所包含的权限
sql>select * from role_sys_privs; 
创建带有口令以角色(在生效带有口令的角色时必须提供口令)
sql>create role role1 identified by password1;
修改角色:是否需要口令 
sql>alter role role1 not identified;
sql>alter role role1 identified by password1; 
设置当前用户要生效的角色
(注:角色的生效是一个什么概念呢?假设用户a有b1,b2,b3三个角色,那么如果b1未生效,则b1所包含的权限对于a来讲是不拥有的,只有角色生效了,角色内的权限才作用于用户,最大可生效角色数由参数MAX_ENABLED_ROLES设定;在用户登录后,oracle将所有直接赋给用户的权限和用户默认角色中的权限赋给用户。)
sql>set role role1; //使role1生效
sql>set role role,role2; //使role1,role2生效
sql>set role role1 identified by password1; //使用带有口令的role1生效
sql>set role all; //使用该用户的所有角色生效
sql>set role none; //设置所有角色失效
sql>set role all except role1; //除role1外的该用户的所有其它角色生效。
sql>select * from SESSION_ROLES; //查看当前用户的生效的角色。
修改指定用户,设置其默认角色 
sql>alter user user1 default role role1;
sql>alter user user1 default role all except role1; 
详见oracle参考文档
9.删除角色
sql>drop role role1; 
角色删除后,原来拥用该角色的用户就不再拥有该角色了,相应的权限也就没有了。
说明: 
1)无法使用WITH GRANT OPTION为角色授予对象权限
2)可以使用WITH ADMIN OPTION 为角色授予系统权限,取消时不是级联

与权限安全相关的数据字典表有:
ALL_TAB_PRIVS
ALL_TAB_PRIVS_MADE
ALL_TAB_PRIVS_RECD
DBA_SYS_PRIVS
DBA_ROLES
DBA_ROLE_PRIVS
ROLE_ROLE_PRIVS
ROLE_SYS_PRIVS
ROLE_TAB_PRIVS
SESSION_PRIVS
SESSION_ROLES
USER_SYS_PRIVS
USER_TAB_PRIV
oracle的系统和对象权限列表 
alter any cluster 修改任意簇的权限
alter any index 修改任意索引的权限
alter any role 修改任意角色的权限
alter any sequence 修改任意序列的权限
alter any snapshot 修改任意快照的权限
alter any table 修改任意表的权限
alter any trigger 修改任意触发器的权限
alter cluster 修改拥有簇的权限
alter database 修改数据库的权限
alter procedure 修改拥有的存储过程权限
alter profile 修改资源限制简表的权限
alter resource cost 设置佳话资源开销的权限
alter rollback segment 修改回滚段的权限
alter sequence 修改拥有的序列权限
alter session 修改数据库会话的权限
alter sytem 修改数据库服务器设置的权限
alter table 修改拥有的表权限
alter tablespace 修改表空间的权限
alter user 修改用户的权限
analyze 使用analyze命令分析数据库中任意的表、索引和簇
audit any 为任意的数据库对象设置审计选项
audit system 允许系统操作审计
backup any table 备份任意表的权限
become user 切换用户状态的权限
commit any table 提交表的权限
create any cluster 为任意用户创建簇的权限
create any index 为任意用户创建索引的权限
create any procedure 为任意用户创建存储过程的权限
create any sequence 为任意用户创建序列的权限
create any snapshot 为任意用户创建快照的权限
create any synonym 为任意用户创建同义名的权限
create any table 为任意用户创建表的权限
create any trigger 为任意用户创建触发器的权限
create any view 为任意用户创建视图的权限
create cluster 为用户创建簇的权限
create database link 为用户创建的权限
create procedure 为用户创建存储过程的权限
create profile 创建资源限制简表的权限
create public database link 创建公共数据库链路的权限
create public synonym 创建公共同义名的权限
create role 创建角色的权限
create rollback segment 创建回滚段的权限
create session 创建会话的权限
create sequence 为用户创建序列的权限
create snapshot 为用户创建快照的权限
create synonym 为用户创建同义名的权限
create table 为用户创建表的权限
create tablespace 创建表空间的权限
create user 创建用户的权限
create view 为用户创建视图的权限
delete any table 删除任意表行的权限
delete any view 删除任意视图行的权限
delete snapshot 删除快照中行的权限
delete table 为用户删除表行的权限
delete view 为用户删除视图行的权限
drop any cluster 删除任意簇的权限
drop any index 删除任意索引的权限
drop any procedure 删除任意存储过程的权限
drop any role 删除任意角色的权限
drop any sequence 删除任意序列的权限
drop any snapshot 删除任意快照的权限
drop any synonym 删除任意同义名的权限
drop any table 删除任意表的权限
drop any trigger 删除任意触发器的权限
drop any view 删除任意视图的权限
drop profile 删除资源限制简表的权限
drop public cluster 删除公共簇的权限
drop public database link 删除公共数据链路的权限
drop public synonym 删除公共同义名的权限
drop rollback segment 删除回滚段的权限
drop tablespace 删除表空间的权限
drop user 删除用户的权限
execute any procedure 执行任意存储过程的权限
execute function 执行存储函数的权限
execute package 执行存储包的权限
execute procedure 执行用户存储过程的权限
force any transaction 管理未提交的任意事务的输出权限
force transaction 管理未提交的用户事务的输出权限
grant any privilege 授予任意系统特权的权限
grant any role 授予任意角色的权限
index table 给表加索引的权限
insert any table 向任意表中插入行的权限
insert snapshot 向快照中插入行的权限
insert table 向用户表中插入行的权限
insert view 向用户视图中插行的权限
lock any table 给任意表加锁的权限
manager tablespace 管理(备份可用性)表空间的权限
references table 参考表的权限
restricted session 创建有限制的数据库会话的权限
select any sequence 使用任意序列的权限
select any table 使用任意表的权限
select snapshot 使用快照的权限
select sequence 使用用户序列的权限
select table 使用用户表的权限
select view 使用视图的权限
unlimited tablespace 对表空间大小不加限制的权限
update any table 修改任意表中行的权限
update snapshot 修改快照中行的权限
update table 修改用户表中的行的权限
update view 修改视图中行的权限

God, Grant me the SERENITY, to accept the things I cannot change, COURAGE to change the things I can, and the WISDOM to know the difference.

1.1.7 oracle中在一张表中新增字段和字段说明

ALTER TABLE szs_ywk_tydz ADD wgmc VARCHAR2(32);
comment on column szs_ywk_tydz.wgmc is '网格名称';


ALTER TABLE AAA ADD A VARCHAR2(32);
comment on column AAA.A is '新增字段A';


ALTER TABLE jck_rk_jcxx ADD RKXQWYBJ VARCHAR2(50);
comment on column jck_rk_jcxx.RKXQWYBJ is '人口详情唯一标记';



ALTER TABLE jck_rk_jcxx ADD RKXQWYBJ VARCHAR2(50);
comment on column jck_rk_jcxx.RKXQWYBJ is '人口详情唯一标记';


/*
名称	类型	可为空	默认	注释
JZFS	VARCHAR2(5)	Y		居住方式
MZ	VARCHAR2(5)	Y		民族
ZZMM	VARCHAR2(5)	Y		政治面貌
ZJXY	VARCHAR2(50)	Y		宗教信仰
HYQK	VARCHAR2(5)	Y		婚姻情况
ZGXL	VARCHAR2(5)	Y		最高学历

*/


alter table jck_rk_jcxx
add (ZJXY varchar2(50) default '0' not null,name varchar2(100) not null,age number default 0 not null);

alter table jck_rk_jcxx
add (JZFS varchar2(5) ,
MZ	 varchar2(5) ,
ZZMM varchar2(5) ,
ZJXY varchar2(50) ,
HYQK varchar2(5),
ZGXL varchar2(5) ,
);


alter table jck_fr_jcxx add(
FLBM	VARCHAR2(5)	,
JYDTYDZBM	VARCHAR2(25)	,
DJSJ	DATE	,
SFZCFR	VARCHAR2(50)	,
JYFW	VARCHAR2(200)	,
FZJG	VARCHAR2(50)	,
FRDB	VARCHAR2(100)	
);
comment	on	column	jck_fr_jcxx.FLBM	is	'分类编码'	;
comment	on	column	jck_fr_jcxx.JYDTYDZBM	is	'经营地统一地址编码'	;
comment	on	column	jck_fr_jcxx.DJSJ	is	'登记时间'	;
comment	on	column	jck_fr_jcxx.SFZCFR	is	'是否注册法人'	;
comment	on	column	jck_fr_jcxx.JYFW	is	'经营范围'	;
comment	on	column	jck_fr_jcxx.FZJG	is	'发证机关'	;
comment	on	column	jck_fr_jcxx.FRDB	is	'法人代表'	;

1.1.8 查看表注释

SELECT T1.TABLE_NAME,
       T1.COLUMN_NAME,
       T1.DATA_TYPE || '(' || T1.DATA_LENGTH || ')',
       T2.COMMENTS
  FROM USER_TAB_COLS T1, USER_COL_COMMENTS T2
 WHERE T1.TABLE_NAME = T2.TABLE_NAME
   AND T1.COLUMN_NAME = T2.COLUMN_NAME
   AND T1.TABLE_NAME = upper('jck_rk_jcxx');
   
   
   
   如果是DBA则可能过ALL_ 和DBA_来查询所有的表结构。

SQL92的写法,但是不知道怎么加限制条件,好像用了USING就不可以了。当然可以去掉USING换成 ON

SELECT TABLE_NAME,
       COLUMN_NAME,
       T1.DATA_TYPE || '(' || T1.DATA_LENGTH || ')',
       T2.COMMENTS
  FROM USER_TAB_COLS T1 INNER JOIN USER_COL_COMMENTS T2
  USING(table_name,COLUMN_name);

注意,如果有些字段没有注释,是不能显示的, 这样改:
   SELECT t.table_name,
       t.colUMN_NAME,
       t.DATA_TYPE || '(' || t.DATA_LENGTH || ')',
       t1.COMMENTS
  FROM User_Tab_Cols t, User_Col_Comments t1
 WHERE t.table_name = t1.table_name
    AND t.column_name = t1.column_name(+);

   
   --导出、生成当前用户的所有表和视图的注释
select 'comment on table '||a.table_name|| ' is '||''''||a.comments||''''||';' 
from user_tab_comments a 
where a.table_type in('TABLE','VIEW');

SELECT a.table_name,a.comments FROM user_tab_comments a where a.table_type in('TABLE');

/* 查询表注释 */
select 'comment on table '||a.table_name|| ' is '||''''||a.comments||''''||';' 
from user_tab_comments a 
where a.table_type in('TABLE','VIEW');

SELECT a.table_name,a.comments FROM user_tab_comments a where a.table_type in('TABLE') and a.table_name in ('JCK_RK_JCXX',
'JCK_FR_JCXX',
'JCK_FW_JCXX_LD',
'JCK_FW_JCXX_FJ',
'JCK_SJ_JCXX');



--导出、生成当前用户的所有表字段的注释
select 'comment on column '||t.table_name||'.'||t.column_name||' is '||''''||t.comments||''''||';'
from user_col_comments t

--导出、生成所有表的注释(需要dba权限)
select 'comment on table '||t.owner||'.'||t.table_name||' is '||''''||t.comments||''''||';'
from dba_tab_comments t
where t.table_type='TABLE' or t.table_type='VIEW';

--导出、生成所有字段的注释
select 'comment on column '||t.owner||'.'||t.table_name||'.'||t.column_name||' is '||''''||t.comments||''''||';'
from dba_col_comments t;




SELECT 
--t1.Table_Name || chr(13) || t3.comments       AS "表名称及说明",
     ROWNUM ,
       t1.Column_Name                                AS "字段名称",
       t1.DATA_TYPE             AS "数据类型",
             t1.DATA_LENGTH    AS "长度",
       t1.NullAble                                   AS "是否为空",
       t2.Comments                                   AS "字段说明",
       t1.Data_Default "默认值"
       --t4.created                                  AS "建表时间"
               --t3.comments                                 AS "表说明",
  FROM cols t1
  LEFT JOIN user_col_comments t2 
         ON t1.Table_name = t2.Table_name
        AND t1.Column_Name = t2.Column_Name
  LEFT JOIN user_tab_comments t3 
         ON t1.Table_name = t3.Table_name
  LEFT JOIN user_objects t4 
         ON t1.table_name = t4.OBJECT_NAME
  WHERE NOT EXISTS (SELECT t4.Object_Name
          FROM User_objects t4
         WHERE t4.Object_Type = 'TABLE'
           AND t4.Temporary = 'Y'
           AND t4.Object_Name = t1.Table_Name)
                     and t1.TABLE_NAME='你要查询的表名'
  ORDER BY t1.Table_Name, t1.Column_ID; 



1.1.9 oracle查看所有表的数据量


源地址:http://blog.csdn.net/zhanggnol/article/details/6683697

select t.table_name,t.num_rows from user_tables t ORDER BY NUM_ROWS DESC;

还可以直接查看dblink的:
select t.table_name,t.num_rows from user_tables@dblink t ORDER BY NUM_ROWS DESC;
select t.table_name,t.num_rows from user_tables t
若以上SQL查找不到,执行如下脚本即可:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
create or replace function count_rows(table_name in varchar2,
                              owner in varchar2 default null)
return number
authid current_user
IS
   num_rows number;
   stmt varchar2(2000);
begin
   if owner is null then
      stmt := 'select count(*) from "'||table_name||'"';
   else
      stmt := 'select count(*) from "'||owner||'"."'||table_name||'"';
   end if;
   execute immediate stmt into num_rows;
   return num_rows;
end;
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

之后,再查select table_name, count_rows(table_name) nrows from user_tables ,OK

mysql版本:

USE information_schema;
SELECT table_name,table_rows FROM TABLES
WHERE TABLE_SCHEMA = '数据库名'
ORDER BY table_rows DESC;

MySQL查询:需要使用mysql的版本在5.0及以上,主要是通过查询information_schema库中的tables表来获取,该表中使用table_rows记录表的行数信息。不过需要注意的是,对于InnoDB表,table_rows行计数仅是大概估计值。
-- ## 查询数据库总条数:
SELECT sum(sample_size) FROM user_tables;
 2 4629 0810
 
-- 查询数据库占用的空间:
select sum(bytes)/1024/1024  from dba_segments;




 SELECT D.COMMENTS AS 中文表名 ,
       A.TABLE_NAME AS 英文表名,
       C.COMMENTS AS 字段中文名,
       B.COLUMN_NAME AS 字段英文名
  FROM USER_TABLES A LEFT JOIN USER_TAB_COLUMNS B
    ON A.TABLE_NAME = B.TABLE_NAME
  LEFT JOIN USER_COL_COMMENTS C
    ON B.TABLE_NAME = C.TABLE_NAME
   AND B.COLUMN_NAME = C.COLUMN_NAME
  LEFT JOIN USER_TAB_COMMENTS D
    ON C.TABLE_NAME = D.TABLE_NAME;
    
    
-- 查找包含数字的数据
 SELECT D.COMMENTS AS 中文表名, A.TABLE_NAME AS 英文表名
   FROM USER_TABLES A
   LEFT JOIN USER_TAB_COMMENTS D
     ON A.TABLE_NAME = D.TABLE_NAME
  where regexp_substr(A.TABLE_NAME,'[0-9]+') is not null
     and D.COMMENTS is not null;

-- 查找不包含数字的数据
 SELECT D.COMMENTS AS 中文表名, A.TABLE_NAME AS 英文表名
   FROM USER_TABLES A
   LEFT JOIN USER_TAB_COMMENTS D
     ON A.TABLE_NAME = D.TABLE_NAME
  where regexp_substr(A.TABLE_NAME,'[0-9]+') is  null
     and D.COMMENTS is not null;


 SELECT D.COMMENTS AS 中文表名, A.TABLE_NAME AS 英文表名
   FROM USER_TABLES A
   LEFT JOIN USER_TAB_COMMENTS D
     ON A.TABLE_NAME = D.TABLE_NAME
  where regexp_substr(A.TABLE_NAME,'[0-9]+') is  null
  AND not regexp_like(A.TABLE_NAME,'TEMP|BAK|TEST')
     and D.COMMENTS is not null;

1.1.10 分区表创建

原表的sql语句如下:
CREATE TABLE “CBE_MESSAGE”
( “ID_” VARCHAR2(72 CHAR) NOT NULL ENABLE,
“CONTENT_” CLOB,
“CREAE_TIME_” NUMBER(19,0),
“KEY_” VARCHAR2(500 CHAR),
“OPT_TIME_” NUMBER(19,0),
“RETURN_INFO” VARCHAR2(500 CHAR),
“RETURN_STATUS” VARCHAR2(200 CHAR),
“RETURN_TIME_” TIMESTAMP (6),
“SIZE_” NUMBER(19,0),
“STATUS_” VARCHAR2(255 CHAR),
“TITLE_” VARCHAR2(500 CHAR),
“TYPE_” VARCHAR2(200 CHAR),
“INSERT_TIME” TIMESTAMP (6) DEFAULT systimestamp,
PRIMARY KEY (“ID_”)
)

创建一张与原表字段一样的临时分区表:CBE_MESSAGE_TEMP,建表语句如下:
CREATE TABLE “CBE_MESSAGE_TEMP”
(“ID_” VARCHAR2(72 CHAR) NOT NULL ENABLE,
“CONTENT_” CLOB,
“CREAE_TIME_” NUMBER(19,0),
“KEY_” VARCHAR2(500 CHAR),
“OPT_TIME_” NUMBER(19,0),
“RETURN_INFO” VARCHAR2(500 CHAR),
“RETURN_STATUS” VARCHAR2(200 CHAR),
“RETURN_TIME_” TIMESTAMP (6),
“SIZE_” NUMBER(19,0),
“STATUS_” VARCHAR2(255 CHAR),
“TITLE_” VARCHAR2(500 CHAR),
“TYPE_” VARCHAR2(200 CHAR),
“INSERT_TIME” TIMESTAMP (6) DEFAULT systimestamp,
PRIMARY KEY (“ID_”)
)
partition by range (INSERT_TIME) interval (NUMTODSINTERVAL (5,day) )
(partition default_ptablen values less than (to_date(2017-02-13, ‘yyyy-mm-dd’)));

将原表数据插入新建的临时分区表CBE_MESSAGE_TEMP,插入语句如下:
INSERT INTO CBE_MESSAGE_TEMP (ID_,CONTENT_,CREAE_TIME_,KEY_,OPT_TIME_,RETURN_INFO,RETURN_STATUS,RETURN_TIME_,SIZE_,STATUS_,TITLE_,TYPE_,INSERT_TIME)
SELECT ID_,CONTENT_,CREAE_TIME_,KEY_,OPT_TIME_,RETURN_INFO,RETURN_STATUS,RETURN_TIME_,SIZE_,STATUS_,TITLE_,TYPE_,INSERT_TIME FROM CBE_MESSAGE;

将原表重命名为CBE_MESSAGE_OLD,sql语句如下:
RENAME CBE_MESSAGE TO CBE_MESSAGE_OLD;

将新建的临时分区表CBE_MESSAGE_TEMP重命名为CBE_MESSAGE,sql语句如下:
RENAME CBE_MESSAGE_TEMP TO CBE_MESSAGE;

删除表CBE_MESSAGE_OLD,sql如下
DROP TABLE CBE_MESSAGE_OLD;


-- 查询表上有多少分区
SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'


--查询索引信息
select object_name,object_type,tablespace_name,sum(value) 
from v$segment_statistics 
where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX' 
group by object_name,object_type,tablespace_name 
order by 4 desc

--其他查询
--显示数据库所有分区表的信息: 

select * from DBA_PART_TABLES 

--显示当前用户可访问的所有分区表信息: 

select * from ALL_PART_TABLES 

--显示当前用户所有分区表的信息: 

select * from USER_PART_TABLES 

--显示表分区信息 显示数据库所有分区表的详细分区信息: 

select * from DBA_TAB_PARTITIONS 

--显示当前用户可访问的所有分区表的详细分区信息: 

select * from ALL_TAB_PARTITIONS 

--显示当前用户所有分区表的详细分区信息: 

select * from USER_TAB_PARTITIONS 

--显示子分区信息 显示数据库所有组合分区表的子分区信息: 

select * from DBA_TAB_SUBPARTITIONS 

--显示当前用户可访问的所有组合分区表的子分区信息: 

select * from ALL_TAB_SUBPARTITIONS 

--显示当前用户所有组合分区表的子分区信息: 

select * from USER_TAB_SUBPARTITIONS 

--显示分区列 显示数据库所有分区表的分区列信息: 

select * from DBA_PART_KEY_COLUMNS 

--显示当前用户可访问的所有分区表的分区列信息: 

select * from ALL_PART_KEY_COLUMNS 

--显示当前用户所有分区表的分区列信息: 

select * from USER_PART_KEY_COLUMNS 

--显示子分区列 显示数据库所有分区表的子分区列信息: 

select * from DBA_SUBPART_KEY_COLUMNS 

--显示当前用户可访问的所有分区表的子分区列信息: 

select * from ALL_SUBPART_KEY_COLUMNS 

--显示当前用户所有分区表的子分区列信息: 

select * from USER_SUBPART_KEY_COLUMNS 

--怎样查询出oracle数据库中所有的的分区表 

select * from user_tables a where a.partitioned='YES' 

--删除一个表的数据是 

truncate table table_name; 

--删除分区表一个分区的数据是 

alter table table_name truncate partition p5;



--表分区
--1,分区表信息
-- (1)显示数据库所有分区表的信息
select * from DBA_PART_TABLES a where a.owner=upper('') and a.table_name=upper('');
-- (2)显示当前用户可访问的所有分区表信息
select * from ALL_PART_TABLES  a where a.owner=upper('') and a.table_name=upper('');
-- (3)显示当前用户所有分区表的信息
select * from USER_PART_TABLES  a where a.table_name=upper('');
--2,分区表的分区列信息
-- (1)显示当前用户所有分区表的分区列信息
select * from USER_PART_KEY_COLUMNS a where a.name=upper('') and a.object_type='TABLE';
-- (2)显示当前用户可访问的所有分区表的分区列信息
select * from ALL_PART_KEY_COLUMNS  a where a.owner=upper('etl') and a.name=upper('') and a.object_type='TABLE';
--(3)显示分区列 显示数据库所有分区表的分区列信息
select * from DBA_PART_KEY_COLUMNS a where a.owner=upper('etl') and a.name=upper('') and a.object_type='TABLE';
-- 3,分区表的名字、归属表空间以及表的详细分区情况
select * from user_tab_partitions a where a.table_name=upper('');
-- 4,查看组合表的子分区信息以及子分区列信息情况
-- (1)显示当前用户所有组合分区表的子分区信息
select * from USER_TAB_SUBPARTITIONS;
-- (2)显示当前用户可访问的所有组合分区表的子分区信息
select * from ALL_TAB_SUBPARTITIONS; 
-- (3)显示当前用户可访问的所有组合分区表的子分区信息 
select * from ALL_TAB_SUBPARTITIONS ;
-- (4)显示当前用户所有分区表的子分区列信息
select * from USER_SUBPART_KEY_COLUMNS;
-- (5)显示当前用户可访问的所有分区表的子分区列信息
select * from ALL_SUBPART_KEY_COLUMNS; 
-- (6)显示子分区列 显示数据库所有分区表的子分区列信息 
select * from DBA_SUBPART_KEY_COLUMNS;


select * from user_tab_partitions a where a.table_name=upper('KSJ_GKT_FLOWINST_0713');
--——在表上执行查询
select * from KSJ_GKT_FLOWINST_0713;
select count(1) from KSJ_GKT_FLOWINST_0713;

--——在表分区上执行查询
select * from KSJ_GKT_FLOWINST_0713 partition(SYS_P221);
select * from KSJ_GKT_FLOWINST_0713 partition(SYS_P206);
select * from KSJ_GKT_FLOWINST_0713 partition(SYS_P226);

select count(1) from KSJ_GKT_FLOWINST_0713 partition(SYS_P221);



1.1.11 数据容量统计

oracle:
select sum(sum)||'G' from(
SELECT owner, segment_name, SUM(bytes / 1024 / 1024 / 1024) sum
  FROM dba_segments
 GROUP BY owner, segment_name);



mysql:
SELECT
SUM(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)/1024/1024/1024 AS total_GB
FROM information_schema.TABLES



1.1.12 数据总量统计

CREATE OR REPLACE FUNCTION count_rows (
  table_name IN varchar2, 
  owner IN varchar2 := NULL
)
RETURN number AUTHID current_user
AS
num_rows number;
  stmt varchar2(2000);
BEGIN
  IF owner IS NULL THEN
    stmt := 'select count(*) from "' || table_name || '"';
  ELSE
    stmt := 'select count(*) from "' || owner || '"."' || table_name || '"';
  END IF;
  EXECUTE IMMEDIATE stmt INTO num_rows;
  RETURN num_rows;
END;


select table_name, count_rows(table_name) nrows from user_tables 
order by nrows desc;

1.1.13 查询sql执行最慢的语句

-- 查询sql执行最慢的语句
select * from (select a.sql_text,a.sql_fulltext,a.executions "执行次数",round(a.elapsed_time / 1000000,2) "总执行时间",
 round(a.elapsed_time / 1000000 / a.executions,2) "平均时间",a.command_type,a.parsing_user_id "用户ID",b.username "用户",a.hash_value from
 v$sqlarea a left join all_users b on a.parsing_user_id=b.user_id where a.executions>0 order by (a.ELAPSED_TIME / a.executions) desc) where
 rownum<=50;
 
 -- 2.执行次数最多的sql语句
 select * from (select a.sql_text,a.executions "执行次数",a.parsing_user_id "用户",rank() over(order by a.executions desc) exec_rank
 from v$sql a left join all_users b on a.PARSING_USER_ID=b.user_id) c where exec_rank<=100; 
 
 select *
  from (select s.SQL_TEXT,
               s.EXECUTIONS "执行次数",
               s.PARSING_USER_ID "用户名",
               rank() over(order by EXECUTIONS desc) EXEC_RANK
          from v$sql s
          left join all_users u
            on u.USER_ID = s.PARSING_USER_ID) t
 where exec_rank <= 100;

1.2.1 union all和union的区别 怎么使用

一、区别1:取结果的交集

1、union: 对两个结果集进du行并集操作, 不包括重复行zhi,相当于distinct, 同时进行默认规则的dao排序;

2、union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复;
二、区别2:获取结果后的操作

1、union: 会对获取的结果进行排序操作

2、union all: 不会对获取的结果进行排序操作

三、区别3:

1、union看到结果中ID=3的只有一条

select * from student2 where id < 4

union

select * from student2 where id > 2 and id < 6

2、union all 结果中ID=3的结果有两个
select * from student2 where id < 4

union all

select * from student2 where id > 2 and id < 6
                                              
四、总结
union all只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用union all的执行效率要比union高

1.2.2 解决Oracle出现以0开头的小数,开头的0消失的问题

项目中碰到了个问题,本来报表需要显示“0.49%”,结果就是显示成“.49%”

找问题

首先在pl/sql工具里执行sql,发现原始的数据就是“.49%”,那么问题来了,原始sql的问题,跟工具无关了。

因为.49和“%”是通过字符串拼接的形式合成的,Oracle中存在一个隐形类型转换的问题,在拼接的过程中小数自动转成字符类型,相当于调用了to_char函数。

在类型隐形转换开始前先把小数转换成字符类型就不回出现这个问题了。
select to_char(0.12,'fm9999990.9999') ||'%' from dual;

给小数一个格式然后转换为字符类型可以解决这个问题。

当然此方法还可以解决强制性保留几位小数位,比如,‘0.5’,怎么让它变成 ‘0.5000’,很简单,上面的方法就可以用
select to_char(0.5,'fm9999990.0000') ||'%' from dual; 

有时候我们也会遇到123 需要转换为01,02,03 那么也可以使用这种方法
SELECT to_char(2,'fm00') FROM dual;


select round(a1/a2*100,2)||'%' from table
改成
select to_char(round(a1/a2*100,2),'fm999990.00')||'%' from table
其中FM表示去掉空格,999990.00分别代表整数位数和小数位数是几位

/*统计总数以及百分比*/
SELECT ldxj, total, to_char((round(max(xj) / max(zj), 3)) * 100'fm999990.00'|| '%' as 百分比
  FROM (SELECT ldxj,
               total,
               sum(total) over(partition by ldxj order by ldxj) xj,
               sum(total) over() zj
          FROM (SELECT a.ldxj, count(1) as total
                  FROM YWK_FW_LD_RCGL a
                 group by a.ldxj) a1) a2
 group by ldxj, total;




1.2.3 统计总数以及百分比

/*统计总数以及百分比*/
SELECT ldxj, total, to_char((round(max(xj) / max(zj), 3)) * 100'fm999990.00'|| '%' as 百分比
  FROM (SELECT ldxj,
               total,
               sum(total) over(partition by ldxj order by ldxj) xj,
               sum(total) over() zj
          FROM (SELECT a.ldxj, count(1) as total
                  FROM YWK_FW_LD_RCGL a
                 group by a.ldxj) a1) a2
 group by ldxj, total;

---------

/*统计总数以及百分比*/
SELECT ldxj, total, to_char((round(max(xj) / max(zj)*100, 4))'fm999990.0000'|| '%' as 百分比
  FROM (SELECT ldxj,
               total,
               sum(total) over(partition by ldxj order by ldxj) xj,
               sum(total) over() zj
          FROM (SELECT a.ldxj, count(1) as total
                  FROM YWK_FW_LD_RCGL a
                 group by a.ldxj) a1) a2
 group by ldxj, total;

1.2.4 oracle 查询某天的数据

SELECT *
  FROM t_entity_report a
 where a.flow_status = '7'
   and trunc(a.flow_time) =to_date('2020-07-16', 'yyyy-mm-dd');

二、存储过程

2.1.1 创建/调用 存储过程

CREATE OR REPLACE PROCEDURE MYDEMO02
AS
        name VARCHAR(10);
        age NUMBER(10);
BEGIN
        name := 'xiaoming';--:=则是对属性进行赋值
        age := 18;
        dbms_output.put_line ( 'name=' || name || ', age=' || age );--这条是输出语句
END;
--存储过程调用(下面只是调用存储过程语法)
BEGIN
    MYDEMO02();
END;



-- 带参数的存储过程:
CREATE OR REPLACE procedure MYDEMO03(name in varchar,age in int)
AS
BEGIN
      dbms_output.put_line('name='||name||', age='||age);
END;

--存储过程调用
BEGIN
    MYDEMO03('姜煜',18);
END;

--
CREATE OR REPLACE PROCEDURE MYDEMO04
AS
    age INT;
BEGIN
    age:=10/0;
    dbms_output.put_line(age);
EXCEPTION when others then   --处理异常
    dbms_output.put_line('error');
END;
--调用存储过程
BEGIN
     MYDEMO04;
END;

--
CREATE OR REPLACE PROCEDURE TEST_COUNT01
IS
    v_total int;
    v_date varchar(20);
BEGIN
    select count(*) into v_total from EMP_TEST WHERE ENAME ='燕小六';  --into是赋值的关键字
    select to_char(sysdate,'yyyy-mm-dd')into v_date FROM EMP_TEST WHERE ENAME ='郭芙蓉';
    DBMS_OUTPUT.put_line('总人数:'||v_total);
    DBMS_OUTPUT.put_line('当前日期'||v_date);
END;

--调用存储过程
BEGIN
    TEST_COUNT01();
END;

--
CREATE OR REPLACE PROCEDURE TEST_COUNT04(v_id in int,v_name out varchar2)
IS
BEGIN
        SELECT ENAME into v_name FROM EMP_TEST WHERE EMPNO = v_id;
        dbms_output.put_line(v_name);
EXCEPTION
        when no_data_found then dbms_output.put_line('no_data_found');
END;

--调用存储过程
DECLARE
        v_name varchar(200);
BEGIN
        TEST_COUNT04('1002',v_name);
END;

---
CREATE OR REPLACE PROCEDURE job_day04(de in varchar,name out varchar,App_Code out varchar,error_Msg out varchar)
AS
BEGIN
        SELECT ENAME into name FROM EMP_TEST WHERE ENAME=de;
EXCEPTION WHEN others THEN
        error_Msg:='未找到数据';
END;
--调用存储过程
DECLARE
   de varchar(10);
   ab varchar(10);
   appcode varchar(20);
   ermg varchar(20);
BEGIN
   de:= '张三丰';
   JOB_DAY04(de,ab,appcode,ermg);
   dbms_output.put_line(ermg);
END;

---
CREATE OR REPLACE PROCEDURE job_day05(do1 in varchar,dn1 in varchar,eo1 in number,en1 in varchar,App_Code out varchar,error_Msg out varchar)
AS
BEGIN
        INSERT INTO STUDENT(NAME,CLASS)VALUES(do1,dn1);
        INSERT INTO COMPANY(EMPID,NAME,DEPARNAME)VALUES(eo1,en1,do1);
COMMIT;
EXCEPTION WHEN OTHERS THEN
        App_Code:=-1;
        error_Msg:='插入失败';
END;
--调用存储过程
DECLARE
   do1 varchar(10);
   dn1 varchar(10);
   eo1 number(20);
   App_Code varchar(20);
   error_Msg varchar(20);
BEGIN
    do1:= '张三丰';
    dn1:='新桥';
    eo1:=1001;
    JOB_DAY04(do1,dn1,App_Code,error_Msg);
    dbms_output.put_line(ermg);
END;


参考文献:https://www.cnblogs.com/dreammyle/p/4363832.html

2.1.2 Oracle字符集

SELECT userenv('language') from dual;

oracle环境变量中的NLS_LANG是定义客户端的字符集。
比如环境变量NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
但是数据库三个实例的字符集可以分别是:
AMERICAN_AMERICA.AL32UTF8、
AMERICAN_AMERICA.WE8ISO8859P1、
AMERICAN_AMERICA.ZHS16GBK


2.1.3 oracle 字符串分割 去重、排序

--创建存储类型
CREATE OR REPLACE TYPE t_ret_table IS TABLE OF VARCHAR2(20);

--创建 字符串去重复、排序函数
CREATE OR REPLACE FUNCTION F_SPLIT_STRING(VAR_STR   IN STRING,
                                          VAR_SPLIT IN STRING)
  RETURN VARCHAR2 IS
  VAR_OUT     T_RET_TABLE;
  VAR_TMP     VARCHAR2(4000);
  VAR_ELEMENT VARCHAR2(4000);
  V_RS        VARCHAR2(4000);
BEGIN
  VAR_TMP := VAR_STR;
  VAR_OUT := T_RET_TABLE();
  --如果存在匹配的分割符
  WHILE INSTR(VAR_TMP, VAR_SPLIT) > 0 LOOP
    VAR_ELEMENT := SUBSTR(VAR_TMP, 1, INSTR(VAR_TMP, VAR_SPLIT) - 1);
    VAR_TMP     := SUBSTR(VAR_TMP,
                          INSTR(VAR_TMP, VAR_SPLIT) + LENGTH(VAR_SPLIT),
                          LENGTH(VAR_TMP));
    VAR_OUT.EXTEND(1);
    VAR_OUT(VAR_OUT.COUNT) := VAR_ELEMENT;
  END LOOP;
  VAR_OUT.EXTEND(1);
  VAR_OUT(VAR_OUT.COUNT) := VAR_TMP;
  FOR V_ROW IN (SELECT DISTINCT (COLUMN_VALUE) COLUMN_VALUE
                  FROM TABLE(VAR_OUT)
                 ORDER BY COLUMN_VALUE) LOOP
    EXIT WHEN V_ROW.COLUMN_VALUE IS NULL;
    IF V_RS IS NOT NULL THEN
      V_RS := V_RS || ',' || V_ROW.COLUMN_VALUE;
    ELSE
      V_RS := V_ROW.COLUMN_VALUE;
    END IF;
  END LOOP;
  --DBMS_OUTPUT.put_line(V_RS);
  RETURN V_RS;
END F_SPLIT_STRING;


-- 测试查询
SELECT (F_SPLIT_STRING('003,001,004,001' ,',')) FROM DUAL;-- 结果  :001,003,004  (去重复、排序)

SELECT F_SPLIT_STRING(state_code,',') FROM (
select wmsys.wm_concat(t.state_code) over (order by t.statename,t.rolecode) state_code,
t.statename,t.rolecode from t_role_status_related t,t_role_status_related t2 where 
t.statename=t2.statename and t.rolecode=t2.rolecode);


SELECT F_SPLIT_STRING(t1.state_code,',') state_code,t1.statename,t1.rolecode FROM (select id,wmsys.wm_concat(state_code) over (order by t.statename,t.rolecode) state_code,t.statename,t.rolecode from t_role_status_related t
)t1 group by t1.state_code,t1.statename,t1.rolecode;


-- 创建测试表
CREATE TABLE TEST_AA
(
  dic_name VARCHAR2(50)
)
;
-- 触发器语法  详解:(http://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html)
/**
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name 
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
**/
--创建触发器
CREATE OR REPLACE TRIGGER TRG_UPDATE_DEAL
  BEFORE UPDATE  OF DIC_NAME ON TEST_AA
  FOR EACH ROW
  WHEN (OLD.DIC_NAME IS NOT NULL)
BEGIN
  --dbms_output.put_line(:new.dic_name);
  :NEW.DIC_NAME := F_SPLIT_STRING(:NEW.DIC_NAME, ',');
END;

-- 插入测试数据
INSERT INTO TEST_AA(DIC_NAME,Col_t) VALUES('003','ttt');

UPDATE TEST_AA SET DIC_NAME = '003,001,004' WHERE col_t='ttt';

SELECT * FROM TEST_AA;

2.1.4 oracle group by 显示其他字段

以下是可以显示其他字段,并且考虑排名相同的情况

select
T.key, T.value,
LISTAGG(T.test, ',') WITHIN GROUP( ORDER BY T.key, T.value) --同名排名用','分隔
from
(
select rank() --跳序排序1、1、3...
over(partition by tb1.key --开窗聚合函数
order by tb1.value desc ) as rownum1,
tb1.key, tb1.value, tb1.test,
from tb1
order by tb1.key asc
) T
where T.rownum1 = 1
group by T.key, T.value;


---

select
T.id, T.state_code,
LISTAGG(T.statename, ',') WITHIN GROUP( ORDER BY T.id, T.state_code) --同名排名用','分隔
from
(
select rank() --跳序排序1、1、3...
over(partition by tb1.id --开窗聚合函数
order by tb1.state_code desc ) as rownum1,
tb1.id, tb1.state_code, tb1.statename
from t_role_status_related_617 tb1
order by tb1.id asc
) T
where T.rownum1 = 1
group by T.id, T.state_code;

2.1.5 使用Oracle执行计划分析SQL性能

SQL> EXPLAIN PLAN FOR SELECT * FROM EMP;

已解释。

SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));

EXPLAIN PLAN FOR select count(1) from JCK_FR_JCXX C where length(C.ZCDTYDZBM)=9;
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));

或者:

SQL> select * from table(dbms_xplan.display);


执行顺序的原则是:由上至下,从右向左
由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行
从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。

一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。
ID: 一个序号,但不是执行的先后顺序。执行的先后根据缩进来判断。

Operation: 当前操作的内容。

Rows: 当前操作的Cardinality,Oracle估计当前操作的返回结果集。

Cost(CPU):Oracle 计算出来的一个数值(代价),用于说明SQL执行的代价。

Time:Oracle 估计当前操作的时间。

在看执行计划的时候,除了看执行计划本身,还需要看谓词和统计信息。 通过整体信息来判断SQL效率。

谓词说明
Access :

通过某种方式定位了需要的数据,然后读取出这些结果集,叫做Access。
表示这个谓词条件的值将会影响数据的访问路劲(表还是索引)。
Filter:

把所有的数据都访问了,然后过滤掉不需要的数据,这种方式叫做filter 。
表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。
在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。



2.1.6 Oracle 查询表字段和注释

声明:Oracle 中查询字段注释和字段时,表名都必须大写

---查询表的名称,字段信息以及字段注释

select 
      ut.COLUMN_NAME,--字段名称
      uc.comments,--字段注释
      ut.DATA_TYPE,--字典类型
      ut.DATA_LENGTH,--字典长度
      ut.NULLABLE--是否为空
from user_tab_columns  ut
inner JOIN user_col_comments uc
on ut.TABLE_NAME  = uc.table_name and ut.COLUMN_NAME = uc.column_name
where ut.Table_Name='RC_METADATA' 
order by ut.column_name
-------------执行结果


--获取表字段:

select * 
from user_tab_columns 
where Table_Name='RC_METADATA' 
order by column_name

--获取表注释:

select * 
from user_tab_comments 
where Table_Name='RC_METADATA'
order by Table_Name

--获取字段注释:

select * 
from user_col_comments 
where Table_Name='RC_METADATA'
order by column_name


/* 获取表:*/

select table_name from user_tables; --当前用户的表      

select table_name from all_tables; --所有用户的表  

select table_name from dba_tables;--包括系统表

select table_name from dba_tables where owner='SS_MONITOR'

/* 
user_tables:

table_name,tablespace_name,last_analyzed等

dba_tables:

ower,table_name,tablespace_name,last_analyzed等

all_tables:

ower,table_name,tablespace_name,last_analyzed等

all_objects:

ower,object_name,subobject_name,object_id,created,last_ddl_time,timestamp,status等 
*/

/*  获取表字段:*/

select * from user_tab_columns where Table_Name='RC_METADATA';

select * from all_tab_columns where Table_Name='RC_METADATA';

select * from dba_tab_columns where Table_Name='RC_METADATA';

/* user_tab_columns:

table_name,column_name,data_type,data_length,data_precision,data_scale,nullable,column_id等

all_tab_columns :

ower,table_name,column_name,data_type,data_length,data_precision,data_scale,nullable,column_id等

dba_tab_columns:

ower,table_name,column_name,data_type,data_length,data_precision,data_scale,nullable,column_id等 
*/

/*  获取表注释:*/

select * from user_tab_comments

/* 
user_tab_comments:table_name,table_type,comments

相应的还有dba_tab_comments,all_tab_comments,这两个比user_tab_comments多了ower列。 
*/

/* 获取字段注释:*/

select * from user_col_comments

/*

user_col_comments:table_name,column_name,comments

相应的还有dba_col_comments,all_col_comments,这两个比user_col_comments多了ower列。 
*/

2.1.7 统计数据库每天的数据增长量

select t.*
  from (SELECT D.TABLESPACE_NAME,
               SPACE "SUM_SPACE(M)",
               BLOCKS SUM_BLOCKS,
               SPACE - NVL(FREE_SPACE, 0) "USED_SPACE(M)",
               ROUND((1 - NVL(FREE_SPACE, 0) / SPACE) * 100, 2) "USED_RATE(%)",
               FREE_SPACE "FREE_SPACE(M)"
          FROM (SELECT TABLESPACE_NAME,
                       ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE,
                       SUM(BLOCKS) BLOCKS
                  FROM DBA_DATA_FILES
                 GROUP BY TABLESPACE_NAME) D,
               (SELECT TABLESPACE_NAME,
                       ROUND(SUM(BYTES) / (1024 * 1024), 2) FREE_SPACE
                  FROM DBA_FREE_SPACE
                 GROUP BY TABLESPACE_NAME) F
         WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
        UNION ALL
        SELECT D.TABLESPACE_NAME,
               SPACE "SUM_SPACE(M)",
               BLOCKS SUM_BLOCKS,
               USED_SPACE "USED_SPACE(M)",
               ROUND(NVL(USED_SPACE, 0) / SPACE * 100, 2) "USED_RATE(%)",
               SPACE - USED_SPACE "FREE_SPACE(M)"
          FROM (SELECT TABLESPACE_NAME,
                       ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE,
                       SUM(BLOCKS) BLOCKS
                  FROM DBA_TEMP_FILES
                 GROUP BY TABLESPACE_NAME) D,
               (SELECT TABLESPACE,
                       ROUND(SUM(BLOCKS * 8192) / (1024 * 1024), 2) USED_SPACE
                  FROM V$SORT_USAGE
                 GROUP BY TABLESPACE) F
         WHERE D.TABLESPACE_NAME = F.TABLESPACE(+)) t
order by "USED_RATE(%)" desc;

2.1.8 创建索引

CREATE UNIQUE INDEX INDEX_INSTID ON KSJ_GKT_FLOWINST_0713 (INSTID ASC);

SELECT to_char(SYSDATE,'yyyy"年"mm"月"dd"日"') as da FROM DUAL;
Select to_number(to_char(sysdate,'yyyy')) as da from dual;
Select Extract(year from sysdate) from dual;

如果想在Oracle中获取日期中的月份,天数。可以将
Select to_number(to_char(sysdate,'yyyy')) from dual改为Select to_number(to_char(sysdate,'MM')) from dual和Select 
to_number(to_char(sysdate,'DD')) from dual。

Extract函数中只需将Select Extract(month from sysdate) from dual改为Select Extract(year from sysdate) from dual和Select Extract(day from sysdate) from dual
此方法获得的结果,是数值型的,你可以设置一个方法测试一下。



-- 模板
select table_name,tablespace_name,temporary
from user_tables
where table_name like '%tb_name%'   # tb_name 用你得模糊表名代替

-- 案例
select table_name, tablespace_name, temporary
  from user_tables
 where table_name like '%KSJ_GKT_FLOWINST%';

oracle 查询一张表或者视图的建表/视图语句:

  select dbms_metadata.get_ddl('类型','名称') from dual ; 

类型:view ,table
名称:写表/视图名字

select dbms_metadata.get_ddl('table','KSJ_GKT_FLOWINST_0713') from dual;
select dbms_metadata.get_ddl('TABLE','KSJ_GKT_FLOWINST_0713') from dual;
select * from DBA_PART_TABLES a where a.owner=upper('dc') and a.table_name=upper('KSJ_GKT_FLOWINST_0713');

SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='KSJ_GKT_FLOWINST_0713';

2.1.9 自动给表添加字段注释

create or replace procedure procedure_name(p_table  in varchar2) is
  p_sql varchar2(500);
begin
  -- 	    	   字段  字段注释
  for c in (select WORD, W_DESC              
              from (select distinct(b.WORD) word,
                           b.W_DESC,
                      from BIG_TABLE b
                     where b.WORD in
                           (select a.COLUMN_NAME
                              from user_col_comments a
                             where a.TABLE_NAME = p_table
                               and a.comments is null 
                               ))) loop
    p_sql := 'comment on column ' || p_table || '.' || c.WORD ||
             ' is ''' || c.W_DESC || '''';
    dbms_output.put_line(p_sql);
    begin
      execute immediate p_sql;
    exception
      when others then
        null;
    end;
  end loop;
end procedure_name;


BIG_TABLE:这个表是其他表的字段和字段注释信息存储表。
user_col_comments:可以查看当前用户所有表信息。
‘comment on column|| p_table ||.|| c.WORD ||is ‘’’ || c.W_DESC || ‘’’’;:这句是给表的对应字段添加注释,原句:comment on column table_name.word is ‘字段注释’;

2.1.10 插入多条记录

insert all

into t_role_status_related (ID, TASKTYPE, STATE_CODE, STATENAME, ROLECODE, ISDELETE, ISADDPROCESS)
values (sys_guid(), '1', '6', '已注销', 'oa_entity_guest', '2', null)
into t_role_status_related (ID, TASKTYPE, STATE_CODE, STATENAME, ROLECODE, ISDELETE, ISADDPROCESS)
values (sys_guid(), '1', '6', '已注销', 'oa_entity_wgy', '2', null)
into t_role_status_related (ID, TASKTYPE, STATE_CODE, STATENAME, ROLECODE, ISDELETE, ISADDPROCESS)
values (sys_guid(), '1', '6', '已注销', 'oa_entity_guest_admin', '2', null)

into t_role_status_related (ID, TASKTYPE, STATE_CODE, STATENAME, ROLECODE, ISDELETE, ISADDPROCESS)
values (sys_guid(), '0', '6', '已注销', 'oa_entity_guest', '2', null)
into t_role_status_related (ID, TASKTYPE, STATE_CODE, STATENAME, ROLECODE, ISDELETE, ISADDPROCESS)
values (sys_guid(), '0', '6', '已注销', 'oa_entity_wgy', '2', null)
into t_role_status_related (ID, TASKTYPE, STATE_CODE, STATENAME, ROLECODE, ISDELETE, ISADDPROCESS)
values (sys_guid(), '0', '6', '已注销', 'oa_entity_guest_admin', '2', null)

select 1 from dual;


可是这种写法在oracle中是不支持的,oracle中的用法如下:

insert all

into student(id,name) values(1,'张三')

into student(id,name) values(2,'李四')

select 1 from dual;

特别说明:dual是在oracle中创建的一个辅助表,你可以自主的新建成任意的表名,biao1,mytable都行

select 1 from dual这句话不能丢,会报语法错误,而且这句话的作用也仅仅是让sql语法正确。


2.1.11 oracle表数据误删恢复,表误删恢复

一 表数据误删恢复:
1.ALTER TABLE CCUSAGENTRELA ENABLE row movement ;
2.flashback table CCUSAGENTRELA to timestamp to_timestamp(2018-11-01 10:34:00,‘yyyy-mm-dd hh24:mi:ss’);
3.快捷键ctrl+e可以查询你删除数据的时间
二.表误删恢复(前提:表删除后未创建同名表)
1.FLASHBACK TABLE CCUSAGENTRELA TO BEFORE DROP;


example01
---start
ALTER TABLE t_process_step ENABLE row movement ;
flashback table t_process_step to timestamp to_timestamp('2020-07-15 17:52:42','yyyy-mm-dd hh24:mi:ss');
ALTER TABLE t_process_step DISABLE ROW MOVEMENT;

---end


select sysdate, sysdate-10/1440 from dual;
select sysdate, cast((systimestamp - interval '10' minute) as date) from dual;
这两句sql 都是查询 10分钟之前的时间。1440 代表一天有1440分钟。
接下来就实验使用as of timestamp 加上边的sql 来回复delete的数据:
alter table table_name enable row movement;
flashback table '需要恢复数据的表名' to timestamp to_timestamp('数据丢失的前一时间点','yyyy-mm-dd hh24:mi:ss');

select * from test_zby as of timestamp (systimestamp - interval '20' minute);
select * from test_zby as of timestamp sysdate - 20/1440;

SELECT * FROM t_process_todo as of timestamp to_timestamp('2020-07-17 17:00:42','yyyy-mm-dd hh24:mi:ss') where business_id='1d5a58f9f3674da985da0f95f3add6b4';

select *
  from t_process_todo  as of timestamp to_timestamp('2020-07-17 17:00:42','yyyy-mm-dd hh24:mi:ss') t
 where t.business_id in (select e.report_id
                           from t_entity_report e
                          where e.xlstlxmc = '博物馆以及不可移动文物'
                            and e.flow_status in (0, 1));

select *
  from t_process_todo   t
 where t.business_id in (select e.report_id
                           from t_entity_report e
                          where e.xlstlxmc = '博物馆以及不可移动文物'
                            and e.flow_status in (0, 1));


2.1.12 Oracle DBA常用查询

1. 查询系统所有对象
select owner, object_name, object_type, created, last_ddl_time, timestamp, status
from dba_objects
where owner=upper('scott')2. 查看系统所有表
select owner, table_name, tablespace_name from dba_tables

–3. 查看所有用户的表
select owner, table_name, tablespace_name from all_tables

–4. 查看当前用户表
select table_name, tablespace_name from user_tables

–5. 查看用户表索引
select t.*,i.index_type from user_ind_columns t, user_indexes i where
t.index_name = i.index_name and t.table_name = i.table_name
and t.table_name = 要查询的表

–6. 查看主键
select cu.* from user_cons_columns cu, user_constraints au
where cu.constraint_name = au.constraint_name
and au.constraint_type = upper('p') and au.table_name = 要查询的表

–7. 查看唯一性约束
select column_name from user_cons_columns cu, user_constraints au
where cu.constraint_name = au.constraint_name and au.constraint_type =  upper('u')
and au.table_name = 要查询的表

–8. 查看外键
select * from user_constraints c where c.constraint_type = 'r' and c.table_name = 要查询的表
select * from user_cons_columns cl where cl.constraint_name = 外键名称
select * from user_cons_columns cl where cl.constraint_name = 外键引用表的键名

–9. 查看表的列属性
select t.*,c.comments
from user_tab_columns t, user_col_comments c
where t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = 要查询的表

–10. 查看所有表空间
select tablespace_name from dba_data_files group by tablespace_name

############################################1. 查看oracle最大连接数
sql>show parameter processes    #最大连接数2. 修改最大连接数
sql>alter system set processes=value scope=spfile
–重启数据库
sql>shutdown force
sql>start force3. 查看当前连接数
sql>select * from v$session where username is not null4. 查看不同用户的连接数
sql>select username,count(username) from v$session where username is not null group by username #查看指定用户的连接数5. 查看活动的连接数
sql>select count(*) from v$session where status='active' #查看并发连接数6. 查看指定程序的连接数
sql>select count(*) from v$session where program='jdbc thin client' #查看jdbc连接oracle的数目7. 查看数据库安装实例(dba权限)
sql>select * from v$instance

–8. 查看运行实例名
sql>show parameter instance_name

–9. 查看数据库名
sql>show parameter db_name

–10. 查看数据库域名
sql>show parameter db_domain

–11. 查看数据库服务名
sql>show parameter service_names

–12. 查看全局数据库名
sql>show parameter global13. 查看表空间使用率


-- (1)
select dbf.tablespace_name,
       dbf.totalspace "总量(m)",
       dbf.totalblocks as "总块数",
       dfs.freespace "剩余总量(m)",
       dfs.freeblocks "剩余块数",
       (dfs.freespace / dbf.totalspace) * 100 as "空闲比例"
  from (select t.tablespace_name,
               sum(t.bytes) / 1024 / 1024 totalspace,
               sum(t.blocks) totalblocks
          from dba_data_files t
         group by t.tablespace_name) dbf,
       (select tt.tablespace_name,
               sum(tt.bytes) / 1024 / 1024 freespace,
               sum(tt.blocks) freeblocks
          from dba_free_space tt
         group by tt.tablespace_name) dfs
 where trim(dbf.tablespace_name) = trim(dfs.tablespace_name)
-- (2)
select t.name "tablespace name",
       free_space,
       (total_space - free_space) used_space,
       total_space
  from (select tablespace_name, sum(bytes / 1024 / 1024) free_space
          from sys.dba_free_space
         group by tablespace_name) free,
       (select b.name, sum(bytes / 1024 / 1024) total_space
          from sys.v_$datafile a, sys.v_$tablespace b
         where a.ts# = b.ts#
         group by b.name) t
 where free.tablespace_name = t.name


-- Oracle字符集
-- 注:count(name)会忽略列的空值行,count(*)不会忽略空值行
SELECT userenv('language') from dual;




2.1.13 Oracle 树操作(select…start with…connect by…prior)


参考文档:
https://www.cnblogs.com/linjiqin/p/3152674.html

2.1.14 用户管理

----------1. 用户管理/权限-------------
------1.1 用户管理
---创建
create user mr 
identified by mrsoft  --externally/globally as 'CN=user'
default tablespace users
temporary tablespace temp
quota 10m on tbsp_1

---修改
alter user east quota 20m on tbsp_1;
alter user east identified by 123456;  --密码
alter user SH account unlock;  --解锁

---删除
drop user df cascade;

------1.2 用户权限
---授权
--系统
grant connect,resource to east;
grant create session,create table to dongfang with admin option; --再授权
--对象
grant select,insert,delete on scott.emp to xifang;

---回收
revoke resource to east;
revoke delete on scott.emp from xifang;

---查询
--DBA_USERS  用户基本信息表
--DBA_SYS_PRIVS  系统权限
--DBA_TAB_PRIVS  对象权限
--USER_SYS_PRIVS  用户系统权限
--ROLE_SYS_PRIVS  用户角色
--ALL_TABLES  可以查询的基本信息
--USER_TAB_PRIVS  用户将权限授予哪些用户
--ALL_TAB_PRIVS  哪些用户给自己授权
select * from USER_SYS_PRIVS;

------1.3 用户角色
---预定义
--connect/resource/dba/exp_full_database/imp_full_database

---创建
create role designer identified by 123456;
grant create view,create table to designer;

---授予
grant designer to dongfang;

---管理
select * from role_sys_privs where role = 'DESIGNER';
alter role designer not identified;
alter role designer identified by mrsoft;
set role designer;  --生效  indentified by mrsoft;

---删除
drop role designer;

------1.4 资源配置PROFILE
---管理密码
create profile lock_account limit
failed_login_attempts 5
password_lock_time 7;  
--password_life_time/password_grace_time
--password_reuse_time/password_reuse_max
--password_verify_function

alter user dongfang profile lock_account;

---管理资源
alter system set resource_limit = true;

alter profile password_lift_time limit
cpu_per_session 20000
sessions_per_user 10
cpu_per_call 500
password_life_time 180
failed_login_attempts 10;

---删除
drop profile password_life_time cascade;

---查询
select profile from dba_users where username = 'SCOTT';
select resource_name,resource_type,limit from dba_profiles 
where profile = 'DEFAULT';


----------2. 数据对象-------------
------2.1 数据表
---创建
create table students(
  stuno number(10) not null,  --非空约束
  stuname varchar2(8),
  id varchar2(18) constraint ID_UK unique,  --唯一性约束
  sex char(2),
  age int constraint AGE_CK check(age > 0 and age < 120) disable,  --禁用
  departno varchar2(2) not null,
  classno varchar2(4) not null,
  regdate date default sysdate,
  ---blob/clob/bfile
  constraint STU_PK primary key(stuno)  ---主键约束
)tablespace tbsp_1  --表空间
storage(initial 256k)  --存储参数next/minextents(AUTOALLOCATE)
pctfree 20  --数据块最小空闲空间比例,达到后标记不可用
pctused 40  --数据库是否可用界限
initrans 10  --允许并发事务数目
nologging;  --DDL操作不产生日志

---维护
--字段
alter table students add(province varchar2(10));
alter table students drop column province;
alter table students drop (sex,age);
alter table students modify departno varchar2(4);
--重命名
alter table students rename to students_bak;
--表空间
alter table students move tablespace tbsp_2;
--存储参数
alter table students pctfree 25 pctused 45;
---删除
drop table students cascade constraints;  --同时删除视图,约束或触发器等
flashback table students to before drop;  --闪回
--状态
alter table students read only;  --read write
--约束
--
alter table students modify stuno not null;  ---null
--
alter table students add constraint STUD_PK(stuno);
alter table students drop constraint STUD_PK;
--
alter table students add constraint IDs_UK unique(id);
alter table students drop constraint IDs_UK;
--
alter table students add constraint DEPART_FK foreign key(department_id)
      reference departments(department_id);  --外键约束
alter table students drop constraint depart_FK;
--
alter table students enable validate constraint depart_FK;  --novalidate
alter table students disable constraint depart_FK;


------2.2 索引
---创建
create index emp_deptno_index ---bitmap index
on emp(deptno)  --emp(lower(job))
pctfree 25  --reverse
tablespace users;

---合并
alter index emp_deptno_index coalesce deallocate unused;

---重建
alter index emp_deptno_index rebuild;

---删除
drop index emp_job_fun;

---查询
select table_name,index_name,index_type from dba_indexes 
where owner = 'HR';  --表索引 sys
select column_name,column_length from user_ind_columns 
where index_name = 'EMP_DEPTNO_INDEX';  --索引列 scott
select tablespace_name,segment_type,bytes from user_segments
where segment_name = 'EMP_DEPTNO_INDEX';  --索引段 scott
select column_expression from user_ind_expressions
where index_name = 'EMP_JOB_FUN';  --函数索引

------2.3 视图
---创建
create or replace view emp_view as
  select d.dname,d.loc,e.empno,e.ename
  from emp e, dept d
  where e.deptno = d.deptno and d.deptno = 20
with read only;

---查看
select * from emp_view;
desc emp_view;

---重编译
alter view emp_view compile;

---删除
drop view emp_view;

------2.4 同义词
---创建
create public synonym public_dept for scott.dept;
create synonym private_dept for dept;

---删除
drop public synonym public_dept;
drop synonym private_dept;

------2.5 序列
---创建
alter sequence empno_seq
start with 100
maxvalue 100000  --minvalue/nominvalue/nomaxvalue
increment by 200
cache 100
cycle  --nocycle
order  --noorder

---管理
alter sequence empno_seq
maxvalue 500000
increment by 200;

---删除
drop sequence empno_seq;


----------3. 表/索引分区-------------
------3.1 表分区
---创建
--范围
create table ware_retail_part
(
  id integer primary key,
  retail_date date,
  ware_name varchar2(50)
)
partition by range(retail_date)
(
  partition par_01 values less than(to_date('2011-04-01','yyyy-mm-dd')) tablespace TBSP_1,
  partition par_02 values less than(to_date('2011-07-01','yyyy-mm-dd')) tablespace TBSP_1,
  partition par_03 values less than(to_date('2011-10-01','yyyy-mm-dd')) tablespace TBSP_2,
  partition par_04 values less than(to_date('2012-01-01','yyyy-mm-dd')) tablespace TBSP_2 
);

--散列
create table goods
(
  id number,
  goodname varchar2(50)
)
storage(initial 2048k)
partition by hash(id)
(
 partition par1 tablespace tbsp_1,
 partition par2 tablespace tbsp_2
);

--列表
create table clients
(
  id integer primary key,
  name varchar2(50),
  province varchar2(20)
)
partition by list(province)
(
  partition shandong values('山东省'),
  partition guangdong values('广东省'),
  partition yunnan values('云南省')
);

--组合
create table person2
(
  id number primary key,
  name varchar2(20),
  sex varchar2(2)
)
partition by range(id)  --范围分区
subpartition by hash(name)  --hash子分区
subpartitions 2 store in(tbsp_1,tbsp_2)  --存储在两个不同的命名空间中
(
  partition par1 values less than(5000),
  partition par2 values less than(10000),
  partition par3 values less than(maxvalue)
);

--Interval
create table saleRecord
(
 id number primary key,
 goodsname varchar2(50),
 saledate date,
 quantity number
)
partition by range(saledate)
interval (numtoyminterval(1,'year'))
(
  partition par_fist values less than (to_date('2012-01-01','yyyy-mm-dd'))
);

--应用
insert into ware_retail_part values(1,to_date('2011-01-20','yyyy-mm-dd'),'PC');
insert into ware_retail_part values(2,to_date('2011-04-15','yyyy-mm-dd'),'TV');

select * from ware_retail_part partition(par_02);

---管理
--添加
alter table clients
add partition hebei values('河北省')
storage(initial 10K next 20k) tablespace tbsp_1
nologging;

--合并
alter table person coalesce partition;
alter table person2 modify partition par3 coalesce subpartition;

--删除
--disable constraint/drop/enable constraint
delete from ware_retail_part where retail_date>=to_date('2011-10-01','yyyy-mm-dd');  --数据
alter table ware_retail_part drop partition par_04;  --表分区
alter index ware_index rebuild;  --重建索引

--并入
alter table sales merge partitions part_sea3,part_sea4 into partition part_sea4;
alter table sales modify partition part_sea4 rebuild unusable local indexes;  --重建局部索引

------3.2 索引分区
---创建
--本地
--create tablespace ts_1/ts_2/ts_3;
--create table studentgrade partition by range(grade);
create index grade_index on studentgrade(grade)
local
(
  partition p1 tablespace ts_1,
  partition p2 tablespace ts_2,
  partition p3 tablespace ts_3
);  --dba_ind_partitions
--全局
create index index_SalePrice on Books(SalePrice)
global partition by range(SalePrice)
(
  partition p1 values less than (30),
  partition p2 values less than (50),
  partition p3 values less than (maxvalue)
);

---管理
--删除
alter index index_saleprice drop partition p2;
alter index index_saleprice drop partition p1;
alter index index_saleprice rebulid partition p3;
--重命名
alter index index_saleprice rename partition p3 to p_new;

----------4. 数据库管理-------------
------4.1 数据文件/表空间
---查看
select tablespace_name,file_name,bytes from dba_data_files order by tablespace_name;

---默认
select segment_type,segment_name,owner from dba_segments where tablespace_name='USERS';
--SYSTEM/SYSAUT/UNDOTBS1/USERS/EXAMPLE/TEMP

---创建
--本地化管理方式
create tablespace tbs_test_1 datafile 'D:\OracleFiles\OracleData\datafile1.dbf'
size 10m
extent management local uniform size 256K;  --autoallocate
--段空间管理方式
create tablespace tbs_test_3 datafile 'D:\OracleFiles\OracleData\datafile3.dbf'
size 20m
extent management local autoallocate
segment space management manual;  --auto
--非标准块
alter system set db_16k_cache_size = 16M scope=both;
create tablespace tbs_test_5 datafile 'D:\OracleFiles\OracleData\datafile5.dbf'
size 64m reuse
autoextend on next 4m maxsize unlimited
blocksize 16k
extent management local autoallocate
segment space management auto;
--大文件
create bigfile tablespace tbs_test_big datafile 'D:\OracleFiles\OracleData\datafilebig.dbf'
size 2g;

---维护
--默认
alter database default temporary tablespace temp_1;
alter database default tablespace tbs_example;
--状态
alter tablespace tbs_test_3 read only;  --read write
--重命名
alter tablespace tbs_test_3 rename to tbs_test_3_new;
--删除
drop tablespace tbs_test_1 including contents cascade constraint;
--文件
alter tablespace users add datafile 'e:\app\Administrator\oradata\orcl\users02.dbf'
size 10m autoextend on next 5m maxsize unlimited;  --添加
alter tablespace users drop datafile 'e:\app\Administrator\oradata\orcl\users02.dbf';  --删除
alter database datafile 'D:\OracleFiles\OracleData\datafile2.dbf'
autoextend on next 10m maxsize unlimited;  --自动扩展

---撤销表空间
--创建
create undo tablespace undo_tbs_1
datafile 'D:\OracleFiles\OracleData\undotbs1.dbf'
size100M;
--修改
alter tablespace undo_tbs_1 
add datafile 'D:\OracleFiles\OracleData\undotbs_add.dbf' 
size 2g;
--切换
alter system set undo_tablespace=undo_tbs_1;
--删除
alter system set undo_tablespace=undotbs1;
drop tablespace undo_tbs_1;
--查询
show parameter undo_tablespace;  --undo_management/undo_retention
select tablespace_name from dba_tablespaces where contents = 'UNDO';
select to_char(begin_time,'hh24:mi:ss'), to_char(end_time,'hh24:mi:ss'), undoblks
from v$undostat order by begin_time;  --表空间统计信息
select rn.name,rs.xacts,rs.writes,rs.extents
from v$rollname rn,v$rollstat rs where rn.usn = rs.usn;  --段统计信息
select name,status from v$transaction;  --活动事务
select segment_name, extent_id,bytes,status from dba_undo_extents
where segment_name='_SYSSMU3_991555123$';  --UNDO区信息

---临时表空间
--创建
create temporary tablespace temp_01 tempfile 'D:\OracleFiles\tempfiles\temp_01.tpf' size 300m;
alter database default temporary tablespace temp_01;
--重命名/删除同上
--查询
select file_name,bytes,tablespace_name from dba_temp_files;
---临时表空间组
create temporary tablespace tp1 tempfile 'D:\OracleFiles\tempfiles\tp1.tpf' 
size 10m tablespace group group1;
create temporary tablespace tp2 tempfile 'D:\OracleFiles\tempfiles\tp2.tpf' 
size 20m tablespace group group1;  --创建
create temporary tablespace tp3 tempfile 'D:\OracleFiles\tempfiles\tp3.tpf' 
size 10m tablespace group group3;
alter tablespace tp1 tablespace group group3;  --转移
alter user hr temporary tablespace group3;  --分配
alter database orcl default temporary tablespace group3;  --默认
drop tablespace tp1 including contents and datafiles;

------4.2 控制文件
---多路复用
alter system set control_file=
  'D:\PROGRAM\ORACLE\ORADATA\ORCL\CONTROL01.CTL',
  'D:\PROGRAM\ORACLE\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL',
  'D:\OracleFiles\ControlFiles\CONTROL03.CTL'
scope=spfile;  --参数设置后复制文件
select name from v$controlfile;  --查看

---创建
select member from v$logfile;  --查看日志文件
select name from v$datafile;  --查看数据文件
select name from v$controlfile;  --查看控制文件
shutdown immediate;  --关闭数据库,然后备份文件
startup nomount;  --启动数据库实例,不加载数据库
create controlfile reused --创建新控制文件
database "orcl"
logfile
group 1 'D:\PROGRAM\ORACLE\ORADATA\ORCL\REDO01.LOG',
group 2 'D:\PROGRAM\ORACLE\ORADATA\ORCL\REDO02.LOG',
group 3 'D:\PROGRAM\ORACLE\ORADATA\ORCL\REDO03.LOG'
datafile
'D:\PROGRAM\ORACLE\ORADATA\ORCL\SYSTEM01.DBF',
'D:\PROGRAM\ORACLE\ORADATA\ORCL\SYSAUX01.DBF',
'D:\PROGRAM\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF',
'D:\PROGRAM\ORACLE\ORADATA\ORCL\USERS01.DBF',
'D:\PROGRAM\ORACLE\ORADATA\ORCL\EXAMPLE01.DBF',
'D:\PROGRAM\ORACLE\PRODUCT\11.2.0\DBHOME_1\ORADATA\KPLAYER\KPLAYER.DBF'
maxlogfiles 50
maxlogmembers 3
maxinstances 6
maxdatafiles 200
noresetlogs
noarchivelog;
alter system set control_files=  --编辑参数
  'E:\PROG\ADMIN\ORADATA\ORCL\CONTROL01.CTL',
  'E:\PROG\ADMIN\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL'
scope=spfile;
alter database open;  --打开数据库 [resetlogs]

---备份
alter database backup controlfile 
to 'D:\OracleFiles\ControlFiles\ctf.bak';  --二进制文件
alter database backup controlfile to trace;  --脚本文件
show parameter user_dump_dest;

---恢复
--关闭->复制覆盖->重启
--关闭->编辑CONTROL_FILES->重启

---删除
--关闭->编辑CONTROL_FILES->重启

---查询
--v$controlfile  所有控制文件名称和状态
--v$controlfile_record_section  控制文件各记录文档段信息
--v$parameter  系统所有初始化参数

------4.3 重做日志文件
---增加
alter database add logfile group 5
('D:\OracleFiles\LogFiles\REDO4_A.LOG',
'E:\OracleFiles\LogFiles\REDO4_B.LOG')
size 20M;  --添加新的重做日志文件组
alter database add logfile member
'E:\OracleFiles\LogFiles\REDO4_C.LOG' to group 4;  --创建日志成员文件
alter database add logfile member
'D:\OracleFiles\LogFiles\REDO1_new.LOG' to 
('E:\app\Administrator\oradata\orcl\REDO01.LOG') ;  --指定成员名称

---删除
--日志成员
alter database drop logfile member 'E:\OracleFiles\LogFiles\REDO4_C.LOG';
--日志文件组
alter database drop logfile group 5;
--清空
alter database clear logfile group 4;

---更改
--关闭->复制源文件到目标位置->启动加载但不打开mount
alter database rename file
  'D:\OracleFiles\LogFiles\REDO1_new.LOG',
  'D:\OracleFiles\LogFiles\REDO4_A.LOG'
to
  'E:\OracleFiles\LogFiles\REDO1_new.LOG',
  'E:\OracleFiles\LogFiles\REDO4_A.LOG';
--打开数据库

--查看
--v$log v$logfile v$log_history

------4.4 归档日志文件
---切换
select log_mode from v$database;  --noarchivelog/archivelog
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

---进程
alter system set log_archive_max_processes = 3;

---位置
--本地
alter system set log_archive_dest_1='location=D:\OracleFiles\archive1 optional';
alter system set log_archive_dest_2='location=D:\OracleFiles\archive2 mandatory';
alter system set log_archive_dest_3='location=D:\OracleFiles\archive3 mandatory reopen=400';
alter system set log_archive_min_succeed_dest=3;  --最小归档数
alter system set log_archive_dest_state_4=defer;  --禁用位置
--远程
alter system set log_archive_dest_1='service=MRKJ';

---查看
--v$database v$archived_log v$archive_dest v$archive_processes v$backup_redolog
archive log list;

----------5. 数据库维护-------------
------5.1 数据库控制
---事务
set transaction read only;  --read write
exec dbms_transaction.read_only;
set transaction use rollback segment system;  --分配回滚段
savepoint sp01;  --设置保存点
insert into jobs_temp values('DESIGN','DS',3000,5000);
rollback to sp01;  --回滚

---锁
lock table dept_temp in row share mode;
--row exclusive mode/share mode/share row exclusive mode/exclusive mode

------5.2 数据导入/导出
---导出
create directory dump_dir as 'd:\dump';
grant read,write on directory dump_dir to scott;
--表
expdp scott/1qaz2wsx directory=dump_dir dumpfile=tab.dmp tables=emp,dept
--模式
expdp system/1qaz2wsx directory = dump_dir dumpfile=schema.dmp schemas=scott,hr
--表空间
expdp system/1qaz2wsx directory = dump_dir dumpfile = tablespace.dmp tablespaces=tbsp_1
--数据库
expdp system/1qaz2wsx directory=dump_dir dumpfile=fulldatabase.dmp full=y
--content/query/logfile/status

---导入
impdp system/1qaz2wsx directory=dump_dir dumpfile=tab.dmp 
tables=scott.dept,scott.emp remap_schema=scott:system  --表
impdp system/1qaz2wsx directory=dump_dir dumpfile=schema.dmp 
schemas=scott remap_schema=scott:system;  --模式
impdp system/1qaz2wsx directory=dump_dir dumpfile=tablespace.dmp 
tablespaces=tbsp_1  --表空间
impdp system/1qaz2wsx directory=dump_dir dumpfile=fulldatabase.dmp full=y  --数据库
--remap_schema/remap_tablesapce/sqlfile/table_exists_action/transport_datafiles

------SQL Loader
sqlldr --用法
---自由格式
/*  --student.ctl
load data
  infile 'd:\data\student.txt'
  into table student
  (stuno position(01:04) integer external,
   stuname position(11:14) char,
   sex position(21:22) char,
   old position(29:30) integer external
  )
*/
sqlldr system/1qaz2wsx control=d:\data\student.ctl log=d:\data\stu_log
---固定格式
/*  --persons.ctl
load data
infile 'd:\data\persons.csv'
append into table persons
fields terminated by ','
(code,name,sex,old)
*/
sqlldr system/1qaz2wsx control=d:\data\persons.ctl

2.1.15 Oracle数据备份恢复

服务器端

Oracle:

1)select* from v$version;
2)select * from product_component_version;
3)set serveroutput on;
exec dbms_output.put_line(dbms_db_version.version);

select* from v$version;
select * from product_component_version;
set serveroutput on;

--按用户名导出
expdp scott/tiger@orcl schemas=scott dumpfile=dsta20190114.dmp DIRECTORY=dpdata1;
-以下操作用户名必须一一对应  如果不对应就转换
--转换用户名:remap_schema=drgspre_km(导出):drgsplat_km(导入)
--查看目录
select * from dba_directories;
--查看表空间地址
select *from dba_data_files;
--创建需要的表空间
CREATE TABLESPACE SICP_DATA
         LOGGING
         DATAFILE 'F:\APP\ASUS\ORADATA\ORCL\SICP_DATA.DBF'
         SIZE 32M
         AUTOEXTEND ON
         NEXT 32M MAXSIZE UNLIMITED
         EXTENT MANAGEMENT LOCAL;
--查看表空间数据文件
select file_name from dba_data_files where tablespace_name='SICP_DATA';
--清空
drop user dsta cascade;
--表空间下面创建用户
create user dsta identified by dsta   ACCOUNT UNLOCK
DEFAULT TABLESPACE SICP_DATA TEMPORARY TABLESPACE TEMP;
--给用户授予操作权限
GRANT CONNECT TO dsta;
GRANT RESOURCE TO dsta;
GRANT CREATE ANY VIEW TO dsta;
GRANT CREATE DATABASE LINK TO dsta;
GRANT CREATE ANY SYNONYM TO dsta;
GRANT DEBUG CONNECT SESSION TO dsta;
GRANT CREATE JOB       TO dsta;
GRANT SCHEDULER_ADMIN  TO dsta;
GRANT MANAGE SCHEDULER TO dsta;
--创建虚拟目录
create directory DPDATA as 'E:\DATA';
--授予虚拟目录操作权限
grant read,write on directory DPDATA to dsta;
--cmd数据导入
C:\Users\dsta>impdp dsta/dsta@orcl directory=dpdata dumpfile=dsta20190114.dmp



--不影响日后工作的造数据步骤:
--1、备份表内的内容,
--2、清表内内容,
--3、给表造数据,
--4、还原表
------------------------------------------------------------
--1、备份表内的内容,
--create table <库名2>.<表名2> as select * from <库名1>.<表名1>;
--根据表1创建表2,表2的字段和数据都和表1一样.可用于在不同的库之间进行创建
--若只需要表头不需要表数据的话,用create table <库名2>.<表名2> as select * from <库名1>.<表名1> where 1=0;
create table userinfo.clientinfo_2 as select * from userinfo.clientinfo_1;
------------------------------------------------------------
--2、清表内内容,
--delete <库名>.<表名>; 
--删掉一整个表内的数据
delete userinfo.clientinfo_1;
------------------------------------------------------------
--3、给表造数据,
--新建一个Test Window,写语句如下:
-- Created on 2017-03-22 by ZHOUKY16712 
declare 
  -- Local variables here
  --在declare下面定义一些参数
  i integer;--定义i为整型
  v_client_id varchar(20);--参数客户号为20位的字符串
  v_client_name varchar(50);--参数客户姓名为50位的字符串
  v_client_age integer;--参数客户年龄为整型
begin
  -- Test statements here
  --在begin后面开始写执行语句
 for i in 1..20 --将i从1运行到20,进行循环
 loop 
--********************************************--
--lpad(i, 6, '0')表示一个6位的字符串,以i的值结尾,前面以0补充
--||表示拼接,'1'||<字符串>表明在字符串前拼接字符'1'
--故全部循环结束后,v_client_id 值为1000001到1000020
--********************************************--
  v_client_id  := '1'||lpad(i, 6, '0');
  v_client_name :='zky';--名字赋值为zky
  v_client_age:=18;--年龄为18
  
  --给表插入数据
  --insert into<库名>.<表名> VALUES(<字段值>,<字段值>);这种的话是依次将值挨个传入字段内,
  --insert into<库名>.<表名> (<字段名>,<字段名>) VALUES(<字段值>,<字段值>);这种是可以跳跃将值传进字段里
  insert into userinfo.clientinfo_1 values(v_client_id,v_client_name,v_client_age); 
  end loop;--循环结束
  commit; 
end;  
------------------------------------------------------------ 
--4、还原表
delete  userinfo.clientinfo_1 ;
insert into userinfo.clientinfo_1 select * from userinfo.clientinfo_2 --把表2数据复制到表1去
drop table userinfo.clientinfo_2--把用来备份的表2删掉。


/* 一、 要使用闪回查询,数据库必须开启automatic undo management,必须有undo表空间,必须设置好回滚段的保留时间 */
 
-- 在sqlplus中查看undo_management参数值是否为AUTO,如果是“MANUAL”手动,需要修改为“AUTO”;
-- 查看回滚段的保留时间undo_retention,默认900秒(15分钟)
show parameter undo
-- 查看所有的回滚段
select SEGMENT_ID ,SEGMENT_NAME  from dba_rollback_segs;
-- 指定事务使用某个回滚段,如果不人为的指定回滚段,则数据库会根据回滚段中事务来权衡,以使得所有回滚段中事务压力尽可能平均。
set transaction use rollback segment rbs6;
-- 修改undo_management参数值为AUTO
/*
Oracle有个spfile动态参数文件,里面设置了Oracle的各种参数。所谓的动态,就是说你可以在不关闭数据库的情况下,更改数据库参数,记录在spfile里面。
更改参数的时候,有4种scope选项,scope就是范围。
scope=spfile 仅仅更改spfile里面的记载,不更改内存,也就是不立即生效,而是等下次数据库启动生效,有一些参数只允许用这种方法更改;
scope=memory 仅仅更改内存,不改spfile,也就是下次启动就失效了;
scope=both 内存和spfile都更改;
不指定scope参数,等同于scope=both。
*/
alter system set undo_management='AUTO' scope=spfile;
-- 修改undo_retention为1小时
alter system set undo_retention=3600 scope=both;
-- 查看修改是否立即生效
show parameter undo
select name,value from v$spparameter where name='undo_management';
-- 重启数据库,使修改生效
shutdown immediate
startup
show parameter undo
/* 测试闪回查询 */
select * from t1 where id<10;
delete from t1 where id<10;
commit;
-- 查询15分钟之前的表数据
select * from t1 as of timestamp(sysdate - 15/1440) where id<10;
-- 将数据恢复
insert into t1  select * from t1 as of timestamp(sysdate - 15/1440) where id<10;
commit;
/* 根据时间的闪回本质上是基于scn的闪回 */
-- 将dbms_flashback的执行权限授权给scott用户
grant execute on dbms_flashback to scott;
-- 查询当前的系统改变号scn,并记录下来,2363533
select dbms_flashback.get_system_change_number from dual; 
-- 删除数据
delete from t1 where id<10;
commit;
-- 根据删除数据时间点前的scn来查询删除前的数据
select * from t1 as of scn(2363533) where id<10;
-- 将数据恢复
insert into t1  select * from t1 as of scn(2363533) where id<10;
commit;
-- 使用ora_rowscn伪列来查看与每一行关联的scn
select ora_rowscn,t1.* from t1
-- 查看scn映射的事务提交时间
select scn_to_timestamp(2363533) from dual;
-- 查看每行数据的最新事务提交时间
select scn_to_timestamp(ora_rowscn), t1.* from t1;
 
/* 二、闪回表 */
drop table t1;
select * from t1;
-- 删除t1表后,该表的block还在表空间中,查询回收站可以看到被删除的对象
select * from recyclebin;
-- 闪回表到删除之前
flashback table t1 to before drop;
/* 闪回表到某个时间点 */
update t1 set contents='abc';
commit;
-- 必须启用表的行移动功能
alter table t1 enable row movement;
flashback table t1 to timestamp(systimestamp - 5/1440);
 
/* 三、闪回数据库 */
-- 需要有sysdba权限,才能使用flashback database命令,必须以独占模式装载数据库,但不打开数据库。
-- 同时将数据库置于闪回模式,执行闪回。
startup mount exclusive;
alter database archivelog;
alter database flashback on;
alter database open;
-- 查看闪回模式是否开启
select current_scn, flashback_on from v$database;
shutdown;
startup mount exclusive;
-- 闪回数据库到1小时之前
flashback database to timestamp sysdate-1/24;
-- 闪回成功后,打开数据库,同时resetlogs开启对数据库的写访问权限
alter database open resetlogs;
startup mount exclusive;
alter database flashback off;
alter database open;

2.1.16 Oracle常用语句(时间格式、去重、去特殊符号、查询表空间等)

Oracle常用语句(时间格式、去重、去特殊符号、查询表空间等)
时间格式相关
sysdate - 10/1440  10分钟前   1440 表示 24*60(一天的小时数*分钟数)
sysdate - 2/24  2小时前

yyyy-mm-dd hh24:mi:ss 年月日

Oracle查询今天、昨天、本周、上周、本月、上月数据
查询今天数据:
SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,'YYYY-MM-DD')=TO_CHAR(SYSDATE,'YYYY-MM-DD');

查询昨天数据:
SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,'YYYY-MM-DD')=TO_CHAR(SYSDATE-1,'YYYY-MM-DD');
查询本周数据:
SELECT COUNT(1) FROM T_CALL_RECORDS WHERE T_RKSJ >= TRUNC(NEXT_DAY(SYSDATE-8,1)+1) AND T_RKSJ < TRUNC(NEXT_DAY(SYSDATE-8,1)+7)+1;
查询上周数据:
SELECT COUNT(1) FROM T_CALL_RECORDS WHERE T_RKSJ >= TRUNC(NEXT_DAY(SYSDATE-8,1)-6) AND T_RKSJ < TRUNC(NEXT_DAY(SYSDATE-8,1)+1);
查询本月数据:
SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,'YYYY-MM')=TO_CHAR(SYSDATE,'YYYY-MM');
查询上月数据:
SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,'YYYY-MM')=TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM')--example01
SELECT count(1) FROM jck_fr_jcxx a where to_char(a.gxsj,'YYYY-MM-DD')=TO_CHAR(SYSDATE,'YYYY-MM-DD');
SELECT count(1) FROM jck_fr_jcxx a where to_char(a.gxsj,'YYYY-MM-DD')=TO_CHAR(SYSDATE-1,'YYYY-MM-DD');
SELECT count(1) FROM jck_fr_jcxx a WHERE a.gxsj >= TRUNC(NEXT_DAY(SYSDATE-8,1)+1) AND a.gxsj < TRUNC(NEXT_DAY(SYSDATE-8,1)+7)+1;
SELECT count(1) FROM jck_fr_jcxx a WHERE a.gxsj >= TRUNC(NEXT_DAY(SYSDATE-8,1)-6) AND a.gxsj < TRUNC(NEXT_DAY(SYSDATE-8,1)+1);
SELECT count(1) FROM jck_fr_jcxx a WHERE TO_CHAR(a.gxsj,'YYYY-MM')=TO_CHAR(SYSDATE,'YYYY-MM');
SELECT count(1) FROM jck_fr_jcxx a WHERE TO_CHAR(a.gxsj,'YYYY-MM')=TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYY-MM');

SELECT count(1) FROM jck_fr_jcxx a WHERE TO_CHAR(a.gxsj,'YYYY-MM')=TO_CHAR(ADD_MONTHS(SYSDATE,-6),'YYYY-MM');
SELECT count(1) FROM jck_fr_jcxx a WHERE TO_CHAR(a.djsj,'YYYY-MM')=TO_CHAR(ADD_MONTHS(SYSDATE,-6),'YYYY-MM');


-- 调整英文日期和中文日期格式
select to_date('07-Aug-2015','dd-mm-yyyy','NLS_DATE_LANGUAGE = english') as 英文日期 from dual;
select to_date('2015-08-07','yyyy-mm-dd') as 中文日期 from dual;

 

去重相关

-- 按时间去重复用法如下
delete from (select a.*, row_number() over(partition by order_id order by to_date(OPEN_TIME,'dd-mm-yy','NLS_DATE_LANGUAGE = english') desc) rw from TRANS_SOURCE_DATE a where ORDER_ID is not null) t where t.rw <> 1;
-- 按最大id去重方法
delete from TRANS_SOURCE_DATE
where order_id in (select order_id from TRANS_SOURCE_DATE group by order_id having count(*) > 1)
and  id not in (select max(id) from TRANS_SOURCE_DATE group by order_id having count(*) > 1);

 
数据库中去除字段的特殊符号
select * from temp_hlwzx_zh where CIRCUIT_NO_1 like '%'||chr(13)||'%'; //查询字段中是否包含回车
update CHK_GRID_RES_RELATION set int_id =replace(int_id,chr(13),'') //将回车替换
chr(9) 水平制表符
chr(10)换行键
chr(13)回车键
chr(39)单引号

 

查询表空间使用记录
SELECT a.tablespace_name TABLESPACE_NAME,
         total / 1048576 TOTAL_M,
         free / 1048576 FREE_M,
         (total - free) / 1048576 USED_M,
         ROUND((total - free) / total, 4) * 100 "USED%",
         autoextensible autoextem
    FROM (SELECT tablespace_name, SUM(bytes) free
            FROM DBA_FREE_SPACE
           GROUP BY tablespace_name) a,
        (SELECT tablespace_name,
                SUM(bytes) total,
               max(autoextensible) autoextensible
           FROM DBA_DATA_FILES
          GROUP BY tablespace_name) b
  WHERE a.tablespace_name = b.tablespace_name
  order by 6, 5 desc

 

查询时将多条列名以逗号分隔,显示在一列中
select 列名1||','||列名2||','||列名3 from 表名;

解决无效数字文字(table表示可能存在无效数字的表,aaa这个表示数字类型的字段)
select * from table where is_number(aaa)=0 and aaa is not null;

2.1.17 like多条件

select * from sys_ggbom a
where regexp_like (mdtest,(LT|C|ST))

2.查询 md003 以 HT 开头的数据

select * from sys_ggbom a
where regexp_like (md003,^(HT))

3.查询 md003 以 HT 结尾的数据

select * from sys_ggbom a
where regexp_like (md003,(HT)$’)


2.1.18 存储过程创建和调用

create or replace procedure:关键字用来创建或覆盖一个原有的存储过程。

myDemo01 :自定义的存储过程的名字。
as :关键字。
​ 注:
​ 在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别;

​ 在视图(VIEW)中只能用AS不能用IS;

​ 在游标(CURSOR)中只能用IS不能用AS。

begin :关键字。
dbms_output.put_line(‘hello word, my name is stored procedure’); 输出内容。
end;关键字。

create or replace procedure tj_data is  
  -- 当前存储过程用到的变量
  v_tableName VARCHAR2(100);
  v_sql   varchar2(200);
  v_count integer;
  -- 获取当前数据库中的所有表
  CURSOR TABLE_LOOP IS SELECT Table_name FROM User_tables;
 
  BEGIN
    -- 打开游标
    OPEN TABLE_LOOP;
      LOOP
        FETCH TABLE_LOOP INTO v_tableName;
          EXIT WHEN TABLE_LOOP %NOTFOUND;
               v_sql:= 'select count(1) from '||v_tableName;
               execute immediate v_sql into v_count;
               dbms_output.put_line(v_tableName||':'||v_count);
      END LOOP;
     CLOSE TABLE_LOOP;
end tj_data;

--存储过程调用(下面只是调用存储过程语法)
begin
tj_data();
end;

SELECT Table_name FROM User_tables where Table_name=upper('jck_FR_JCXX');
SELECT * FROM DSJ_FR_JCXX@STUDY;
rollback;


SELECT * FROM jck_FR_JCXX;

create or replace procedure myDemo01
as
begin
  dbms_output.put_line('hello word, my name is stored procedure');
end;


declare
begin
  myDemo01;
end;
 
begin
  myDemo01; --在此处也可使用myDemo01();完成存储过程的调用
end;

call myDemo01();--call 存储过程名可完成调用,注意括号不能少

SQL> set serveroutput on --可以再command命令窗口执行
SQL> exec mydemo01 --下面是输出结果
hello word, my name is stored procedure
PL/SQL procedure successfully completed


SELECT text
    FROM user_source
   WHERE NAME = 'procedure_name'
ORDER BY line
;

2.1.19

/*每日数据量*/
select trunc(a1.gxsj) dd,count(1) num FROM jck_fw_jcxx_ld a1 group by trunc(a1.gxsj)

select trunc(a1.gxsj) dd,count(1) num FROM jck_fw_jcxx_ld a1 group by trunc(a1.gxsj) order by dd;
select trunc(a1.gxsj) dd,count(1) num FROM jck_fw_jcxx_ld a1 group by trunc(a1.gxsj) order by dd desc,num;

select trunc(a1.gxsj) dd,count(1) num FROM jck_sj_jcxx a1 group by trunc(a1.gxsj) order by dd desc,num;

/*每日相比前一天增量*/
SELECT a.dd,count(1),SUM(lt.num) AS cum FROM(
select trunc(a1.gxsj) dd,count(1) num FROM jck_fw_jcxx_ld a1 group by trunc(a1.gxsj)) a join
(select trunc(a2.gxsj) dd,count(1) num FROM jck_fw_jcxx_ld a2 group by trunc(a2.gxsj)) lt
ON a.dd >= lt.dd GROUP BY a.dd;



2.1.20 ORACLE查询字段中含有空格的数据

SELECT * FROM T_NAME WHERE REGEXP_LIKE(COLNAME, '( )+');
SELECT * FROM T_NAME WHERE length(COLNAME) > length(trim(COLNAME));
SELECT * FROM T_NAME WHERE substr(字段,-1)=' ';

SELECT count(1) FROM jck_sj_jcxx t1 WHERE REGEXP_LIKE(t1.sjlx, '( )+');

2.1.21 oracle创建表空间自增长和创建用户

/*
  步骤:
  1、创建表空间
  2、创建用户
  3、用户授权
  */
  
  /*创建表空间*/
  create tablespace QCJ_TABLESPACE
  /*表空间物理文件名称*/
  datafile 'QCJ_TABLESPACE.dbf' 
  -- 这种方式指定表空间物理文件位置
  -- datafile 'F:\APP\QIUCHANGJIN\ORADATA\ORCL\QCJ_TABLESPACE.dbf' 
  -- 大小 500M,每次 5M 自动增大,最大不限制
  size 500M autoextend on next 5M maxsize unlimited; 
  
   /* 创建用户*/
  create user qiuchangjin 
  IDENTIFIED BY root --用户密码
  default tablespace QCJ_TABLESPACE-- 表空间是上面创建的
  temporary tablespace TEMP -- 临时表空间默认 TEMP
  profile DEFAULT;
  --password expire;
   /*密码过期需要重设密码,意思是当你用这个新建立的密码过期用户首次登录后,系统会提示你重新输入新密码,不然会拒绝你登陆,重设新密码后就可以登录,该用户的密码就是你新设的密码,相当于首次登录修改密码这样的选项。*/
    
   /* 用户授权_1*/
  grant connect,resource,dba to qiuchangjin;
  
   /* 用户授权_2*/
  grant connect to qiuchangjin with admin option;
  grant dba to qiuchangjin with admin option;
  grant resource to qiuchangjin with admin option;
  
  /*查询所有表空间物理位置*/
  select name from v$datafile;
  /*查询当前用户的表空间*/
  select username,default_tablespace from user_users;
  /*修改用户的默认表空间*/
  alter user 用户名 default tablespace 新表空间; 
  /*查询所有的表空间*/
  select * from user_tablespaces; 
  
  /* 删除表空间*/
  alter tablespace QCJ_TABLESPACE offline;
  drop tablespace QCJ_TABLESPACE including contents and datafiles;

2.1.17


2.1.17


2.1.17


2.1.17


2.1.17


2.1.17


2.1.17


2.1.17


2.1.17


2.1.17


PostgreSQL教程

1.1 参考文档

PostgreSQL教程

https://www.yiibai.com/manual/postgresql/sql-createtable.html#SQL-CREATETABLE-STORAGE-PARAMETERS

http://127.0.0.1:50903/browser/

https://www.runoob.com/postgresql/postgresql-schema.html

1.2 杂项

链接:https://pan.baidu.com/s/183gvPzXbu_o5KXv5ha8ziw
提取码:hej8

你可能感兴趣的:(数据处理,Oracle)