Oracle基础

Posted Journey&Flower

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle基础相关的知识,希望对你有一定的参考价值。

本地:orcl / orcl
用户登录
连接名:myScott
用户名:scott
口令:scott
--------------
主机名:localhost
端口:1521
SID:orcl    (数据库)

dblink跨库查询
https://my.oschina.net/u/1866821/blog/341960

管理员帐户登录
01,sys(超级管理员) 的角色是sysdba。数据库内很多重要的东西(数据字典表、内置包、静态数据字典视图等)
    都属于这个用户,sys用户必须以sysdba身份登录。
02,system(谱通管理员) 的角色是sysoper。手工创建的任何用户在被授予dba角色后都跟这个用户差不多。
02,sys 具有create database的权限; system没有该权限
03,YSDBA不是权限,当用户以SYSDBA身份登陆数据库时,登陆用户都会变成SYS。 
04,system用户以sysdba身份登录时就是sys,准确地说,任何用户以sysdba身份登录时都是sys,登陆后执行
    show user可以验证。

sys:拥有dba、sysdba、sysoper(系统操作员 )角色或权限,是Oracle权限最高的用户,只能以sysdba或sysoper登录,不能以normal形式登录。
System:拥有dba、sysdba权限或角色,可以以普通用户的身份登录。
?【sysdba、sysoper、DBA区别】
Sysdba用户: 可以改变字符集、创建删除数据库、登录之后用户是SYS(shutdown、startup)
Sysoper:用户不可改变字符集、不能创、删数据库、登陆之后用户是PUBLIC (shutdown、startup)
DBA用户:只有在启动数据库后才能执行各种管理工作。
Sysdba> Sysoper>普通的DBA

sys;            //系统管理员,拥有最高权限
system;    //本地管理员,次高权限
scott;        //普通用户,密码默认为tiger,默认未解锁

忘记Oracle管理员密码,远程当前机器
1,sys/ as sysdba;    权限不足。
原因:当用登录机器的不是管理员帐户Administrator。
解决方案:计算机->管理->本地用户和组->->ora_dba{添加当前用户}
或者
找到Oracle 安装目录[C:appAdministratorproduct11.2.0dbhome_1BIN] 
->cmd -> connect / as sysdba; 或 connect sys/oracle as sysdba



oracle 安装后产生的服务
---------------------------------------------------------------------------------------------------
OracleOraDb11g_home1TNSListener      Oracle监听服务
OracleServiceORCL            
OracleOraDb11g_home1ClrAgent
OracleOraClient12Home1MTSRecoveryService
OracleMTSRecoveryService
OracleJobSchedulerORCL
OracleDBConsoleorcl
OracleVssWriterORCL

D:DBoradb
---------------------------------------------------------------------------------------------------
一,Oracle登录
SQL Plus命令登录
     请输入用户名:sqlplus / as sysdba         //按2次回车(登陆sys帐户)
    请输入用户名:sys as sysdba;            //按2次回车(登陆sys帐户)
            密码方式:sys as sysdba->回车->密码
    请输入用户名:scott/scott;              //登陆普通用户scott

    在CMD命令窗口中输入:
    sqlplus 用户名/密码@数据库本地服务名 as sysdba;
    (如:sqlplus scott/1234@oracle1 as sysdba; bkcyun/bkc123456@192.168.1.53:1521/bkcyunpt)

    set oracle_sid=orcl   sqlplus / as sysdba 
    
    
支持的功能很全,但常用的几种连接方式也就几种:
  sqlplus / as sysdba


上一条命令的另一种形式,未发现两者有什么区别。
 sqlplus username/pwd@host/service_name
 sqlplus tiger/scott@localhost/orcl
 sqlplus tiger/scott@172.16.10.1:1521/orcl

以用户名/密码、IP:Port、服务名 为参数登录。
 sqlplus /nolog


先使用sqlplus命令,而不连接数据库,然后用conn命令登录。
 conn tiger/scott
 conn tiger/scott@172.16.0.1/orcl

这种方式比第3种方式安全,因为第3种方式登录后,通过ps查看到的进程是带用户名和密码的。    
    
---------------------------------------------------------------------------------------------------
二、创建数据库操作
--查询当前表空间(当前数据库用户)
select tablespace_name,file_id,file_name,bytes
from dba_data_files order by file_id where tablespace_name=emaoyi

--删除表空间
drop tablespace em;
--删除用户
drop user e [CASCADE];

--登录
sys / as sysdba 回车2次
    
1.系统查询(默认sys用户)
    --1.1,数据库查询
    show parameter db_name
    
    --1.2,查询当前表空间(当前数据库用户)
    select tablespace_name,file_id,file_name,bytes
    from dba_data_files order by file_id where tablespace_name=emaoyi
    
    --1.3,查询所有表空间
    select tablespace_name from dba_tablespaces;
    
    --1.4,查询临时表空间
    select * from v$tempfile;   
    
    --1.5,查询表空间所有数据文件路径
    select tablespace_name, file_id, file_name, BYTES/1024/1024 AS "BYTES(M)"
    from dba_data_files;

2.系统删除(默认sys用户)    
    --2.1,删除表空间
    drop tablespace  mydb_temp including contents and datafiles;


---------------------------------------------------------------------------------------------------------
3.Oracle11g脚本创建表空间和用户(分为5步)
    /*第1步:创建数据库模板 */
    工具方式:Oracle - OraDb11g_home1 -> 配置和移植工具 -> Database Configuration Assistant
    
    /*第2步:创建临时表空间 */
    create temporary tablespace mydb_temp tempfile D:DBoradbmydbmydb_temp.dbf 
    size 10m autoextend on next 10m maxsize 20480m 
    extent management local; 

    /*第3步:创建数据表空间 */
    create tablespace mydb logging datafile D:DBoradbmydbmydb.dbf 
    size 10m autoextend on next 10m maxsize 20480m 
    extent management local; 

    /*第4步:创建用户并指定表空间 */
    create user bkcyun identified by bkc123456 
    default tablespace mydb
    temporary tablespace mydb_temp; 

    
    /*第5步:表空间权限 */    
    更改用户默认表空间:
    alter database default tablespace ts1;
    或者
    alter user scott default tablespace user_data  temporary tablespace user_temp;  
    
    表空间改名:alter tablespace ts1 rename to tss1;    
    删除表空间:drop tablespace ts2 including contents and datafiles;

    /*第6步:给用户授予表空间权限(此处授于了dba权限) */
    --6-1,授予表空间权限
    alter user scott quota unlimited on user_data; 
    alter user scott temporary tablespace user_temp;
    或者 
    --修改了表空间的用户重新分配权限如:
    grant connect,resource to bkcyun;
    --新创建用户可以授予所有权限
    grant connect,resource,dba to bkcyun;

    ---------------------------------------------------------------------------------------------------------
    
4.Oracle11g脚本创建表空间、用户并分配表空间
    create tablespace bkcyundata logging datafileD:appAdministratororadbkcyunptkcyundata.dbf 
    size 50m autoextend on next 50m maxsize 20480m 
    extent management local;  
    
    create user bkcyun identified by bkc123456;         --创建用户
    alter user bkcyun default tablespace bkcyundata quota unlimited on bkcyundata; 
    alter user bkcyun quota unlimited on bkcyundata; 
    alter user bkcyun temporary tablespace temp; 
    
     grant execute any procedure to user;                --一次给所有的过程赋权限
    grant create trigger,create session to bkcyun; 
    grant create sequence,create synonym to bkcyun; 
    grant create table,create view to bkcyun; 
    grant create procedure ,create job to bkcyun; 
    grant alter session to bkcyun; 
    
    /*给用户授予权限 */
    grant connect,resource,dba to bkcyun;
    grant dba to bkcyun; 
    exit 

5,删除表空间
    ---表空间创建后是大写
    --删除表空间,包含物理文件
    drop tablespace BKCYUN_TEMP including contents and datafiles;
    --删除空的表空间,但是不包含物理文件
    drop tablespace BKCYUN;
    --删除非空表空间,但是不包含物理文件
    drop tablespace tablespace_name including contents;
    --删除空表空间,包含物理文件
    drop tablespace tablespace_name including datafiles;
    --如果其他表空间中的表有外键等约束关联到了本表空间中的表的字段,就要加上CASCADE CONSTRAINTS
    drop tablespace tablespace_name including contents and datafiles CASCADE CONSTRAINTS;

---------------------------------------------------------------------------------------------------
三、数据库备份和迁移
备份主要有三种方式:01.导出/导入、02.冷备份(停机)、03.热备份

101,关闭数据库 
    sqlplus /nolog 
    sql>connect /as sysdba 
    sql>shutdown normal; 
    02,用拷贝命令备份全部的数据文件、重做日志文件、控制文件、初始化参数文件 
    sql>cp 
    03,重启Oracle数据库 
    sql>startup 

2,导出数据库
    开始->cmd -> exp......
  (rows=n表示不带数据,rows=y表示带数据,buffer缓冲(exp的buffer最好>64000,imp的buffer最好>100000,),owner用于指定用户)
    注:以sys用户导出数据库时,一定要指定某个用,不然会将默认的系统表也导出来,导致还原时错误
    以创建用户导出数据库:

    ----orcl88本地监听
    exp LEILI_BR/123456@orcl88 file=D:DBSQLorcl88.dmp full=y 
    
    exp LEILI_BR/123456@orcl88 file=D:DBSQLorcl88.dmp owner=LEILI_BR 
    
    exp AHLS_MES/Leili123@192.168.159.200/orcl file=D:ahls.dmp owner=LEILI_BR
    
    exp LEILI_BR/123456@orcl88 file=D:DBSQLorcl88.dmp  owner=LEILI_BR

    exp Leili_MES/123456@192.168.0.88:1521/orcl file=D:Leili_MES.dmp owner=Leili_MES

    exp Leili_MES/ll123456@localhost:1521/orcl file=D:workDataBaseLeili_MES.dmp full=y;(会导出系统对象,不推荐)

    exp Leili_MES/ll123456@localhost:1521/orcl file=D:workDataBaseLeili_MES1.dmp owner=Leili_MES
    

3,导入数据库
    (ignore=y表示参数对已存在的表中没有的记录进行更新但已存在的记录不会进行覆盖,不使用ignore=y表示对已存在的表就不会进行导入)

    导入表结构但过滤重复表
    imp Leili_MES/123456@localhost:1521/orcl file=D:Leili_MES.dmp ignore=y full=y owner=LEILI_BR









4,从高版本到低版本的备份和迁移
    导出数据库:
    sqlplus sys/bkc12345@bkcyunxdj as sysdba
    create directory imp_dir as d:qianyi;
    grant read,write on directory imp_dir to bkcyun;
    exit
    expdp bkcyun/maximo@bkcyun directory=exp_dir dumpfile=bkcyun.dmp logfile=bkcyun.log version=10.2.0.4.0(content=all表示导出所有,Date_only表示只导出对象,Metadata_only表示只导出数据)
    导入数据库:
    sqlplus sys/bkc12345@bkcyunxdj as sysdba
    create user weihai identified by bkc123 default tablespace weihai;
    alter user weihai default tablespace weihai;
    grant connect,resource to weihai;
    grant unlimited tablespace to weihai;
    grant create database link to weihai;
    grant select any sequence,create materialized view to weihai;
    grant create session to weihai;
    create directory exp_dir as E:qianyi ;
    grant read,write on directory exp_dir to weihai;
    grant dba to weihai;
    exit
    impdp weihai/bkc123@bkcyunpt directory=exp_dir dumpfile=EXP_33_BKCYUNWH_2017_09_12_10_23_56.dmp remap_schema=导出用户名:导入用户名 remap_tablespace=导出表空间名:导入表空间名 PARALLEL=8 version=10.2.0.4.0

4,数据库恢复
    alter table FACILITYHEALTH enable row movement;
    flashback table FACILITYHEALTH to timestamp to_timestamp(2016-03-22 00:20:00,yyyy-mm-dd hh24:mi:ss);

5,查看数据库版本
    select * from V$version;

6,删除数据库中的所有数据
    set oracle_sid=bkcyunxdj
    sqlplus /as sysdba
    show parameter instance_name
    drop user bkcyun cascade;

7,查看directory目录
    select * from dba_directories;

8,删除directory目录
    drop directory 目录名;

9,关闭数据库
    Shutdown immediate;

10,开启数据库
    startup;
    数据库开启报错解决方案:
    ora-01219:数据库未打开
    alter database open;
    ora-16014:日志未归档
    ora-00312:联机日志
    sqlplus/nolog
    connect / as sysdba
    alter database datafile ‘D:oracleproduct10.2.0oradataxdjusers01.dbf’ offline drop;
    alter database open;
    若仍然报错Ora-16014:日志未归档 Ora-00312:联机日志
    show parameter db_recovery;
    alter system set db_recovery_file_dest_size=3G scope=both;
    alter database open;

11,删除归档日志文件
    连接rman的语句:rman target sys/oracle nocatalog
    http://blog.csdn.net/linlzk/article/details/5269186
    删除过期的归档
    RMAN> delete expired archivelog all;
    删除截止到前一天的所有归档
    RMAN>delete archivelog until time sysdate-1
    删除当前的系统时间7天前
    RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE SYSDATE-7;
    删除从7天前到现在的全部日志
    RMAN> DELETE ARCHIVELOG from TIME SYSDATE-7;

12,自动删除归档日志的脚本
    C:oracleproduct10.2.0db_1BIN
man target BKCYUN/maximo@BKCYUN run{crosscheck archivelog all; delete noprompt expired archivelog all; delete noprompt archivelog all completed before sysdate - 5;}

13,查看归档日志的使用情况
    select * from V$FLASH_RECOVERY_AREA_USAGE;

14,dos 批处理命令_forfiles
    http://wenku.baidu.com/link?url=d6m2iApz1ghH2eUjn5A0F4o5jc0cU5Nzvwfk8yvIR51BBpb0pfpvzfp7l3j60P68dXCGP_MNP19blOuZt5YhaeBwHBI-ji4VgqsDsnxWNku### 

15,扩展日志文件(FLASH_RECOVERY_AREA)存储空间的大小
    修改命令>alter system set db_recovery_file_dest_size=8G scope=both;
    查看命令>show parameter db_recovery_file_dest_size

16,删除Oracle数据库中所有表的数据
    Sqlplus中:
    sql>spool c:del_tables.sql
    sql>select drop/truncate table ||table_name||; from user_tables order by table_name;
    sql>spool off
    sql>@c:del_tables.sql
    Navicate中:
    SELECT TRUNCATE TABLE || table_name || ; FROM USER_TABLES ORDER BY TABLE_NAME;
    复制查询结果粘贴到查询界面执行语句即可。

---------------------------------------------------------------------------------------------------
四、用户与角色操作
1,查询所有用户
    select username,account_status from dba_users;
    
    select * from all_users;
    
2,解锁用户
    alter user scott account unlock;
    01、查看FAILED_LOGIN_ATTEMPTS的值
    select * from dba_profiles where RESOURCE_NAME = FAILED_LOGIN_ATTEMPTS;
    02、修改为30次
    alter profile default limit FAILED_LOGIN_ATTEMPTS 30;
    03、修改为无限次(为安全起见,不建议使用)
    alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;
    
3,为解锁用户设置密码
    alter user scott Identified by scott;

4,创建用户    
    01.创建一个用户名为SA 密码SA;
        create user SA identified by SA;  
        
    02.创建角色
    系统把权限赋给角色(一个角色包含多个权限),然后把角色赋给用户,当然也可以直接把某权限赋给用户。
    create role role1;
    
5,查看当前拥有权限
    select * from session_privs;
    查询当前用户角色
    select * from role_sys_privs;
    
     查看某一用户所拥有的角色和系统权限
     select * from dba_role_privs where GRANTEE=role1;

6,删除用户
    drop user bkcyun cascade;
    ora-01940无法删除当前已连接用户解决方法:
    ?    查看用户的连接状况select username,sid,serial# from v$session
    ?    找到要删除用户的sid,和serial,并删除alter system kill session532,4562;
    ?    删除用户drop user ts cascade
    
7,各种授权
    授权角色或用户:grant connect, resource, dba to  role1 或 用户;
    授权角色给用户: grant role1 to bkcyun;                
    
    对于普通用户:授予connect, resource权限。
    对于DBA管理用户:授予connect,resource, dba权限。
    
    oralce对权限管理比较严谨,普通用户之间也是默认不能互相访问的,需要互相授权
  grant all to public;                        --这条比较重要,授予所有权限(all)给所有用户(public)
    grant create session to SA;            --授予(连接权限)    
    grant create table to SA;                --授予创建表的权限

    grant unlimited tablespace to SA;  --授予用户使用表空间的权限
    ALTER USER 用户名QUOTA 1K ON 表空间; //可以在表空间system中使用1K的空间.

    grant create tablespace to SA;         --授予创建表空间权限
    grant select on tabel1 to SA;         --单个表查询权限
    grant update on table1 to SA;         --单个表修改权限
    grant execute on procedure1 to SA     --授权存储过程 
    grant update on table1 to SA with grant option;     --授权更新权限转移给SA用户,许进用户可以继续授权;
    --当拥有role1角色的所有用户,都具有对tableName表的select查询权限
    grant select on tableName to role1;    --授权角色    
    grant insert(id) on tablename to SA;
 grant update(id) on tablename to SA;//授予对指定表特定字段的插入和修改权限,注意只能是insert和update
 grant alert all table to SA;//授予SA用户alert任意表的权限

    --权限传递
  --即用户A将权限授予B,B可以将操作的权限再授予C,命令如下:
  grant alert table on tablename to SA with admin option;//关键字 with admin option
  grant alert table on tablename to SA with grant option;//关键字 with grant option效果和admin类似


    01.权限相关
        create session(创建会话),create table(创建表),unlimited tablespace(表空间)

        connect(角色)        --最基本的
        resource(角色)        --是授予开发人员的
        DBA(角色)            --是授予数据库维护人员的  

    02.角色授权方式
        grant connect,resource,dba to SA;    --(执行此语句后用户包括的权限:)
        CONNECT角色: --是授予最终用户的典型权利,最基本的
                ALTER SESSION             --修改会话
                CREATE CLUSTER         --建立聚簇
                CREATE DATABASE LINK     --建立数据库链接
                CREATE SEQUENCE         --建立序列
                CREATE SESSION         --建立会话
                CREATE SYNONYM         --建立同义词
                CREATE VIEW             --建立视图
        RESOURCE角色: --是授予开发人员的
                CREATE CLUSTER     --建立聚簇
                CREATE PROCEDURE     --建立过程
                CREATE SEQUENCE     --建立序列
                CREATE TABLE         --建表
                CREATE TRIGGER     --建立触发器
                CREATE TYPE         --建立类型    
        DBA角色            --是授予数据库维护人员的
    
8,各种撤销授权        
    revoke select on table1 from SA;         --撤销查询select表的权限; 
    revoke all on table1 from SA;
    revoke create table from SA;            --撤销创建表权限
    revoke connect,resource,dba from SA  --根据角色撤销权限
    

9,各种删除
    01,删除用户(使用cascade参数可以删除该用户的全部objects。)
        drop user SA cascade;
        
        删除表空间(删除用户只删除了该用户下的schema objects,是不会删除相应的tablespace的)
        删除tablespace
        DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
        
    02.删除角色
        语法: drop role 角色名;


---------------------------------------------------------------------------------------------------
五、数据库操作
dba_开头的是查全库所有的,all_开头的是查当前用户可以看到的,user_开头的是查当前用户的
1,查看所有用户:
    select * from dba_users;
    select * from all_users;
    select username,default_tablespace from user_users; --查看当前用户的缺省表空间

2,查看用户或角色系统权限:
    select * from dba_sys_privs;  --查看用户系统权限
    select * from user_sys_privs; --查看用户系统权限
 
3,查看角色(只能查看登陆用户拥有的角色)所包含的权限
    sql>select * from role_sys_privs;

4,查看用户对象权限:
    select * from dba_tab_privs;
    select * from all_tab_privs;
    select * from user_tab_privs; --查看用户表权限

5,查看所有角色:
    select * from dba_roles;

6,查看用户或角色所拥有的角色:
    select * from dba_role_privs;
    select * from user_role_privs;
  
7,查看用户下所有的表
    select * from user_tables;

8,显示当前会话所具有的权限
    select * from session_privs;

9,查看哪些用户有sysdba或sysoper系统权限(查询时需要相应权限)
    select * from V$PWFILE_USERS

10,dba查看当前登录用户 show user;

11,查看表空间
    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; 
    
    查看已经创建好的表空间:
    select default_tablespace, temporary_tablespace, d.username  
    from dba_users d

12,查询所有创建的LINK
    select * from dba_db_links;    ----(管理员帐户登录)
    
    select owner,object_name from dba_objects where object_type=DATABASE LINK;
    
    示例: 
    比如我要查看用户 wzsb的拥有的权限:
    SQL> select * from dba_sys_privs where grantee=WZSB;

    比如我要查看用户 wzsb的拥有的角色:
    SQL> select * from dba_role_privs where grantee=WZSB;
        
    查看一个用户所有的权限及角色
    select privilege from dba_sys_privs where grantee=WZSB
    union
    select privilege from dba_sys_privs where grantee in 
    (select granted_role from dba_role_privs where grantee=WZSB );     
    
13,查询实例名
    select instance_name from v$instance    
    
14,表结构
    创建表:
    修改默认值:        alter table tableName modify columnName number default null;
    修改字段名称:     alter table tablename rename column PartsCode to PartsId;
    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….);
    删除字段的语法:alter table tablename drop (column);
    删除一个字段:   alter table tablename drop column name;
    修改字段类:      alter table tablename modify (name varchar2(16) default ‘unknown’);

    创建表结构:      create table tablename(id varchar2(20) not null);
    增加一个字段:  alter table tablename    add (name varchar2(30) default ‘无名氏’ not null);
    同时添加多个字段:
                              alter table tablename    add (name varchar2(30) default ‘无名氏’ not null
                        ,age integer default 22 not null,has_money number(9,2));

     添加约束
     主键约束:ALTER TABLE tableName ADD CONSTRAINT PK_SYSUSERUID primary key(SYSUSERUID);
     联合主键:  ALTER TABLE tableName ADD CONSTRAINT PK_SYSUSERUID primary key(SYSUSERUID,USERID);
     非空约束:ALTER TABLE tableName MODIFY SYSUSERUID CONSTRAINT NT_SYSUSERUID NOT NULL;
   唯一约束:ALTER TABLE tableName ADD CONSTRAINT UN_SYSUSERUID UNIQUE(SYSUSERUID);
     限制输入:ALTER TABLE tableName ADD CONSTRAINT CK_City CHECK(City=上海 OR st_sex=北京);

     删除约束:ALTER TABLE tableName drop CONSTRAINT PK_SYSUSERUID;
    
     添加描述
        comment on table 表名 is 表的注释信息;
        comment on column PT_FACILITY.ISLUBE is A,润滑油|B,巡点检|C,精密点检|D,辅机在线|E,锅炉防磨防爆;    
    
    
15,跨库查询
    01,授权
        grant create  database link to scott ;         --只有scott用户能使用的dblink
                                                                        --所有用户都可以使用的dblink
        grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to scott;

    02,创建LINK
        --DB61(连接名),bkcyun/bkc123456(用户/密码),BKCYUNPT61(tnsnames.ora中定义的连接名)
        --用户/密码 是连接到指定库的用户密码
        create public database link DB61
        connect to bkcyun identified by bkc123456  
        using BKCYUNPT61;
        
        或者
        
        create public database link db15    
        connect to bkcyun identified by bkc123456  
        using (DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.1.15)(PORT = 5050)))(CONNECT_DATA =(SERVICE_NAME = bkcyunpt)));

    03,删除LINK DB61(LINK名称)
        --sys 用户不能删除其他用户的 db links
        DROP PUBLIC DATABASE LINK DB61;
      
    04,关闭dblink: 
        ALTER SESSION CLOSE DATABASE LINK DB61;  
        
    05,查询所有link   
    select * from dba_db_links;
      
    06,用法
      select * from tableName@DB61 ;
      

16,删除重复数据
    01,查询重复数据
    select URL,sum(1) as ct from sysmenu group by URL having sum(1) > 1;

    select * from sysmenubak2 where URL in (select URL from sysmenubak2 group by URL having count(URL) > 1)

    02,删除重复数据
    DELETE from sysmenu WHERE (URL) IN ( SELECT URL FROM sysmenu GROUP BY URL HAVING COUNT(URL) > 1)
    AND ROWID NOT IN (SELECT MIN(ROWID) FROM sysmenu GROUP BY URL HAVING COUNT(*) > 1);      
      
      
六、SQL高级查询
   COMMENT ON TABLE "SCOTT"."SYSUSER"  IS 平台用户表;            --表名描述
   COMMENT on column SYSUSER.USERID is 用户名;                        --列名描述
   
   select * from user_tab_comments where TABLE_NAME=SYSUSER;        --查询描述

1,高级查询
    01,复制表结构与数据
    create table sysuser as select * from sysuser@DB61;

    02,只复制表结构:
    create table sysuser as select * from sysuser@DB61 where 1=2;
    
    03,只复制表数据:
    两个表结构一样:insert into sysuser select * from sysuser
    两个表结构不一样:insert into sysuser(column1,column2...) select column1,column2... from sysuser

2,创建序列自动变号
   CREATE SEQUENCE  "SCOTT"."SYSUSERSEQ"  
   MINVALUE 1 MAXVALUE 9999999999  --最小值,最大值(可不设)
   INCREMENT BY 1                  --每次加1
   START WITH 1                    --从1开始计数 
   CACHE 20                        --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
   ORDER NOCYCLE ;                 --一直累加,不循环

   使用:
   select SYSUSERSEQ.nextval from dual ;
   select SYSUSERSEQ.currval from dual;
   
3,添加触发器(将自动编号与表字段关联)
    CREATE OR REPLACE TRIGGER "SCOTT"."SYSUSER_T" BEFORE INSERT  
    ON SYSUSER FOR EACH ROW
    DECLARE
        INTEGRITY_ERROR  EXCEPTION;
        ERRNO            INTEGER;
        ERRMSG           CHAR(200);
        DUMMY            INTEGER;
        FOUND            BOOLEAN;

    BEGIN
        SELECT SYSUSERSEQ.NEXTVAL INTO :NEW.SYSUSERUID FROM DUAL;
    EXCEPTION
        WHEN INTEGRITY_ERROR THEN
           RAISE_APPLICATION_ERROR(ERRNO, ERRMSG);
    END;

    
4,查询表中列
/****************** 查询表字段  ****/
select * from VUSER_TAB_COLS where tableName = IPINFO;
create View VUSER_TAB_COLS
as 
select a.TABLE_NAME,a.COLUMN_NAME,a.DATA_TYPE,a.DATA_LENGTH,a.NULLABLE,b.COMMENTS from user_tab_columns a INNER JOIN user_col_comments b on (a.TABLE_NAME = b.TABLE_NAME and a.COLUMN_NAME = b.COLUMN_NAME) where a.TABLE_NAME = UPPER(RHoilSelection);

--合并行
select a.TABLE_NAME,wm_concat(a.||a.COLUMN_NAME) as COLUMN_NAME from user_tab_columns a 
INNER JOIN user_col_comments b on (a.TABLE_NAME = b.TABLE_NAME and a.COLUMN_NAME = b.COLUMN_NAME) 
where a.TABLE_NAME = UPPER(FACILITYPARTS) group by a.TABLE_NAME;
    
---------------------------------------------------------------------------------------------------    
七、各中错误 
01,主要是oracle当前的服务不可用,是因为oracle没有启动或没有正常启动,共享内存并没有分配给当前实例.
ORA-01034:ORACLE not available
ORA-27101:shared memory realm does not exist;
解决方案:
先看oracle的监听和oracle的服务是否都启动了。
启动oracle监听:cmd命令行窗口下,输入lsnrctl start,回车即启动监听。

2,是说密码过期,密码将在1天内过期,可能是密码说置过短或没按替则设置。
ORA-28002: the password will expire within 1 days
解决方案:
将Oracle密码设置成永不过期就可以了,不过并不推荐这样做,最好是将日期密码有效期设置长一些。
查看密码有效期时长:
SELECT * FROM dba_profiles s WHERE s.profile=DEFAULT AND resource_name=PASSWORD_LIFE_TIME;
将密码设置成永不过期:
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

或者修改用户密码
 alter user scott identified by scott123;
 
 3,ora - 28001:密码已经过期
ORA-28001: the password has expired
28001. 00000 -  the password has expired
Cause:    The users account has expired and the password needs to be
           changed
Action:   change the password or contact the DBA.

解决方案:
查询状态
SELECT * FROM dba_profiles WHERE profile=DEFAULT AND resource_name=PASSWORD_LIFE_TIME
01,修改用户密码
ALTER USER 用户名 IDENTIFIED BY 密码 ;
02,如果想去除180天的密码生存周期的限制可通过如下SQL语句将其关闭
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED



八、其它  
---------------------------------
sysdba不需要密码验证竟然可以直接登录,这还有安全可言吗?
C:Users>sqlplus /nolog  
 
SQL*Plus: Release 11.2.0.1.0 Production on 星期四 3月 1 14:16:04 2012  
Copyright (c) 1982, 2010, Oracle.  All rights reserved.  
SQL> conn / as sysdba  
已连接。  
SQL> 
经过探索,原来oracle这是直接使用操作系统授权验证,只要当前登录OS的用户拥有足够的权限就可以使用sysdba登录了,在windows下有以下两种方式可以解除这种无密码登录:
方法一:修改%ORACLE_HOME%
etworkadminsqlnet.ora,注释掉以下行
SQLNET.AUTHENTICATION_SERVICES= (NTS) 
方法二:将登录OS的用户从ora_dba用户组中删除
再来试试:
SQL> conn / as sysdba;  
ERROR:  
ORA-01031: insufficient privileges 
SQL> 


-------------------------------
导入dmp
将xx.dmp文件拷贝到c盘下
cmd -> cd c:imp username/password@SID file=XXX.dmp fromuser=XXX touser=XXX tables=(XXX,XXX)

imp system/system@//localhost/orcl file=xx.dmp log=xx.log TABLES=(表名)
说明:表名 一定要与dmp中表名一至,否则会出错。

SQL Plus,数据区分大小写,未选定行(表示没有匹配的数据)

 

以上是关于Oracle基础的主要内容,如果未能解决你的问题,请参考以下文章

Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)(代码片段

[vscode]--HTML代码片段(基础版,reactvuejquery)

Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段

续:纠正:ubuntu7.04可以安装,而且完美的安装 ! for《Oracle-10.2.0.1,打补丁10.2.0.5:在 debian 版本4不含4以上,及 ubuntu 7.04不含(代码片段

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

Oracle-常用数据库对象笔记(片段)