SQL>alter session set cursor_sharing=force; Session altered. SQL>drop table t; Table dropped. SQL>create table t(a number); Table created. SQL> SQL>create or replace procedure denis_proc(a in number) 2 is 3 begin 4 insert into t values(a); 5 commit; 6 end; 7 / Procedure created. SQL> SQL>exec denis_proc(1); PL/SQL procedure successfully completed. SQL>exec denis_proc(2); PL/SQL procedure successfully completed. SQL>exec denis_proc(3); PL/SQL procedure successfully completed. SQL>call denis_proc(4); Call completed. SQL>call denis_proc(5); Call completed. SQL>call denis_proc(6); Call completed. SQL> SQL>col sql_text format a30 SQL> SQL>select sql_id, executions, sql_text from v$sqlarea where sql_text like '%denis_proc%'; SQL_ID1G EXECUTIONS SQL_TEXT ------------- ---------- ------------------------------ 1ms5rkrgwt28v 1 BEGIN denis_proc(1); END; 0vcasv51bxgpv 1 BEGIN denis_proc(3); END; dcna79fxryrkx 1 BEGIN denis_proc(2); END; 6skbuvu6fb9k0 3 call denis_proc(:"SYS_B_0") SQL> SQL>select * from t; A ---------- 1 2 3 4 5 6 6 rows selected. SQL>
Monday, August 16, 2010
CURSOR_SHARING and PL/SQL procedure
With cursor_sharing=FORCE, in most cases, Oracle will replace literal values with bind variables, however,this is not the case for PL/SQL blocks. See the following test case. When using CALL proc_name(), it can. This behavior is mentioned in Jonathen Lewis's book "Cost-based Oracle Fundamentals" p159.
Tuesday, August 03, 2010
Effect of a SQL* Plus environment variable: set pagesize 0
Last night, I troubleshooted a ksh shell script, in which a variable is assigned a value that is returned from SQL* Plus commands. I found that without 'set pagesize 0', the value returned had an undesirable leading space. Below is a test case that demonstrate this effect.
SQL> select col1, col3 from t; COL1 C ---------- - 1 Y $ cat test3.sh #!/bin/ksh RET1=` sqlplus -s / << EOF set echo off head off feed off verify off term off select col3 from t where col1=1; EOF ` echo "RET1 >>>>"$RET1"<<<<" if [[ $RET1 == 'Y' ]]; then echo "Yes" else echo "No" fi RET2=` sqlplus -s / << EOF set echo off head off feed off verify off term off set pagesize 0 select col3 from t where col1=1; EOF ` echo "RET2 >>>>"$RET2"<<<<" if [[ $RET2 == 'Y' ]]; then echo "Yes" else echo "No" fi $ ./test3.sh RET1 >>>> Y<<<< No RET2 >>>>Y<<<< Yes
Subscribe to:
Posts (Atom)