SQL> select * from test; ID ---------- 1 2 首先我刷新shared pool SQL> alter system flush shared_pool; System altered. 做几个查询操作: SQL> select * from test where id=1; ID ---------- 1 SQL> select * from test where id=2; ID ---------- 2 SQL> select * from test where id=4; no rows selected SQL> select * from test where id=‘1‘; ID ---------- 1 SQL> select * from test where id=‘2‘; ID ---------- 2 SQL> var v_id number SQL> exec :v_id := 1 PL/SQL procedure successfully completed. SQL> select * from test where id=:v_id; ID ---------- 1 SQL> exec :v_id:=2 PL/SQL procedure successfully completed. SQL> select * from test where id=:v_id; ID ---------- 2 查看v$sql中的sql语句: SQL> col sql_text format a40 SQL> set numwidth 30 SQL> select sql_text,FORCE_MATCHING_SIGNATURE,EXACT_MATCHING_SIGNATURE FROM V$SQL WHERE sql_text like ‘%select * from test%‘; SQL_TEXT FORCE_MATCHING_SIGNATURE EXACT_MATCHING_SIGNATURE ---------------------------------------- ------------------------------ ------------------------------ select * from test where id=4 15142173931344982766 9756054619608722298 select * from test where id=2 15142173931344982766 3132555961613213627 select * from test where id=‘1‘ 15142173931344982766 13165047151983476077 SQL_TEXT FORCE_MATCHING_SIGNATURE EXACT_MATCHING_SIGNATURE ---------------------------------------- ------------------------------ ------------------------------ select * from test where id=‘2‘ 15142173931344982766 9000319709726737374 select * from test where id=:v_id 14699597912112598920 14699597912112598920 select * from test where id=1 15142173931344982766 10881582965512961005 8 rows selected. |
[oracle@rac1 ~]$ more find_literal.sql set serveroutput on set linesize 120 -- -- This anonymous PL/SQL block must be executed as INTERNAL or SYS -- Execute from : SQL*PLUS -- CAUTION: -- This sample program has been tested on Oracle Server - Enterprise Edition -- However, there is no guarantee of effectiveness because of the possibility -- of error in transmitting or implementing it. It is meant to be used as a -- template, and it may require modification. -- declare b_myadr VARCHAR2(20); b_myadr1 VARCHAR2(20); qstring VARCHAR2(100); b_anybind NUMBER; cursor my_statement is select address from v$sql group by address; cursor getsqlcode is select substr(sql_text,1,60) from v$sql where address = b_myadr; cursor kglcur is select kglhdadr from x$kglcursor where kglhdpar = b_myadr and kglhdpar != kglhdadr and kglobt09 = 0; cursor isthisliteral is select kkscbndt from x$kksbv where kglhdadr = b_myadr1; begin dbms_output.enable(10000000); open my_statement; loop Fetch my_statement into b_myadr; open kglcur; fetch kglcur into b_myadr1; if kglcur%FOUND Then open isthisliteral; fetch isthisliteral into b_anybind; if isthisliteral%NOTFOUND Then open getsqlcode; fetch getsqlcode into qstring; dbms_output.put_line(‘Literal:‘||qstring||‘ address: ‘||b_myadr); close getsqlcode; end if; close isthisliteral; end if; close kglcur; Exit When my_statement%NOTFOUND; End loop; close my_statement; end; / |
原文:http://blog.itpub.net/23732248/viewspace-1466831/