Select sess.sid,-- Sid
sess.serial#, -- Serial
lo.oracle_username,-- 登录的账号
lo.os_user_name,-- 登录的电脑
ao.object_name,-- 被锁的表名
lo.locked_mode -- 锁住级别from v$locked_object lo,dba_objects ao,v$session sess
where ao.object_id=lo.object_id and
lo.session_id=sess.sid;
3.2 杀掉锁表进程
alter system killsession'68,51';--分别为SID和SERIAL#号
3.3 查看数据库引起锁表的SQL语句
SELECT A.USERNAME,
A.MACHINE,
A.PROGRAM,
A.SID,
A.SERIAL#,
A.STATUS,
C.PIECE,
C.SQL_TEXT
FROM V$SESSION A, V$SQLTEXT C
WHERE A.SID IN(SELECTDISTINCT T2.SID
FROM V$LOCKED_OBJECT T1, V$SESSION T2
WHERE T1.SESSION_ID = T2.SID)AND A.SQL_ADDRESS = C.ADDRESS(+)ORDERBY C.PIECE;
4. Oracle中循环(Goto、For、While、Loop)
4.1 Oracle中的GOTO用法
DECLARE
x number;BEGIN
x :=9;<<repeat_loop>>-- 设置循环点
x := x -1;
DBMS_OUTPUT.PUT_LINE(X);IF X >0THENGOTO repeat_loop;--当x的值小于9时, 就goto到repeat_loopENDIF;END;
4.2 Oracle中的For循环用法
-- 循环输出数值 递增循环beginfor i in1..100loop
sys.dbms_output.put_line(i);endloop;end;-- 倒序循环DECLARE
X number;-- 变量BEGIN
x :=1;-- 初始值FOR X IN REVERSE 1..10LOOP-- reverse由大到小
DBMS_OUTPUT.PUT_LINE('内:x='|| x);ENDLOOP;
DBMS_OUTPUT.PUT_LINE('end loop:x='|| X);-- x=1END;-- 实例0 -- 直接循环Select的结果集 cur_row为游标子项 (更多的时候,表是动态表, 所以这句声明也可以省略)beginfor cur_row in(select user_id, username, created from all_users)loop
sys.dbms_output.put_line(cur_row.username);endloop;end;-- 实例1 declarecursor myCur isselect*from hr.jobs;-- 游标子项 这句声明也可以省略
oneRow hr.jobs%rowtype;beginfor oneRow in myCur loop
dbms_output.put_line(oneRow.job_id ||' '||onerow.job_title);endloop;end;-- 实例2 : 双重For循环实例,结合游标遍历,供使用参考:createorreplaceprocedure test_procedure is--a表游标定义cursor a_cursor isselect substr(mc,0,2)as str ,mc as mcs from t_bz_zd_xzqh_jc;--b表游标定义cursor b_cursor(str1 string)isSELECT bm FROM t_bz_zd_xzqh where mc like'%'|| str1 ||'%';-- instr(mc, str1) > 0;beginfor a_cur in a_cursor loopfor b_cur in b_cursor(a_cur.str)loop--这里是你要执行的操作,比如insert到c--insert into c values (b_cur.id);update t_bz_zd_xzqh_jc set bh= b_cur.bm where mc = a_cur.mcs ;commit;endloop;endloop;end;
4.3 Oracle中的While循环用法
DECLARE
x number;BEGIN
x :=0;WHILE x <9LOOP
x := x +1;
DBMS_OUTPUT.PUT_LINE('内:x='|| x);ENDLOOP;
DBMS_OUTPUT.PUT_LINE('外:x='|| x);END;-- 实例declarecursor myCur isselect*from hr.jobs;
oneRow hr.jobs%rowtype;beginopen myCur;fetch myCur into oneRow;while(myCur%found)loop
dbms_output.put_line(oneRow.job_id ||' '||onerow.job_title);fetch myCur into oneRow;endloop;close myCur;end;
4.4 Oracle中的LOOP循环用法
DECLARE
x number;BEGIN
x :=0;LOOP
x := x +1;EXITWHEN x >9;-- 满足条件时退出
DBMS_OUTPUT.PUT_LINE('内:x='|| x);ENDLOOP;
DBMS_OUTPUT.PUT_LINE('外:x='|| x);END;-- 实例:declarecursor myCur isselect*from hr.jobs;
oneRow hr.jobs%rowtype;beginopen myCur;loopfetch myCur into oneRow;
dbms_output.put_line(oneRow.job_id ||' '||onerow.job_title);exitwhen myCur%notFound;endloop;close myCur;end;
5. Oracle中常用或常见的使用
5.1 Oracle触发器中ORA-04091报错–自治事务
CREATEORREPLACETrigger Pdm_wfproc_gjy
AfterInsertOrUpdateOn Cpcwfproc
For Each Rowwhen(new.procid =1and new.stat =7)--分开事务了最好加上条件,确保前置数据拥有 declare
Pragma autonomous_transaction;----这段可以确保触发器表与下面查询语句表分开事务
x_wftempid Integer;Begin---raise_application_error(-20000,'wfid='||:new.wfid);select w.wftempid into x_wftempid from cpcwf w where w.wfid = :new.wfid;--不加条件在当前场景就报错了if x_wftempid in(135,134,133,27)thenupdate yfps_cache_trigger t
set(t.aendtime, t.endtime, t.period, t.aendtime2, t.sylb)=(Select C2.Aendtime as aendtime,
C2.Aendtime Endtime,
To_Number(Round(C2.Aperiod /8,2)) Period,
C2.Aendtime Aendtime2,
Decode(w.Wftempid,27,'量产',135,'单独送样',134,'二次送样流程',133,'首次送样流程',
w.Wftempid) Sylb
From User_Yryskfpfd a, Cpcshtins s, Cpcwfproc c2, Cpcwf w
Where s.Shtinsid = a.Shtinsid
And s.Visible =2And C2.Wfid = s.Wfid
And C2.Stat =7And C2.Procid =18And a.Yfy <>'admin'and s.wfid = :new.wfid)whereexists(select1from Cpcshtins s where s.wfid = :new.wfid and s.shtinsid = t.shtinsid);commit;-- ***这句是必须了,不然又有新的报错了***
5.2 Oracle中%TYPE和%ROWTYPE的使用
5.2.1 %TYPE
DECLARE
V_ORG_NAME SF_ORG.ORG_NAME%TYPE;--与ORG_NAME类型相同
V_PARENT_ID SF_ORG.PARENT_ID%TYPE;--与PARENT_ID类型相同 BEGINSELECT ORG_NAME,PARENT_ID
INTO V_ORG_NAME,V_PARENT_ID
FROM SF_ORG SO
WHERE SO.ORG_ID=&ORG_ID;
DBMS_OUTPUT.PUT_LINE('部门名称:'|| V_ORG_NAME);
DBMS_OUTPUT.PUT_LINE('上级部门编码:'|| TO_CHAR(V_PARENT_ID));END;
5.2.2 %RowType
DECLARE
V_SF_ORG_REC SF_ORG%ROWTYPE;--与SF_ORG表中的各个列相同 BEGIN-- 获取整行的数据,具体字段值,通过 V_SF_ORG_REC.字段名 即可获取SELECT*INTO V_SF_ORG_REC
FROM SF_ORG SO
WHERE SO.ORG_ID=&ORG_ID;
DBMS_OUTPUT.PUT_LINE('部门ID:'|| TO_CHAR(V_SF_ORG_REC.ORG_ID));
DBMS_OUTPUT.PUT_LINE('部门名称:'|| V_SF_ORG_REC.ORG_NAME);
DBMS_OUTPUT.PUT_LINE('上级部门编码:'|| TO_CHAR(V_SF_ORG_REC.PARENT_ID));END;
update TableA
set TableA.no=(select TableB.nofrom TableB
where TableA.id=TableB.id)Where TableA.XXXXXXXX
5.6 Oracle取得分组后最大值的整行记录
-- 方法一select t1.a,t1.b,t1.c
from test t1
innerjoin(select a,max(b)as b from test groupby a) t2
on t1.a=t2.a and t1.b=t2.b
-- 方法二select*from(select t.*, row_number()over(partitionby 分组字段 orderby 排序字段 desc) rn
from tablename t )where rn=1