oracle 实用sql记录

本文详细介绍了Oracle数据库中常用的SQL操作,包括合并更新、删除重复数据、使用ROW_NUMBER()函数、检查表锁定、查询资源使用情况以及获取表约束和注释等运维相关功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

oracle 实用sql记录

目录

目录

查询

存在则更新否则插入

每组内取第一条

删除同一表中的重复数据

分组拼接文本listagg

查询被锁表和机器信息

运维

查询表是否被锁

查询Oracle正在执行的sql语句及执行该语句的用户

查看正在执行sql的发起者的发放程序

Oracle查询当前连接的用户和执行的SQL

查询oracle数据库占用资源比较大

查询oracle 表的字段约束

导出表注释

导出用户创建脚本


查询

存在则更新否则插入

merge into 被修改更新的表  table1   --目标表 可以用别名
using (SELECT *
        FROM 修改参照表 ) table2      --数据源表 可以是表、视图、子查询
on (table1.关联字段 = table2.关联字段 )   --关联条件
when matched then              --当关联条件成立时 更新,删除,插入的where部分为可选 
  --更新
  update set table1.字段1 = table2.字段1
      ,table1.字段2 = table2.字段2  
  where table1.关联字段 = table2.关联字段
--如果更新和删除同时存在,删除的条件一定要在更新的条件内,否则数据不能删除。
when not matched then      --当关联条件不成立时   
  --插入
  insert (table1.字段1
            ,table1.字段2) 
            values (
                table2.字段1
            ,table2.字段2);  

每组内取第一条

SELECT * FROM (
        SELECT
            ROW_NUMBER () OVER (
                PARTITION BY -- 要分组的字段
                ORDER BY -- 每组内要排序的字段 
            ) indexNo, -- 每组内添加序号
            tmp .* 
        FROM 要查询的表 tmp 
        WHERE tmp.id  IS NOT NULL 
    )
WHERE indexNo = 1 -- 取序号 为1的那条数据

删除同一表中的重复数据

DELETE
FROM
    需要去重的表 t1
WHERE
    rowid NOT IN (
        SELECT
            max(rowid)
        FROM
            需要去重的表 t2
        WHERE
            t1.id = t2.id
    )

分组拼接文本listagg

类似mysql 的 groupconcat()

with temp as(  
select '水果' dataeType,'苹果' dataName,2 indexNo from dual union  
select '水果' dataeType,'橘子' dataName,4 indexNo from dual union  
select '水果' dataeType,'荔枝' dataName,3 indexNo from dual union  
select '水果' dataeType,'香蕉' dataName,5 indexNo from dual union  
select '蔬菜' dataeType,'西红柿' dataName,8 indexNo from dual union  
select '蔬菜' dataeType,'黄瓜' dataName,7 indexNo from dual union  
select '动物' dataeType,'兔子' dataName,9 indexNo from dual   
)  
select dataeType,listagg(dataName,',') within GROUP (order by indexNo)  as Cities
from temp  
group by dataeType 

查询被锁表和机器信息

SELECT
    b.owner
    , b.object_name
    , a.session_id
    , a.locked_mode
FROM
    v$locked_object a
    , dba_objects b
WHERE
    b.object_id = a.object_id;
    
select l.session_id sid,
       s.serial#,
       l.locked_mode,
       l.oracle_username,
       s.user#,
       l.os_user_name,
       s.machine,
       s.terminal,
       a.sql_text,
       a.action
  from v$sqlarea a, v$session s, v$locked_object l
  where l.session_id = s.sid
  and s.prev_sql_addr = a.address
  order by sid, s.serial#;

运维

查询表是否被锁

SELECT sid
FROM v$lock
WHERE id1 = (
    SELECT object_id
    FROM user_objects
    WHERE object_Name = '要查看的表')
    AND request = 0;

查询Oracle正在执行的sql语句及执行该语句的用户

SELECT b.sid oracleID,
b.username Oracle用户,
b.serial#,
spid 操作系统ID,
paddr,
sql_text 正在执行的SQL,
b.machine 计算机名
FROM v$process a, v$session b, v$sqlarea c
WHERE a.addr = b.paddr
AND b.sql_hash_value = c.hash_value;

查看正在执行sql的发起者的发放程序

SELECT A.serial#,OSUSER 电脑登录身份,
PROGRAM 发起请求的程序,
USERNAME 登录系统的用户名,
SCHEMANAME,
B.Cpu_Time 花费cpu的时间,
STATUS,
B.SQL_TEXT 执行的sql
FROM V$SESSION A
LEFT JOIN V$SQL B ON A.SQL_ADDRESS = B.ADDRESS
AND A.SQL_HASH_VALUE = B.HASH_VALUE
ORDER BY b.cpu_time DESC

Oracle查询当前连接的用户和执行的SQL

SELECT
    'alter system kill session ''' || SE.sid || ',' || SE.serial#|| ''';' 杀掉对应执行的sql
    , SE.sid
    , SE.serial#
    , PR.spid
    , SE.STATUS
    , SUBSTR(SE.program, 1, 20) PROG
    , SUBSTR(SE.machine, 1, 30) MACH
    , SQ.sql_text
FROM
    v$SESSION SE
    , v$sqlarea SQ
    , v$process PR
WHERE
    SE.paddr = PR.ADDR (+)
    AND SE.sql_address = SQ.address (+)
    AND schemaname <> 'SYS'
ORDER BY
    SE.sid;

查询oracle数据库占用资源比较大

Select b.USERNAME,
b.SID,
a.SQL_ID,
a.SQL_TEXT,
a.sql_fulltext,
b.EVENT,
a.executions,
trunc(((decode(a.EXECUTIONS,0,0,a.cpu_time / a.executions)) / 10000)) c_time, ---单位零点秒
trunc(((decode(a.EXECUTIONS,0,0,a.ELAPSED_TIME / a.executions)) / 10000)) e_time,
trunc(cpu_time/10000) cpu_time,
trunc(a.ELAPSED_TIME/10000) ELAPSED_TIME ,
a.DISK_READS,
a.BUFFER_GETS,
b.MACHINE,
b.PROGRAM
From v$sqlarea a, v$session b
Where executions > =0
And b.status = 'ACTIVE'
and a.SQL_ID = b.SQL_ID
-- and b.USERNAME='DB_WTDZ'
 and trunc(((a.cpu_time / a.executions) / 1000000))>5

查询oracle 表的字段约束

select * from user_constraints where table_name='要查询的表';

导出表注释

SELECT
    'comment on column '||table_name|| '.'|| column_name|| ' is '|| ''''||comments||''';'
    ,table_name
    ,column_name
    ,comments
FROM
    user_col_comments
WHERE
    table_name = '要查询的表名'
--    AND owner = 'xxxx'

导出用户创建脚本

SELECT
    'create user ' || username || ' identified by  ''change to your password'' default tablespace ' || DEFAULT_TABLESPACE || '  TEMPORARY TABLESPACE ' || TEMPORARY_TABLESPACE || ';'
FROM
    dba_users
WHERE
    username NOT IN (
        'SYS', 'SYSTEM', 'SCOTT', 'DBSNMP', 'CWKLP', 'OA', 'OA88'
    ) ;

查询未提交等待

SELECT
    *
FROM
    (
        SELECT
            a.inst_id
            , a.sid
            , a.serial#
            , a.sql_id
            , a.event
            , a.status
            , connect_by_isleaf AS isleaf
            , sys_connect_by_path(SID, '<-') tree
            , LEVEL AS tree_level
        FROM
            gv$session a
        START WITH
            a.blocking_session IS NOT NULL
        CONNECT BY
            nocycle a.sid = PRIOR a.blocking_session
    )
WHERE
    isleaf = 1
ORDER BY
    tree_level ASC; 


SELECT
    DISTINCT s1.inst_id AS blocking_inst_id
    , s1.username AS blocking_username
    , s1.machine AS blocking_machine
    , s1.module AS blocking_module
    , s1.sid AS blocking_sid
    , s1.audsid AS blocking_audsid
    , s1.serial# AS blocking_serial#
    , c1.sql_text AS blocking_sql_text
    , s1.status AS blocking_staus
    , s1.event AS blocking_event
    , s2.inst_id AS waiting_inst_id
    , s2.username AS waiting_username
    , s2.machine waiting_machine
    , s2.module AS waiting_module
    , s2.sid AS waiting_sid
    , s2.audsid AS waiting_audsid
    , s2.serial# AS waiting_serial#
    , c2.sql_text AS waiting_sql_text
    , s2.status AS blocking_staus
    , s2.event AS waiting_event
FROM
    gv$lock l1
    , gv$session s1
    , gv$lock l2
    , gv$session s2
    , gv$sqlarea c1
    , gv$sqlarea c2
    , gv$process b1
    , gv$process b2
WHERE
    s1.sid = l1.sid
    AND s2.sid = l2.sid
    AND s1.inst_id = l1.inst_id
    AND s2.inst_id = l2.inst_id
    AND s1.paddr = b1.addr
    AND s2.paddr = b2.addr
    AND c1.SQL_ID = s1.PREV_SQL_ID
    AND s2.sql_hash_value = c2.hash_value
    AND l1.block > 0
    AND l2.request > 0
    AND l1.id1 = l2.id1
    AND l1.id2 = l2.id2
UNION
SELECT
    DISTINCT s1.inst_id AS blocking_inst_id
    , s1.username AS blocking_username
    , s1.machine AS blocking_machine
    , s1.module AS blocking_module
    , s1.sid AS blocking_sid
    , s1.audsid AS blocking_audsid
    , s1.serial# AS blocking_serial#
    , c1.sql_text AS blocking_sql_text
    , s1.status AS blocking_staus
    , s1.event AS blocking_event
    , s2.inst_id AS waiting_inst_id
    , s2.username AS waiting_username
    , s2.machine waiting_machine
    , s2.module AS waiting_module
    , s2.sid AS waiting_sid
    , s2.audsid AS waiting_audsid
    , s2.serial# AS waiting_serial#
    , c2.sql_text AS waiting_sql_text
    , s2.status AS blocking_staus
    , s2.event AS waiting_event
FROM
    gv$lock l1
    , gv$session s1
    , gv$lock l2
    , gv$session s2
    , gv$sqlarea c1
    , gv$sqlarea c2
    , gv$process b1
    , gv$process b2
WHERE
    s1.sid = l1.sid
    AND s2.sid = l2.sid
    AND s1.inst_id = l1.inst_id
    AND s2.inst_id = l2.inst_id
    AND s1.paddr = b1.addr
    AND s2.paddr = b2.addr
    AND c1.hash_value = s1.sql_hash_value
    AND c1.address = s1.sql_address
    AND s2.sql_hash_value = c2.hash_value
    AND l1.block > 0
    AND l2.request > 0
    AND l1.id1 = l2.id1
    AND l1.id2 = l2.id2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值