環(huán)境
oracle 數(shù)據(jù)庫
問題
在執(zhí)行存儲過程的時(shí)候崎页,存儲過程中的insert語句一直在執(zhí)行,且不結(jié)束腰埂。新開一個(gè)sql窗口單獨(dú)把insert語句拉出來飒焦,并執(zhí)行,執(zhí)行僅需要1秒鐘屿笼。
解決思路
- 筆者首先確定一下是不是因?yàn)殒i表導(dǎo)致的問題牺荠,執(zhí)行sql如下
select t2.username,
t2.sid,
t2.serial#,
t3.object_name,
t2.OSUSER,
t2.MACHINE,
t2.PROGRAM,
t2.LOGON_TIME,
t2.COMMAND,
t2.LOCKWAIT,
t2.SADDR,
t2.PADDR,
t2.TADDR,
t2.SQL_ADDRESS,
t1.LOCKED_MODE
from v$locked_object t1, v$session t2, dba_objects t3
where t1.session_id = t2.sid
and t1.object_id = t3.object_id
order by t2.logon_time;
發(fā)現(xiàn)在鎖的表中并無我需要insert的表,也就是說明表未鎖驴一。
附贈解除數(shù)據(jù)庫鎖表的sql如下:
alter system kill session 'sid,seial#';
- 以為是insert的執(zhí)行時(shí)間問題休雌,畢竟因?yàn)闃I(yè)務(wù)需求,有好幾個(gè)表需要用到左關(guān)聯(lián)肝断,把這個(gè)insert 語句單獨(dú)拉出來杈曲,將里面的變量名更改為實(shí)際的數(shù)量,結(jié)果神奇的事情發(fā)生了胸懈,執(zhí)行這個(gè)sql僅用了1秒的時(shí)間鱼蝉,
排除數(shù)據(jù)量大導(dǎo)致insert慢的問題. - 在反復(fù)的實(shí)驗(yàn)當(dāng)中,發(fā)現(xiàn)每當(dāng)存儲過程debug模式下單步執(zhí)行到insert的時(shí)候箫荡,執(zhí)行時(shí)間很長魁亦,如果中斷存儲過程,數(shù)據(jù)庫就會報(bào)出ORA-06512:字符串緩沖區(qū)太小的錯誤羔挡,上網(wǎng)去查詢洁奈,發(fā)現(xiàn)是變量聲明的問題,存儲過程中正確的變量聲明方式為:【表名.字段名%type】的方式去定義绞灼,可以避免以后表字段變大時(shí)出現(xiàn)的異常問題利术。
附贈一張之前的聲明方式和修改后的聲明方式
修改前:
QQ圖片20191018095229.png
現(xiàn)在:
QQ圖片201910180952213.png
解決方案參考自:https://baijiahao.baidu.com/s?id=1617919515325580702&wfr=spider&for=pc&qq-pf-to=pcqq.group
謝謝大佬