使用remove_constants工具檢視Oracle是否使用繫結變數
這個也是Tom大神寫的工具。
下面模擬沒有繫結變數的環境,然後使用該工具檢視
建立實驗帳號
conn / as sysdba
create user edmond identified by edmond;
grant connect,resource,dba to edmond;
create table t(x int);
insert into t select rownum from dual connect by level<=10000;
create or replace procedure p1
as
l_cnt number;
begin
for i in 1 .. 10000
loop
execute immediate 'select count(*) from t where x=' || i into l_cnt;
end loop;
end;
/
在一個終端執行p1過程,開啟另一個終端執行如下指令碼:
set linesize 200;
col sql_text_wo_constants format a100;
可以看到結果如下,已經找到了沒有繫結變數的語句。
下面模擬沒有繫結變數的環境,然後使用該工具檢視
建立實驗帳號
conn / as sysdba
create user edmond identified by edmond;
grant connect,resource,dba to edmond;
create table t(x int);
insert into t select rownum from dual connect by level<=10000;
create or replace procedure p1
as
l_cnt number;
begin
for i in 1 .. 10000
loop
execute immediate 'select count(*) from t where x=' || i into l_cnt;
end loop;
end;
/
在一個終端執行p1過程,開啟另一個終端執行如下指令碼:
-
create table t1 as select sql_text from v$sqlarea;
-
-
alter table t1 add sql_text_wo_constants varchar2(1000);
-
-
create or replace function
-
remove_constants( p_query in varchar2 ) return varchar2
-
as
-
l_query long;
-
l_char varchar2(1);
-
l_in_quotes boolean default FALSE;
-
begin
-
for i in 1 .. length( p_query )
-
loop
-
l_char := substr(p_query,i,1);
-
if ( l_char = '''' and l_in_quotes )
-
then
-
l_in_quotes := FALSE;
-
elsif ( l_char = '''' and NOT l_in_quotes )
-
then
-
l_in_quotes := TRUE;
-
l_query := l_query || '''#';
-
end if;
-
if ( NOT l_in_quotes ) then
-
l_query := l_query || l_char;
-
end if;
-
end loop;
-
l_query := translate( l_query, '0123456789', '@@@@@@@@@@' );
-
for i in 0 .. 8 loop
-
l_query := replace( l_query, lpad('@',10-i,'@'), '@' );
-
l_query := replace( l_query, lpad(' ',10-i,' '), ' ' );
-
end loop;
-
return upper(l_query);
-
end;
-
/
-
update t1 set sql_text_wo_constants = remove_constants(sql_text);
set linesize 200;
col sql_text_wo_constants format a100;
-
select sql_text_wo_constants, count(*)
-
from t1
-
group by sql_text_wo_constants
-
having count(*) > 100
-
order by 2
- /
可以看到結果如下,已經找到了沒有繫結變數的語句。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1273980/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 檢視繫結變數變數
- 10g以後檢視未使用繫結變數的sql變數SQL
- 檢視未繫結變數的sql變數SQL
- PLSQL使用繫結變數SQL變數
- oracle繫結變數窺視(zt)Oracle變數
- Oracle 變數繫結與變數窺視合集Oracle變數
- 【優化】使用繫結變數 OR 不使用繫結變數,這不是問題!優化變數
- 【最佳化】使用繫結變數 OR 不使用繫結變數,這不是問題!變數
- oracle 查詢未使用繫結變數的sqlOracle變數SQL
- Oracle 繫結變數Oracle變數
- 【原創】Oracle 變數繫結與變數窺視合集Oracle變數
- 繫結變數優缺點、使用、繫結變數窺探、 Oracle自適應共享遊標變數Oracle
- 在oracle的plsql中為cursor使用繫結變數OracleSQL變數
- oracle中使用繫結變數的好處的例子Oracle變數
- SQL Developer中使用繫結變數SQLDeveloper變數
- 繫結變數的使用範圍變數
- 關於繫結變數的使用變數
- Oracle之繫結變數Oracle變數
- 使用繫結變數的一點總結!變數
- oracle bind value peeking繫結變數窺視Oracle變數
- oracle對非使用繫結變數的語句去重Oracle變數
- oracle找出沒有使用繫結變數的sql語句Oracle變數SQL
- 【sql調優】使用繫結變數(二)SQL變數
- 【sql調優】使用繫結變數(一)SQL變數
- ORACLE 繫結變數用法總結Oracle變數
- 透過v$sql_bind_capture 檢視繫結變數。SQLAPT變數
- 通過v$sql_bind_capture 檢視繫結變數。SQLAPT變數
- Oracle 繫結變數窺探Oracle變數
- oracle 繫結變數(bind variable)Oracle變數
- Oracle 繫結變數 詳解Oracle變數
- 如何在對in操作使用變數繫結(轉)變數
- 在繫結變數下使用outline變數
- PLSQL中使用繫結變數的語法SQL變數
- java程式裡怎麼使用繫結變數Java變數
- SQL使用繫結變數,測試例項。SQL變數
- 【ORACLE】Oracle繫結變數知識梳理Oracle變數
- Oracle中如何查詢未使用繫結變數的SQL語句?Oracle變數SQL
- ORACLE 獲取繫結變數值Oracle變數