Oracle数据库常用的查询和问题的解决方法

这个文件我也不知道是哪里来的,在我电脑上,反正用了很久了,感觉不错。拿出来分享一下。如有冒犯,请联系我删掉。


数据库常用的查询和问题的解决方法:

创建用户
create user ss
identified by password
[default tablespace tablespace_name]
[temporary tablespace tablespce_name];
创建ss用户,密码为password,使用tablespace_name表空间,如果没有指定表空间,默认表空间为system表空间。
Oracle 10g有用户默认表空间设置,建议在创建用户时一定要指名表空间。

 

/*第1步:创建临时表空间  */

create temporary tablespace user_temp  

tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'

size 50m  

autoextend on  

next 50m maxsize 20480m  

extent management local;  


/*第2步:创建数据表空间  */

create tablespace user_data  

logging  

datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf'

size 50m  

autoextend on  

next 50m maxsize 20480m  

extent management local;  


/*第3步:创建用户并指定表空间  */

create user username identified by password  

default tablespace user_data  

temporary tablespace user_temp;  


/*第4步:给用户授予权限  */

grant connect,resource,dba to username;  


--创建表空间
    create tablespace QCKJDB
    datafile 'G:\Oracle_db\QCKJDB.dbf'
    size 50m;

 

--扩展表空间

    alter database datafile '\oracle\oradata\anita_2008.dbf' resize 4000m


--创建用户
    --bdqn/epet
    create user ss
    identified by orcl (orcl是密码)
    default tablespace epet_tablespace

--drop user ss
--赋与角色 (一组权限的集合)
    grant connect,resource to ss


--删除表空间
    drop tablespace xxx including contents and datafiles;
    
--删除临时表空间
    DROP TABLESPACE GY18_TEMP INCLUDING CONTENTS AND DATAFILES;

--删除用户
    drop user "xxx" CASCADE


--查看所有表空间
    select * from dba_tablespaces

 

-----磁盘占用最多的10个sql语句
SELECT * FROM
(
SELECT PARSING_USER_ID
EXECUTIONS,
SORTS,
COMMAND_TYPE,
DISK_READS,
sql_text
FROM v$sqlarea
ORDER BY disk_reads DESC
)
WHERE ROWNUM<10 ;


-----查看总消耗时间最多的前10条SQL语句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.elapsed_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
--查看CPU消耗时间最多的前10条SQL语句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.cpu_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
--查询当前执行IO最多的sql,并按大到小来排序
select cast(buffer_gets/decode(EXECUTions,0,10000,EXECUTions) as int) 平均IO ,
EXECUTions 执行次数,buffer_gets 总逻辑IO,disk_reads 硬盘读取,
sql_text SQl语句 from v$sqlarea
where parsing_schema_name='HQT'
order by buffer_gets desc

 

 

--查看表空间使用情况
select a.tablespace_name as 表空间名,total as 总量M,free as 空闲M,total-free 已使用M,a.file_name AS 路径 from
( select tablespace_name,file_name,sum(bytes)/1024/1024 total from dba_data_files
   group by tablespace_name,file_name) a,
( select tablespace_name,sum(bytes)/1024/1024 free from dba_free_space
   group by tablespace_name) b
where a.tablespace_name=b.tablespace_name;

 


--修改表空间大小
alter database datafile '/home/Oracle_db/GY18DB.dbf' resize 1000m;

--修改临时表空间大小
alter database tempfile 'D:\OracleDBTemp\GY18_TEMP.DBF' resize 10240M;
--临时表空间自动扩展
alter database tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' autoextend on next 5m maxsize unlimited;

 

--查询表空间大小
1. 查询表空间剩余字节大小
SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS "FREE SPACE(M)"
  FROM DBA_FREE_SPACE
WHERE TABLESPACE_NAME = '&tablespace_name'
GROUP BY TABLESPACE_NAME;
注:如果是临时表空间,请查询DBA_TEMP_FREE_SPACE
SELECT TABLESPACE_NAME, FREE_SPACE/1024/1024 AS "FREE SPACE(M)"
  FROM DBA_TEMP_FREE_SPACE
WHERE TABLESPACE_NAME = '&tablespace_name';

 

 

 

 


--删除表
drop table "EDU"."TEMPSCORE21338922320970" cascade constraints PURGE

 

--清空表数据
delete from abc;

 


--查看oracle版本
select * from v$version

 

 

 

 

 

--查询数据库的信息


    select
    DBID, NAME, CREATED,PLATFORM_NAME, RESETLOGS_CHANGE#, RESETLOGS_TIME,
    PRIOR_RESETLOGS_CHANGE#, PRIOR_RESETLOGS_TIME, LOG_MODE,
    CHECKPOINT_CHANGE#, ARCHIVE_CHANGE#, CONTROLFILE_TYPE, CONTROLFILE_CREATED,
    CONTROLFILE_SEQUENCE#, CONTROLFILE_CHANGE#, CONTROLFILE_TIME, OPEN_RESETLOGS,
    VERSION_TIME, OPEN_MODE, PROTECTION_MODE, PROTECTION_LEVEL, REMOTE_ARCHIVE,
    ACTIVATION#, SWITCHOVER#, DATABASE_ROLE, ARCHIVELOG_CHANGE#, ARCHIVELOG_COMPRESSION,
    SWITCHOVER_STATUS, DATAGUARD_BROKER, GUARD_STATUS, SUPPLEMENTAL_LOG_DATA_MIN,
    SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI, FORCE_LOGGING, PLATFORM_ID,
     RECOVERY_TARGET_INCARNATION#, LAST_OPEN_INCARNATION#, CURRENT_SCN,
    FLASHBACK_ON, SUPPLEMENTAL_LOG_DATA_FK, SUPPLEMENTAL_LOG_DATA_ALL, DB_UNIQUE_NAME,
    STANDBY_BECAME_PRIMARY_SCN, FS_FAILOVER_STATUS, FS_FAILOVER_CURRENT_TARGET, FS_FAILOVER_THRESHOLD,
    FS_FAILOVER_OBSERVER_PRESENT, FS_FAILOVER_OBSERVER_HOST, CONTROLFILE_CONVERTED, PRIMARY_DB_UNIQUE_NAME,
    SUPPLEMENTAL_LOG_DATA_PL, MIN_REQUIRED_CAPTURE_CHANGE#
    from v$database;

--查询实例信息,如实例名,启动时间


    select * from v$instance;


--数据库中具有sysdba,sysoper权限的用户

    select * from v$pwfile_users;

 

*****************************************************************Oracle 中的一些重要V$ 动态性能视图,系统视图和表

 


            v$database:数据库的信息,如数据库名,创建时间等。

            v$instance 实例信息,如实例名,启动时间。

            v$parameter 参数信息,select * from v$parameter where name like '%name'  ----> show parameter name(sqlplus中执行)

            v$process 运行的进程的信息,如PID,SPID,以及进程的名字,如SMON,PMON在UNIX的进程名称,在windows中会看到类似ORACLE.EXE (PMON)这样的线程名字.

            v$mystat 本session的SID号等信息..知道了SID后可以通过查询session相关的信息.

            v$session 连接到数据库的session相关的信息,如机器名,客户端程序名称,PID(UNIX)等.

            如通过 select distinct(sid) from v$mystat;得到SID后,

            可以得到这个session的相关信息,如为这个session服务的后台进程的地址(PADDR) select * from v$session where sid=157

            得到PADDR后可以得到后台进程的信息:select * from v$process where addr = '3424E3BC'

            v$controlfile 控制文件的位置信息,可以在nomount阶段查看,但没有数据.数据库在mount后这个视图才有数据.

            v$controlfile_record_section控制文件里的配置信息.

            v$datafile 数据文件的位置信息,数据库在mount后这个视图才能被查看.数据库打开是检查里面的CHECKPOINT_CHANGE#(从控制文件得来)是否和v$datafile_header的一致.

            v$datafile_header 数据文件头信息.是从数据文件头读取的,在做恢复的时候每当一个归档日志应用之后,CHECKPOINT_CHANGE#都可以看到变化.

            select dbms_flashback.get_system_change_number from dual

            v$logfile 日志文件的位置信息,数据库在mount后这个视图才能被查看.

            V$INSTANCE_RECOVERY:实例恢复时和重做日志有关的信息,FAST_START_MTTR_TARGET:实例恢复的时间限制,oracle将这个时间换算成
            redo blocks数量,当log buffer中未写入log file的redo block数量超过这个值,就会触发增量检查点。

            (这和数据库加载文件的顺序有关系,数据库startup nomount时根据参数文件加载控制文件,startup mount后,根据控制文件加载数据文件和日志文件)

            v$log: 日志的的信息,比如当前用的是那一个日志组。

            v$sga_dynamic_components SGA各个内存块的信息,如java 池的大小,共享池的大小,数据缓冲区(在10G中是根据数据块的大小有不同的缓冲区的,如DEFAULT 2K buffer cache放数据块是2k的,DEFAULT 4K buffer cache放数据块是4k的)

            v$pwfile_users 数据库中具有sysdba,sysoper权限的用户。

            v$rollstat 回退段信息,USN回退段的编号,XACTS活动的事务数量。回退段可以从dba_rollback_segs 查看。

            v$transaction 活动事务信息,如对应的回退段(XIDUSN)是哪一个等。

            v$sql:执行过的SQL语句。

            v$lock:那些session占用了什么样的锁,在申请什么样的锁,该session是否阻塞了别的session。

            v$locked_object哪些对象被锁住了。

             v$session_wait  查看session等待信息:select * from v$session_wait where wait_class != 'Idle'看目前还在等待的session,如被阻塞的session。

            v$session_wait_history:session等待的历史信息,只保存离目前最近的10条记录。

            v$active_session_history:活动session(等待的或者在使用CPU)的历史信息,每一秒统计一次信息。每隔一小时会记录到磁盘,从dba_hist_active_sess_history可以看到。执行db_1\RDBMS\ADMIN\ashrpt.sql可以生成报告。

            v$statistics_level:那些advisor被打开了以及advisor做统计时候从那些view取统计信息.

            v$sga_dynamic_components:SGA各个模块的动态统计信息.

            v$log在线日志的信息,那一组是正在使用的,开始使用时候的SCN.

            v$archived_log 归档日志的信息,从那个SCN开始到那个SCN结束归档到了那一个文件.

            v$backup 那个表空间处于热备份模式.alter tablespace xx begin backup的时候会把对应的SCN记录下来.

            v$statname 数据库动态都统计那些信息,有信息名称和ID,一般和v$sesstat联合使用.

            v$sesstat 一些动态统计信息的值,如user commits,opened cursors current,redo size等等,

            select  name,value from v$sesstat,v$statname
            where v$statname.STATISTIC#=v$sesstat.STATISTIC#  and v$statname.name like '%redo size%' and SID=115

            和falshback相关的

            v$flashback_database_logfile flashback的日志文件相关的信息,Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录可以恢复到最早的时点 .
            v$flashback_database_log:日志使用的情况
            v$flashback_database_stat: flashback统计信息.

            上面三个视图在alter database flashback on才有数据.
            flashback_transaction_query
            v$nls_valid_values 可以用的语言,国家和编码设置,alter session set nls_language=american;

            v$parameter_valid_values 可以设置的参数值

            v$sga:sga内存的信息,select sum(value)/1024/1024 from v$sga通常=sga_max_size或者sga_target

            v$sga_dynamic_free_memory:sga未分配的内存。

            v$bh DB buffer里缓存的数据块信息。

            设置客户端编码

            NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,三部分,AMERICAN语言,提示信息,AMERICA国家影响日期格式,ZHS16GBK编码。

            查看服务器编码 select name,value$ from props$ where name ='NLS_CHARACTERSET';


            『以dba_和v$开头的通常都是视图。dba_开头的里面的信息通常是静态的,信息在文件中(但是并不代表里面的信息不变化)。v$开头的信息通常是动态的,来自控制文件和内存中的信息』


            dba_data_files(v$datafile )数据文件信息,里面不包括临时表空间对应的文件的信息,,dba_tablespaces(v$tablespace)表空间信息,dba_tables表信息, dba_segments段信息,dba_extents区信息。

            dba_segments:那些段保存到了那个表空间,占用了多大空间等.

            select * from dba_segments where segment_name='TEST'
            select * from dba_segments where tablespace_name='USERS'
            select * from dba_segments where owner='YORKER'

            dba_users 用户信息,如默认表空间。dba_roles:系统里定义的角色,如DBA(注意与sysdba的区别),CONNECT等。和用户相关的还有一个视图dba_profiles:数据库中定义的profile信息,profile是指登录尝试次数,密码过期时间限制等,该用户可以有多少个session,空闲多久可以把该用户断掉,可以在create user时候指定。

            dba_sys_privs :什么样的用户或者角色授予了什么样的系统权限。

            dba_tab_privs看什么样的用户或者角色授予了什么样的对象权限。

            dba_role_privs,用户或者角色被授予了什么样的角色。通过角色授予的权限要重新登录才能起作用。

            权限传递:系统权限被收回,传递的权限不收回,对象权限被收回,传递的权限也收回。

            dba_constraints 约束的信息. 表级约束Primary(P),Foreign key(R),Unique(U),Check.  列级约束Not null(可以认为是check约束的一种,在dba_constraints 的constraint_type和check约束相同,都为'C').还有对于NOT NULL的ALTER TABLE语句建立约束与其他四种(alter table tb add constraints...)是不同的:ALTER TABLE tb MODIFY col_name NOT NULL.

            dba_priv_audit_opts:数据库打开了那些权限审计. aduit create session;. aduit create session whenever not successful;

            dba_obj_audit_opts:数据库打开了那些对象审计.audit select  on tb[by session/access].

            dba_stmt_audit_opts:数据库打开的语句审计 audit table by userA

            dba_audit_trail审计的信息视图,一部分信息正是从表aud$的审计信息查询出来的,表aud$只能以sysdba权限看.

            dba_fga_audit_trail 保存的是通过dbms_fga.add_policy 创建的细粒度审计的审计信息.

            dba_common_audit_trail保存的是创建的标准和细粒度审计的类型信息.

            dba_rollback_segs 数据库回退段的信息。

            dba_hist_wr_control awr(auto workload repository)生成数据库负载信息的控制信息,保留时间,统计频率。 dbms_workload_repository .modify_snapshot_settings(retention=>1440,interval=>30)修改控制。

            dba_hist_snapshot:数据库运行snapshot的历史信息,根据dba_hist_wr_control的控制信息自动生成,可以通过dbms_workload_repository .create_snapshot生成。

            利用db_1\RDBMS\ADMIN\awrrpt.sql可以生成数据库运行报告。db_1\RDBMS\ADMIN\awrrpt.sql\addmrpt.sql可以生成与之对应的诊断建议报告。

            dbms_workload_repository.create_baseline可以选择某从某个snapshot到另外一个之间(这段时间DB运行良好)创建baseline来做为以后数据库运行信息的比较基准.

            dba_hist_baseline保存的snapshot基准信息.

            dba_thresholds 发生警告的上限值.如表空间用了多少报警.后台进程MMON会监视这些信息.

            dba_outstanding_alerts 最近10条警告信息. dba_alert_history 警告的历史信息.

            表:

            system_privilege_map,系统权限信息,如经常用到的sysdba和sysoper都是系统权限。还有像CREATE TABLESPACE,DROP TABLESPACE等,要注意的是drop table不是系统权限,drop any table是系统权限。UNLIMITED TABLESPACE权限不能授予给角色,也就意味着DBA角色的用户也需要单独额外授予UNLIMITED TABLESPAC权限。

            数据库的这些视图,表定义可以在下面的视图中查到:

            select * from dict
            select * from dict_columns
            select * from v$fixed_table
            select * from v$fixed_view_definition

            SELECT '*TABLE: ' || TABLE_NAME, COMMENTS
            FROM ALL_TAB_COMMENTS
            WHERE OWNER = 'SYS'
            AND TABLE_NAME = 'USER_SYNONYMS'
            UNION
            SELECT 'COL: ' || COLUMN_NAME, COMMENTS
            FROM ALL_COL_COMMENTS
            WHERE OWNER = 'SYS'
            AND TABLE_NAME = 'USER_SYNONYMS' ;

 

*****************************************************************Oracle 中的一些重要V$ 动态性能视图,系统视图和表


--日志清理
A、进入diag\tnslsnr\kepan-PC\listener\alert删除里面的文件

B、进入diag\tnslsnr\kepan-PC\listener\trace删除里面的文件


--表清理
打开 alter table test_move enable row movement;

alter table TABLE_NAME shrink space compact;  只整理碎片 不回收空间。
alter table TABLE_NAME shrink space;          整理碎片并回收空间。
alter table TABLE_NAME shrink space cascade;  整理碎片回收空间 并连同表的级联对象一起整理(比如索引)


--当前的数据库连接数
select count(*) from v$process;
1、查看连接oracle的所有机器的连接数
select machine,count(*) from v$session group by machine;
2、查看连接oracle的所有机器的连接数和状态
select machine,status,count(*) from v$session group by machine,status order by status;


select 'SGA' AS NAME,ROUND(sum(value)/1024/1024,2)||'M' AS "SIZE(M)" from v$sga
UNION
select 'PGA' AS NAME,ROUND(value/1024/1024,2)||'M' AS "SIZE(M)" from v$pgastat where name='total PGA allocated'
UNION
select 'TOTAL' AS NAME,((SELECT ROUND(sum(value)/1024/1024,2) from v$sga)+(select ROUND(value/1024/1024,2) from v$pgastat where name='total PGA allocated'))||'M' AS "SIZE(M)" FROM DUAL
UNION

SELECT NAME,TO_CHAR(VALUE) FROM V$PGASTAT WHERE NAME='process count';

--修改最大连接数
alter system set processes = 300 scope = spfile;


--数据库允许的最大连接数
select value from v$parameter where name = 'processes';


--查看当前有哪些用户正在使用数据
SELECT osuser, a.username,cpu_time/executions/1000000||'s', b.sql_text,machine   
from v$session a, v$sqlarea b  
where a.sql_address =b.address order by cpu_time/executions desc;
SELECT osuser, a.username,cpu_time/executions/1000000||'s', b.sql_text,machine
from v$session a, v$sqlarea b
where a.sql_address =b.address order by cpu_time/executions desc;

--并发连接数
select count(*) from v$session where status='ACTIVE';


--当前的session连接数
select count(*) from v$session;
--最大连接
show parameter processes;

 

 


--针对某个字段在某个时间段删除的数据查询
select * from  menus as of timestamp to_timestamp('2013-11-26 20:00:00','YYYY-MM-DD HH24:MI:SS')

 

--查询表字段数据
select  * from  user_tab_cols where table_name='XBDBDSY17210911795590'(注意表名大写)


--查询表注释
select   *   from   user_tab_comments


--字段注释
select   *   from   user_col_comments;

 

--ORA-28000 the account is locked用户被锁定

    alter user username account unlock;
    
    username为具体被锁定的用户名

 

--“记录被另一个用户锁住”解决办法

1.通过查找出已被锁定的数据库表及相关的sid、serial#及spid:

        select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号

        from v$locked_object l , dba_objects o , v$session s , v$process p

        where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr;

2.在数据库中灭掉相关session:

       alter system kill session 'sid,serial#';     

      --sid及serial#为第一步查出来的数据   如( alter system kill session '141,252';)//141是sid的值,252是serial#值

 

--数据库dmp格式导出
    导出整库:
    exp rst/rst@orcl file='\rstabak_columdata.dmp'
    
    
    exp rst/rst115.29.38.18@orcl file='\rstabak_columdata.dmp'
    
    exp rst/rst@115.29.38.18/orcl file='\rstabak_columdata.dmp'

    带端口导出:
    exp rst/rst@115.29.38.18:1521/orcl file='\rstabak_columdata.dmp'

    导出单张表:
    exp rst/rst@orcl file='\rstabak_columdata.dmp' tables=COLUMNDATA
    
    
    sysdba导出指定用户数据库:
    exp "'sys/sys@orcl as sysdba'" owner=scott file=e:\s.dmp log=e:\log.txt
    可以这样,owner后面指定要导出哪个用户下的数据
    
    
--数据库导入
         imp aichannel/aichannel@HUST full=y  file=d:/data/newsmgnt.dmp ignore=y

 

--查看当前数据库字符集
    select * from nls_database_parameters


--查看数据库版本
    select * from v$version
    

 

--ORA-28002: 7天之后口令将过期的解决方法
  ORA-28002: the password will expire within 7 days 解决方法

      1.查看用户的profile设置:
      SELECT username,profile FROM dba_users;

      2.查看系统profiles中PASSWORD_LIFE_TIME设置。
      SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';

      3.修改DBA_PROFILES中PASSWORD_LIFE_TIM的设置,改为ULIMITED。
      ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;  

    4.如果还会出现提示时,就修改密码
    ALTER USER <用户名> IDENTIFIED BY <密码>

 

--ORA-01658: 无法为表空间 EDUDB 中的段创建 INITIAL 区
    原因:因为表空间不够用了,增加了表空间
    1.查看表空间路径
    select file_name from dba_data_files where tablespace_name = 'EDUDB'

    2.增加表空间大小
    alter database datafile 'F:\ORACLE_DB\EDUDB.DBF' resize 1000M;

 

--在Linux下启动Oracle

    登录到CentOS,切换到oracle用户权限

    # su – oracle

    接着输入:

        $ sqlplus "/as sysdba"

    原本的画面会变为
        SQL>

    接着请输入
        SQL> startup

    就可以正常的启动数据库了。

 

--在Linux下停止数据库的指令如下:

    SQL> shutdown immediate
    
    
    shutdown 其参数 :shutdown有四个参数,四个参数的含义如下:
                                    Normal 需要等待所有的用户断开连接
                                    Immediate 等待用户完成当前的语句
                                    Transactional 等待用户完成当前的事务
                                    Abort 不做任何等待,直接关闭数据库

 

--在Linux下检查Oracle DB监听器是否正常

    回到终端机模式,输入:

    $ lsnrctl status

    
        如果没有启动,可以输入:

        $ lsnrctl start


--exp导出时出现ora 01034

    执行
    sqlplus /nolog
    connect / as sysdba
    startup force

    注意:只能解决单步导出。

 

--连接oracle数据库出现oracle ORA-12526:TNS:监听程序:所有适用例程都处于受限模式的问题
    查了下原来之前改字符集时执行了:ALTER SYSTEM ENABLE RESTRICTED SESSION;
    导致受限
    解决办法:

    使用系统管理员身份运行以下一段代码
    ALTER SYSTEM DISABLE RESTRICTED SESSION;

 

--oracle查询结果如果某个字段重复的时候就取另一个...

    如表a数据信息如下: IdnameResults
            1    kar    l85
            2    ramon    90
            3    kar    l93
            4    ramon    95

    select rownum,a.* from (select name, max(results) from table_a group by name order by name) a;
    ===========================================

--oracle中查出某个字段重复的次数并计算重复次数的总和

    如表a数据信息如下: IdnameResults
            1    kar    l85
            2    ramon    90
            3    kar    l93
            4    ramon    95

    select 字段,count(*) from table group by 字段;
    ===========================================

--oracle 查询所有字段,某字段重复只显示一条

    例如     表A :ziduan1 ziduan2 ziduan3
            a     b     c
            a     b     d
        表B :ziduan1 ziduan...

    查询结果剔重,比较方便的就是直接用distinct,
    对于大数据量的剔重,也可以使用row_number() over(partition by col1 order by col1) rn 最后判断rn=1即可
    ===========================================

--Oracle查询一批数据,某字段的内容有重复数据,怎样...

    比如:     C1 C2 C3 C4 C5
        1 x a b 11.20
        1 y d e 11.3
        1 z g h 11.2
        3 o j...

    SELECT * FRON 表 main WHERE NOT EXISTS ( SELECT 1 FROM 表 sub WHERE main.C1 = sub.C1 AND main.C5 < sub.C5 ) 算法就是,
    对于 每一个 C1 不存在有其他行的 C5 比本行的 C5 更大
    ===========================================

--oracle 中如何查询多个字段重复字段的内容?

    select REPORT_NO, COM_NO, RISK_TYPE_NAME, PAYMENT_DEADLINE, AGENT_O...

    select COUNT(1) AS 记录数, REPORT_NO, COM_NO, RISK_TYPE_NAME,
        PAYMENT_DEADLINE, AGENT_ORG, CHANNEL, NATURE1_NO, NATURE2_NO, REPORT_TYPE, KOSTL
        from STG_SAP_PL_DETAIL group by REPORT_NO, COM_NO, RISK_TYPE_NAME, PAYMENT_DEADLINE,...
    ===========================================

--oracle数据库查询时如何排除重复字段?

    select REPORT_NO, COM_NO, RISK_TYPE_NAME, PAYMENT_DEADLINE, AGENT_O...

    select后面加上distinct。
    ===========================================

--用PLSQL查询oracle数据库中某个表,查询结果如果包...

    用PLSQL查询oracle数据库中某个表,查询结果如果包含两个字段SHAPE.SDO_...

    这两个字段是什么数据类型?LONG RAW? BLOB?
        补充说明一下:SDO_GEOMETRY是类似多位数组的类型(好像是11g后出来的) 我在PLSQL还没遇到过,
        还是我的建议: PLSQL在访问某些大数据会出现错误(可能是BUG),建议升级下PLSQL 如果已经到比较新的版本...
    ===========================================

--oracle如何查询表中某个字段在半个小时内重复出现2...

    例如,某学校出校要刷卡,卡号唯一,时间为刷卡时间,现在要查询那些人...

    100分拿来吧。。你将表内随便加些数据用我得查询看下结果
        create table T_TEST ( ID VARCHAR2(20), LEAVE_TIME DATE );
        select b.id from (select a.id, a.leave_time - lag(a.leave_time)
    over(partition by a.id order by a.leave_time) lv_ti...
    ===========================================

--oracle 查询字段值重复sql语句

    表 A 字段 b 想查询 b 字段有重复的数据。

    select b from A group by b having count (*)>1
    ===========================================
    

 

--按照笔划排序:
    select * from table order by nlssort(col,'NLS_SORT=SCHINESE_STROKE_M');
--按照部首排序:
    select * from table order by nlssort(col,'NLS_SORT=SCHINESE_RADICAL_M');
--按照拼音排序:
    select * from table order by nlssort(col,'NLS_SORT=SCHINESE_PINYIN_M');
--解决:
        

    1班
    2班
    3班            select * from table order by  to_number(regexp_substr(a.bjname,'[0-9]*[0-9]',1));
    4班
    5班
    6班            这样的数据格式排序,需要注意的是,中文部分必须一致。
    7班
    8班
    9班
    10班
    11班
    12班
    13班
    14班
    15班

--oracle 固定排序
select njname from (
select njname from nj where csid in ($csid$)
and njname <> '毕业' group by njname)
order by DECODE(njname, '一年级',1,'二年级',2,'三年级',3,'四年级',4,'五年级',5,'六年级',6,'七年级',7,'八年级',8,'九年级',9,'高一',10,'高二',11,'高三',12)

 

--Oracle中的wmsys.wm_concat主要实现行转列功能(说白了就是将查询的某一列值使用逗号进行隔开拼接,成为一条数据)。


    select t.rank, WMSYS.WM_CONCAT(t.Name) TIME From t_menu_item t GROUP BY t.rank;

    select E.BSID ,WMSYS.WM_CONCAT(H.STNAME || '(' || E.RSZF || '分)') FS  from RESULTSSUMMARY E,MONECOURSE F,GRADESUBJECT G,SUBJECT H
        WHERE E.MECID=F.MECID AND F.GSID=G.GSID AND G.STID=H.STID  group by E.BSID;
        
        
        
        
--列值转行
    方式1:select * from tmp_tab t pivot(count(1) for deptno in (10, 20, 30, 40));
    
    方式2:listagg(city,',');

 

--oracle联合删除
    DELETE FROM USERS  A
        WHERE USNAME in (
                    SELECT B.TCCERID
                    FROM  TEACHER B
                WHERE B.TCNAME<>'小白' and b.TCNAME<>'小黑'
    );

 

 

--查询各学生科目为Oracle排名(简单排名)


    select sc.s_id,sc.s_name,sub_name,sc.score,

         rank() over (order by score desc) 名次

        from t_score sc

            where sub_name='Oracle'


--对比:rank()与dense_rank():非连续排名与连续排名(都是简单排名)


    select sc.s_id,sc.s_name,sub_name,sc.score,

        dense_rank() over (order by score desc) 名次

        from t_score sc

            where sub_name='Oracle'


--查询各学生各科排名(分区排名)


    select sc.s_id,sc.s_name,sub_name,sc.score,

         rank() over

            (partition by sub_name order by score desc) 名次

            from t_score sc


--oracle的where条件里不包括的条件


    1 <> :select * from table t where t.name <> '张三' and t.dept='业务部';

    2 not in:    select * from table t where t.name not in ('张三') and t.dept='业务部';

    3 not exists:    select * from table t where t.dept='业务部'
                and not exists (select 1 from table tt where tt.id=t.id and tt.name='张三' );(需要关联字段)

 

 

 

 

 


--oracle 找回 某个时间段删除的数据


select * from dba_source
as of timestamp to_timestamp('2014-11-30 19:00:00', 'YYYY-MM-DD HH24:MI:SS')

where OWNER = 'GY18' and TYPE='PROCEDURE' and NAME like 'P%' order by NAME;

 

--找回 被修改的表的数据
SELECT USID, USPWD FROM users AS OF TIMESTAMP SYSDATE-1/24

 

 

 

 

--如果指定或请求并行执行,但没有指定并行度,默认的并行度被设置为系统CPU核数的两倍。通过参数parallel_threads_per_cpu来控制,如下:


    show parameters parallel_thread;

 

 

--如果参数parallel_degree_policy被设置为auto,那么,Oracle将依据要执行的操作的特性和对象的大小来确定并行度。
    注:该方法用在11gR2。auto也允许并行从缓存中获取数据而不是直接路径IO。参数显示如下:


    show parameters parallel_degree_policy


    alter session set parallel_degree_policy = 'auto'
    
    
--oracle去除奇葩数据

            去除换行
            update zhzl_address t set t.add_administration_num=replace(t.add_administration_num,chr(10),'');
            去掉回车
            update zhzl_address t set t.add_administration_num=replace(t.add_administration_num,chr(13),'');
            去掉空格
            update zhzl_address t set t.add_administration_num=trim(t.add_administration_num);


--查询oracle 执行的sql

    SELECT * FROM V$SQL
    
    
    
    
--oracle递归查询
select * from table
start with org_id = 'HBHqfWGWPy'
connect by prior org_id = parent_id;
    
    

 

 

--ORA-00257: archiver error. Connect internal only, until freed


    1.首先查看当前flash recovery area使用情况

        sqlplus / as sysdba


    SQL> show parameter log_archive_dest;


        主要看:log_archive_dest string --日志路径的value没有值


    2.SQL> set linesize 200

    3.SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;

        主要看:ARCHIVED LOG    的百分比


    4.采用rman方式清除日志

        rman target sys/fyzh

    5.crosscheck archivelog all; --先检查下


    6.RMAN> delete expired archivelog all; --删除过期的日志,本库没有过期的


    7.没有过期的,为了腾出空间,就指定到具体的时间将其删除。

        RMAN>delete archivelog until time "to_date('2013-09-04 13:00:00','yyyy-mm-dd hh24:mi:ss')";

    8.删除后在看日志使用的空间情况
        
        SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;

 

 


--ORA-01031: 权限不足

        办法一:
        grant create table to 用户名
        
        办法二:
        grant all privileges  TO 用户名

 

        
        
        
        
        
--oracle 查看表以及注释
            SELECT t.table_name,
       t.colUMN_NAME,
       t.DATA_TYPE || '(' || t.DATA_LENGTH || ')',
t1.COMMENTS,
    'COMMENT ON COLUMN "ZYXLIUZHONG"."'|| t.table_name ||'"."'|| t.colUMN_NAME ||'" IS '''|| t1.COMMENTS ||''';' zhushi
  FROM User_Tab_Cols t, User_Col_Comments t1
WHERE t.table_name = t1.table_name
    AND t.column_name = t1.column_name;
    
    
    
    
--ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询

以sysdba身份登录,然后
select open_mode from v$database;
然后
alter database open;
看看是什么错误信息
    
    
    


--oracle 查询数据库各表数据大小

select SEGMENT_NAME,BYTES from dba_segments
where segment_type='TABLE' and OWNER='ZYXLIUZHONG' ORDER BY BYTES desc;

 

 


--显示客户端信息的sql
select sid,serial#,username,program,machine,client_info
from v$session
where username is not null order by username,program,machine;

 


--小数点保留2位小数
        round(_data,2)
        
        
        
--oracle日期:

    TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS AM DY') --2009-01-06 15:01:15 下午 星期二
    
    
    select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss')    from dual
    
    
--根据某个字段的大小去获取另一个字段的数据

    select
        min(f.SHTNAME) keep (dense_rank first order by f.SHTSTARTTIME) SHTNAME
    From SCHOOLCALENDAR e,SCHOOLHALFTERM f
    where e.SCCID=f.SCCID and f.SHTNAME like '%学期%' and e.SCCYEAR='$sccyear$'
    
    
--oracle字符串替换

    replace(FDNAME,'k','m')
    
    
-- Oracle 大小写转换函数

    小写转大写UPPER
    大写转小写LOWER
    
    select lower(ename) from emp;  
    select upper(ename) from emp;

    
--查询某个字段不为数字的数据

    select * from RESULTSSUMMARY where not REGEXP_LIKE(RSZGTZF, '^[0-9]+\.{0,1}[0-9]*$');

    
    
    
    
--Listener refused the connection with the following error:ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
用记事本打开listener.ora
里面加一段
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = X:\app\Administrator\product\11.1.0\db_1)
(SID_NAME = orcl)
)

 

 

转载于:https://my.oschina.net/FourierSeriesNzh/blog/1927440

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值