bind variables in pl/sql static
Hello world.This feature will be works faster than the function below without binding? (I mean if he calls very often, and execution plan is in cache)
FUNCTION get_amployee_name (empid INTEGER, empcity VARCHAR2) RETURN VARCHAR2 IS
TYPE GenericCursor IS REF CURSOR;
c1 GenericCursor;
empname VARCHAR2(200);
BEGIN
OPEN c1 FOR SELECT ename FROM employees WHERE id = :id AND city = :city USING empid, empcity;
FETCH c1 INTO empname;
CLOSE c1;
RETURN empname;
END;
FUNCTION get_amployee_name (empid INTEGER, empcity VARCHAR2) RETURN VARCHAR2 IS
empname VARCHAR2(200);
BEGIN
SELECT ename into empname FROM employees WHERE id = empid AND city = empcity;
RETURN empname;
END;
I tried to find info related to the execution of pl/sql query steps, but cannot. Optimizer does use the values of real variables in pl/sql to generate the exec. plan? Or it will be generated only once when the function performed the first time?
Reference and discusses this in Chapter 1 PL/SQL user's Guide
http://download.Oracle.com/docs/CD/B19306_01/AppDev.102/b14261/overview.htm#sthref145
"When you embed an INSERT, UPDATE, DELETE or SELECT SQL statement directly in your PL/SQL code, PL/SQL transforms the variables in the WHERE clauses of the VALUES to automatically bind variables. Oracle can re-use these SQL statement every time the same code is executed. To execute statements similar with different values of variables, you can save the analysis of overhead by calling a stored procedure that accepts parameters, and then issues the declarations with the parameters substituted in the appropriate places. »
Justin
Tags: Database
Similar Questions
-
problem with bind variables in the SQL query view object
Hi all
I use JDev 11.1.2.4.0.
I have a problem with bind variables in the SQL query view object.
This is my original SQL
SELECT sum(t.TIME) , t.legertype_id FROM LEDGER t WHERE t.nctuser_id = '20022' AND to_char(t.insertdate,'YYYYMMDD') in ('20130930','20130929') group by t.legertype_id
In my view .xml object query tab, I am writing this
SELECT sum(t.TIME) , t.legertype_id FROM LEDGER t WHERE t.nctuser_id = '20022' AND to_char(t.insertdate,'YYYYMMDD') in :dddd group by t.legertype_id
Davis here is a variable of Type liaison: String, updatable and necessary.
I try to deal with Davis as ('20130930 ', ' 20130929') hoping the view object, run as my original SQL.
But failed. The view object retrieves 0 line after that I run.
Why?
Thank you! ('2original SQL0130930', '20130929') ('20130930 ', ' 20130929')
A variable binding cannot be used as this is why you must use years table. Check decompilation binary ADF: using oracle.jbo.domain.Array with ViewCriteria to see a solution.
Timo
-
Get the bind variables name string SQL or the cursor
Hello
Is there way to get of the bind variables name string SQL or the cursor?
Example of
What I mean with the SQL string:DECLARE l_sql VARCHAR2(2000); desctab DBMS_SQL.DESC_TAB; curid PLS_INTEGER; BEGIN l_sql := 'SELECT * FROM emp WHERE mgr = :X and deptno = :Y'; curid := dbms_sql.open_cursor; dbms_sql.parse(curid, l_sql, dbms_sql.NATIVE); .... END;
I love to get using some functions from above code variable l_sql all the bind variable.
In this case the function should return array where is for example: X and: Y
Back to bind the cursor variable names, I mean same but rather string I pass number of cursor.
Y at - it sucks ready function or some may share a code customized for this purpose?
Thanks
Kind regards
Jari
http://dbswh.webhop.NET/dbswh/f?p=blog:Home:0Regards,
Published by: jarola December 19, 2011 02:44
I found there are wwv_flow_utilities.get_binds of the function not documented in APEX packages that do what I want.
Usage example
But I would not use these functions without papers as those who can change or there is no future versions APEX.set serveroutput on DECLARE binds DBMS_SQL.varchar2_table; BEGIN binds := wwv_flow_utilities.get_binds('select :P1_TEST from dual'); FOR i IN 1 .. binds.count LOOP dbms_output.put_line(binds(i)); END LOOP; END; / anonymous block completed :P1_TEST
Is there a documented function or the custom function that do the same thing as wwv_flow_utilities.get_binds?Some old basic example code of my friends. Also the media getting the bind variable of PL/SQL code blocks anon.
SQL> create or replace function GetBindVariables( statement varchar2 ) return TStrings is 2 --// bind variables names are terminated by one the following special chars 3 SPECIAL_CHAR constant TStrings := TStrings(' ',')','+','-','>','<','*',',','=',';',CHR(10),CHR(13)); 4 5 --// max size of a bind var name 6 MAX_VARSIZE constant integer := 100; 7 8 pos integer; 9 pos1 integer; 10 occur integer; 11 varName varchar2(100); 12 varList TStrings; 13 begin 14 varList := new TStrings(); 15 16 --// looking for the 1st occurance of a bind variable 17 occur := 1; 18 19 loop 20 pos := InStr( statement, ':', 1, occur ); 21 exit when pos = 0; 22 23 varName := SubStr( statement, pos, 100 ); 24 25 --// find the terminating char trailing the 26 --// bind variable name 27 pos1 := Length( varName ); 28 for i in 1..SPECIAL_CHAR.Count 29 loop 30 pos := InStr( varName, SPECIAL_CHAR(i) ) - 1; 31 if (pos > 0) and (pos < pos1) then 32 pos1 := pos; 33 end if; 34 end loop; 35 36 --// extract the actual bind var name (without 37 --// colon char prefix) 38 varName := SubStr( varName, 2, pos1-1 ); 39 40 --// maintain a unique list of var names 41 if not varName member of varList then 42 varList.Extend(1); 43 varList( varList.Count ) := varName; 44 end if; 45 46 --// look for the next occurance 47 occur := occur + 1; 48 end loop; 49 50 return( varList ); 51 end; 52 / Function created. SQL> SQL> select 2 column_value as BIND_VAR 3 from TABLE( 4 GetBindVariables('select * from foo where col=:BIND1 and day = to_date(:B2,''yyyy/mm/dd'')') 5 ); BIND_VAR ------------------------------ BIND1 B2 SQL>
PS. just realize this code is case-sensitive, while variable bind is not. Should throw a upper() or lower() by adding the name of the var to the list - never really a problem for me because I'm pretty tense when it use cases correctly in the code. ;-)
Published by: Billy Verreynne, December 19, 2011 06:19
-
Bind variables in the SQL causes slow
We have a strange problem in our PeopleSoft system that I traced to a SELECT statement using bind variables, if hardcode us them values in SQL, it runs very fast.
but using bindings (what the application does) a problem of efficiency. I'm going to re - write the code that is based on a view of three tables joined to go against
the base tables and I don't think I'll have a problem. However, I would like to know why the problem exists in the first place. Here is what info I have:
Oracle version: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
It's the 'good' application without links:
And the 'good' explains the plan:SELECT COUNT(*) FROM sysadm.PS_ERN_PROG_DESCR A WHERE A.ERN_PROGRAM = 'VT' AND A.ERNCD = '01' AND EFFDT = (SELECT MAX(B.EFFDT) FROM sysadm.PS_ERN_PROG_DESCR B WHERE B.ERN_PROGRAM = 'VT' AND B.EFFDT <= TO_DATE('2009-10-10','YYYY-MM-DD') );
Here is the 'good' autotrace:Plan hash value: 3344976101 ------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 33 | 58 (23)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 33 | | | | 2 | NESTED LOOPS | | 1 | 33 | 3 (0)| 00:00:01 | | 3 | NESTED LOOPS | | 1 | 22 | 2 (0)| 00:00:01 | |* 4 | INDEX UNIQUE SCAN | PS_ERN_PROGRAM_DEF | 1 | 12 | 1 (0)| 00:00:01 | | 5 | SORT AGGREGATE | | 1 | 9 | | | | 6 | VIEW | | 23 | 207 | 51 (26)| 00:00:01 | |* 7 | FILTER | | | | | | | 8 | SORT GROUP BY | | 23 | 1748 | 51 (26)| 00:00:01 | |* 9 | HASH JOIN | | 2995 | 222K| 49 (23)| 00:00:01 | |* 10 | TABLE ACCESS FULL | PS_EARNINGS_TBL | 1913 | 24869 | 15 (7)| 00:00:01 | |* 11 | HASH JOIN | | 13621 | 838K| 30 (20)| 00:00:01 | | 12 | TABLE ACCESS FULL | PS_EARNINGS_TBL | 1913 | 42086 | 14 (0)| 00:00:01 | |* 13 | HASH JOIN | | 3097 | 124K| 14 (29)| 00:00:01 | |* 14 | TABLE ACCESS BY INDEX ROWID| PS_ERN_PROGRAM_TBL | 9 | 207 | 2 (0)| 00:00:01 | |* 15 | INDEX RANGE SCAN | PS_ERN_PROGRAM_TBL | 18 | | 1 (0)| 00:00:01 | |* 16 | TABLE ACCESS FULL | PS_ERN_PROGRAM_DEF | 12035 | 211K| 10 (20)| 00:00:01 | |* 17 | INDEX RANGE SCAN | PS_EARNINGS_TBL | 1 | 10 | 1 (0)| 00:00:01 | | 18 | SORT AGGREGATE | | 1 | 10 | | | |* 19 | INDEX RANGE SCAN | PS_EARNINGS_TBL | 1 | 10 | 2 (0)| 00:00:01 | |* 20 | TABLE ACCESS BY INDEX ROWID | PS_ERN_PROGRAM_TBL | 1 | 11 | 1 (0)| 00:00:01 | |* 21 | INDEX UNIQUE SCAN | PS_ERN_PROGRAM_TBL | 1 | | 0 (0)| 00:00:01 | ------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("A"."ERN_PROGRAM"='VT' AND "A"."EFFDT"= (SELECT MAX("$vm_col_2") FROM (SELECT /*+ */ "EFFDT" "$vm_col_1","A"."EFFDT" "$vm_col_2" FROM SYSADM."PS_EARNINGS_TBL" "C",SYSADM."PS_ERN_PROGRAM_TBL" "B",SYSADM."PS_ERN_PROGRAM_DEF" "A",SYSADM."PS_EARNINGS_TBL" "D" WHERE "D"."EFFDT"<="A"."EFFDT" AND "D"."ERNCD"="C"."ERNCD" AND "D"."EFFDT"<=TO_DATE(' 2009-10-10 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "A"."EFFDT"="B"."EFFDT" AND "A"."ERN_PROGRAM"="B"."ERN_PROGRAM" AND "A"."ERN_PROGRAM"='VT' AND "A"."EFFDT"<=TO_DATE(' 2009-10-10 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "B"."EFFDT"<=TO_DATE(' 2009-10-10 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "B"."ERN_PROGRAM"='VT' AND "B"."EFF_STATUS"='A' AND "C"."ERNCD"="A"."ERNCD" GROUP BY "D"."ERNCD",ROWID,ROWID,ROWID,ROWID,"A"."EFFDT","EFFDT" HAVING "EFFDT"=MAX("D"."EFFDT")) "$vm_view") AND "A"."ERNCD"='01') 7 - filter("EFFDT"=MAX("D"."EFFDT")) 9 - access("D"."ERNCD"="C"."ERNCD") filter("D"."EFFDT"<="A"."EFFDT") 10 - filter("D"."EFFDT"<=TO_DATE(' 2009-10-10 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) 11 - access("C"."ERNCD"="A"."ERNCD") 13 - access("A"."ERN_PROGRAM"="B"."ERN_PROGRAM" AND "A"."EFFDT"="B"."EFFDT") 14 - filter("B"."EFF_STATUS"='A') 15 - access("B"."ERN_PROGRAM"='VT' AND "B"."EFFDT"<=TO_DATE(' 2009-10-10 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) 16 - filter("A"."ERN_PROGRAM"='VT' AND "A"."EFFDT"<=TO_DATE(' 2009-10-10 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) 17 - access("C"."ERNCD"='01') filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_EARNINGS_TBL" "D" WHERE SYS_OP_DESCEND("EFFDT") IS NOT NULL AND SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(:B1) AND "D"."ERNCD"=:B2 AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=:B3)) 19 - access("D"."ERNCD"=:B1 AND SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(:B2) AND SYS_OP_DESCEND("EFFDT") IS NOT NULL) filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=:B1) 20 - filter("B"."EFF_STATUS"='A') 21 - access("B"."ERN_PROGRAM"='VT' AND "A"."EFFDT"="B"."EFFDT")
===================================SQL> variable ppe_date varchar2(10) SQL> variable erncd varchar2(3) SQL> exec :ppe_date := '2009-10-10' SQL> exec :erncd := '01' SQL> SELECT COUNT(*) 2 FROM PS_ERN_PROG_DESCR A 3 WHERE A.ERN_PROGRAM = 'VT' 4 AND A.ERNCD = '01' 5 AND EFFDT = 6 (SELECT MAX(B.EFFDT) 7 FROM PS_ERN_PROG_DESCR B 8 WHERE B.ERN_PROGRAM = 'VT' 9 AND B.EFFDT <= TO_DATE('2009-10-10','YYYY-MM-DD') 10 ); COUNT(*) ---------- 1 Elapsed: 00:00:01.23 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=59 Card=1 Bytes=33) 1 0 SORT (AGGREGATE) 2 1 NESTED LOOPS (Cost=3 Card=1 Bytes=33) 3 2 NESTED LOOPS (Cost=2 Card=1 Bytes=22) 4 3 INDEX (UNIQUE SCAN) OF 'PS_ERN_PROGRAM_DEF' (INDEX (UNIQUE)) (Cost=1 Card=1 Bytes=12) 5 4 SORT (AGGREGATE) 6 5 VIEW (Cost=52 Card=24 Bytes=216) 7 6 FILTER 8 7 SORT (GROUP BY) (Cost=52 Card=24 Bytes=1824) 9 8 HASH JOIN (Cost=50 Card=3177 Bytes=241452) 10 9 TABLE ACCESS (FULL) OF 'PS_EARNINGS_TBL' (TABLE) (Cost=15 Card=1921 Bytes=24973) 11 9 HASH JOIN (Cost=31 Card=14488 Bytes=912744) 12 11 TABLE ACCESS (FULL) OF 'PS_EARNINGS_TBL' (TABLE) (Cost=14 Card=1921 Bytes=42262) 13 11 HASH JOIN (Cost=15 Card=3303 Bytes=135423) 14 13 TABLE ACCESS (FULL) OF 'PS_ERN_PROGRAM_TBL' (TABLE) (Cost=2 Card=9 Bytes=207) 15 13 TABLE ACCESS (FULL) OF 'PS_ERN_PROGRAM_DEF' (TABLE) (Cost=12 Card=12856 Bytes=231408) 16 3 INDEX (RANGE SCAN) OF 'PS_EARNINGS_TBL' (INDEX (UNIQUE)) (Cost=1 Card=1 Bytes=10) 17 16 SORT (AGGREGATE) 18 17 INDEX (RANGE SCAN) OF 'PS_EARNINGS_TBL' (INDEX (UNIQUE)) (Cost=2 Card=1 Bytes=10) 19 2 TABLE ACCESS (BY INDEX ROWID) OF 'PS_ERN_PROGRAM_TBL' (TABLE) (Cost=1 Card=1 Bytes=11) 20 19 INDEX (UNIQUE SCAN) OF 'PS_ERN_PROGRAM_TBL' (INDEX (UNIQUE)) (Cost=0 Card=1) Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 182 consistent gets 0 physical reads 0 redo size 232 bytes sent via SQL*Net to client 278 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed SQL> spool off
This is the 'bad' query using bindings:
===================================
The 'bad' explain planSELECT COUNT(*) FROM sysadm.PS_ERN_PROG_DESCR A WHERE A.ERN_PROGRAM = 'VT' AND A.ERNCD = :erncd AND EFFDT = (SELECT MAX(B.EFFDT) FROM sysadm.PS_ERN_PROG_DESCR B WHERE B.ERN_PROGRAM = 'VT' AND B.EFFDT <= TO_DATE(:ppe_date,'YYYY-MM-DD') );
Here's the bad autotrace:explain plan succeeded. PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Plan hash value: 337039962 -------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 33 | 20 (25)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 33 | | | | 2 | NESTED LOOPS | | 1 | 33 | 3 (0)| 00:00:01 | | 3 | NESTED LOOPS | | 1 | 22 | 2 (0)| 00:00:01 | |* 4 | INDEX UNIQUE SCAN | PS_ERN_PROGRAM_DEF | 1 | 12 | 1 (0)| 00:00:01 | | 5 | SORT AGGREGATE | | 1 | 63 | | | | 6 | NESTED LOOPS | | 1 | 63 | 13 (39)| 00:00:01 | | 7 | NESTED LOOPS | | 1 | 52 | 12 (42)| 00:00:01 | |* 8 | HASH JOIN | | 4 | 168 | 12 (42)| 00:00:01 | | 9 | VIEW | VW_SQ_1 | 88 | 2112 | 9 (45)| 00:00:01 | | 10 | SORT GROUP BY | | 88 | 2728 | 9 (45)| 00:00:01 | | 11 | MERGE JOIN | | 3087 | 95697 | 7 (29)| 00:00:01 | | 12 | SORT JOIN | | 643 | 11574 | 2 (0)| 00:00:01 | |* 13 | INDEX RANGE SCAN | PS_ERN_PROGRAM_DEF | 643 | 11574 | 2 (0)| 00:00:01 | |* 14 | SORT JOIN | | 96 | 1248 | 5 (40)| 00:00:01 | |* 15 | INDEX FAST FULL SCAN | PS_EARNINGS_TBL | 96 | 1248 | 4 (25)| 00:00:01 | |* 16 | INDEX RANGE SCAN | PS_ERN_PROGRAM_DEF | 643 | 11574 | 2 (0)| 00:00:01 | |* 17 | INDEX UNIQUE SCAN | PS_EARNINGS_TBL | 1 | 10 | 0 (0)| 00:00:01 | |* 18 | TABLE ACCESS BY INDEX ROWID| PS_ERN_PROGRAM_TBL | 1 | 11 | 1 (0)| 00:00:01 | |* 19 | INDEX UNIQUE SCAN | PS_ERN_PROGRAM_TBL | 1 | | 0 (0)| 00:00:01 | |* 20 | INDEX RANGE SCAN | PS_EARNINGS_TBL | 1 | 10 | 1 (0)| 00:00:01 | | 21 | SORT AGGREGATE | | 1 | 10 | | | |* 22 | INDEX RANGE SCAN | PS_EARNINGS_TBL | 1 | 10 | 2 (0)| 00:00:01 | |* 23 | TABLE ACCESS BY INDEX ROWID | PS_ERN_PROGRAM_TBL | 1 | 11 | 1 (0)| 00:00:01 | |* 24 | INDEX UNIQUE SCAN | PS_ERN_PROGRAM_TBL | 1 | | 0 (0)| 00:00:01 | -------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("A"."ERN_PROGRAM"='VT' AND "A"."EFFDT"= (SELECT MAX("A"."EFFDT") FROM SYSADM."PS_EARNINGS_TBL" "C",SYSADM."PS_ERN_PROGRAM_TBL" "B",SYSADM."PS_ERN_PROGRAM_DEF" "A", (SELECT MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) "VW_COL_1","D"."ERNCD" "ERNCD",ROWID "ROWID" FROM SYSADM."PS_EARNINGS_TBL" "D","PS_ERN_PROGRAM_DEF" "A" WHERE "A"."EFFDT"<=TO_DATE(:PPE_DATE,'YYYY-MM-DD') AND "A"."ERN_PROGRAM"='VT' AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=INTERNAL_FUNCTION("A"."EFFDT") AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(:PPE_DATE,'YYYY-MM-DD') GROUP BY "D"."ERNCD",ROWID) "VW_SQ_1" WHERE "ROWID"=ROWID AND "A"."EFFDT"<=TO_DATE(:PPE_DATE,'YYYY-MM-DD') AND "A"."ERN_PROGRAM"='VT' AND "A"."EFFDT"="B"."EFFDT" AND "B"."ERN_PROGRAM"='VT' AND "B"."EFF_STATUS"='A' AND "B"."EFFDT"<=TO_DATE(:PPE_DATE,'YYYY-MM-DD') AND SYS_OP_DESCEND("EFFDT")=SYS_OP_DESCEND("VW_COL_1") AND "ERNCD"="C"."ERNCD" AND "C"."ERNCD"="A"."ERNCD" AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))="VW_COL_1") AND "A"."ERNCD"=:ERNCD) 8 - access("ROWID"=ROWID) 13 - access("A"."ERN_PROGRAM"='VT' AND "A"."EFFDT"<=TO_DATE(:PPE_DATE,'YYYY-MM-DD')) 14 - access(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=INTERNAL_FUNCTION("A"."EFFDT")) filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=INTERNAL_FUNCTION("A"."EFFDT")) 15 - filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=TO_DATE(:PPE_DATE,'YYYY-MM-DD')) 16 - access("A"."ERN_PROGRAM"='VT' AND "A"."EFFDT"<=TO_DATE(:PPE_DATE,'YYYY-MM-DD')) 17 - access("ERNCD"="C"."ERNCD" AND SYS_OP_DESCEND("EFFDT")=SYS_OP_DESCEND("VW_COL_1")) filter("C"."ERNCD"="A"."ERNCD" AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))="VW_COL_1") 18 - filter("B"."EFF_STATUS"='A') 19 - access("B"."ERN_PROGRAM"='VT' AND "A"."EFFDT"="B"."EFFDT") filter("B"."EFFDT"<=TO_DATE(:PPE_DATE,'YYYY-MM-DD')) 20 - access("C"."ERNCD"=:ERNCD) filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))= (SELECT MAX(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))) FROM SYSADM."PS_EARNINGS_TBL" "D" WHERE SYS_OP_DESCEND("EFFDT") IS NOT NULL AND SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(:B1) AND "D"."ERNCD"=:B2 AND SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=:B3)) 22 - access("D"."ERNCD"=:B1 AND SYS_OP_DESCEND("EFFDT")>=SYS_OP_DESCEND(:B2) AND SYS_OP_DESCEND("EFFDT") IS NOT NULL) filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("EFFDT"))<=:B1) 23 - filter("B"."EFF_STATUS"='A') 24 - access("B"."ERN_PROGRAM"='VT' AND "A"."EFFDT"="B"."EFFDT")
SQL> variable ppe_date varchar2(10) SQL> variable erncd varchar2(3) SQL> exec :ppe_date := '2009-10-10' SQL> exec :erncd := '01' SQL> SELECT COUNT(*) 2 FROM PS_ERN_PROG_DESCR A 3 WHERE A.ERN_PROGRAM = 'VT' 4 AND A.ERNCD = :erncd 5 AND EFFDT = 6 (SELECT MAX(B.EFFDT) 7 FROM PS_ERN_PROG_DESCR B 8 WHERE B.ERN_PROGRAM = 'VT' 9 AND B.EFFDT <= TO_DATE(:ppe_date,'YYYY-MM-DD') 10 ); COUNT(*) ---------- 1 Elapsed: 00:04:07.40 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=20 Card=1 Bytes=33) 1 0 SORT (AGGREGATE) 2 1 NESTED LOOPS (Cost=3 Card=1 Bytes=33) 3 2 NESTED LOOPS (Cost=2 Card=1 Bytes=22) 4 3 INDEX (UNIQUE SCAN) OF 'PS_ERN_PROGRAM_DEF' (INDEX (UNIQUE)) (Cost=1 Card=1 Bytes=12) 5 4 SORT (AGGREGATE) 6 5 NESTED LOOPS (Cost=13 Card=1 Bytes=63) 7 6 NESTED LOOPS (Cost=12 Card=1 Bytes=52) 8 7 HASH JOIN (Cost=12 Card=4 Bytes=168) 9 8 VIEW OF 'VW_SQ_1' (VIEW) (Cost=9 Card=88 Bytes=2112) 10 9 SORT (GROUP BY) (Cost=9 Card=88 Bytes=2728) 11 10 MERGE JOIN (Cost=7 Card=3087 Bytes=95697) 12 11 SORT (JOIN) (Cost=2 Card=643 Bytes=11574) 13 12 INDEX (RANGE SCAN) OF 'PS_ERN_PROGRAM_DEF' (INDEX (UNIQUE)) (Cost=2 Card=643 Bytes=11574) 14 11 SORT (JOIN) (Cost=5 Card=96 Bytes=1248) 15 14 INDEX (FAST FULL SCAN) OF 'PS_EARNINGS_TBL' (INDEX (UNIQUE)) (Cost=4 Card=96 Bytes=1248) 16 8 INDEX (RANGE SCAN) OF 'PS_ERN_PROGRAM_DEF' (INDEX (UNIQUE)) (Cost=2 Card=643 Bytes=11574) 17 7 INDEX (UNIQUE SCAN) OF 'PS_EARNINGS_TBL' (INDEX (UNIQUE)) (Cost=0 Card=1 Bytes=10) 18 6 TABLE ACCESS (BY INDEX ROWID) OF 'PS_ERN_PROGRAM_TBL' (TABLE) (Cost=1 Card=1 Bytes=11) 19 18 INDEX (UNIQUE SCAN) OF 'PS_ERN_PROGRAM_TBL' (INDEX (UNIQUE)) (Cost=0 Card=1) 20 3 INDEX (RANGE SCAN) OF 'PS_EARNINGS_TBL' (INDEX (UNIQUE)) (Cost=1 Card=1 Bytes=10) 21 20 SORT (AGGREGATE) 22 21 INDEX (RANGE SCAN) OF 'PS_EARNINGS_TBL' (INDEX (UNIQUE)) (Cost=2 Card=1 Bytes=10) 23 2 TABLE ACCESS (BY INDEX ROWID) OF 'PS_ERN_PROGRAM_TBL' (TABLE) (Cost=1 Card=1 Bytes=11) 24 23 INDEX (UNIQUE SCAN) OF 'PS_ERN_PROGRAM_TBL' (INDEX (UNIQUE)) (Cost=0 Card=1) Statistics ---------------------------------------------------------- 3820 recursive calls 66 db block gets 4677728 consistent gets 80608 physical reads 0 redo size 232 bytes sent via SQL*Net to client 278 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 2 sorts (memory) 1 sorts (disk) 1 rows processed SQL> spool off
I think you have to hit some sort of bug in the optimizer. Do you have the histograms on the EFFDT column.
-
VO with bind variable defined in SQL is not updated correctly
Hi Experts,
I have a simple question here, could you please help answer? Thank you very much!
I have 2 pages, the first page displays an employee table, the second page shows a few details to the selected employee. When to choose a single employee and click the details button I can be naviaged to the second page and see the details for the selected employee. The vo used on the second page uses a connection variable called "empId" thing for a 'adf.context.pageFlowScope.empId' pageFlowScope value, and this value pageFlowScope will be filled to the empId selected detail button actionListener during execution).
The question is, now first navigation is ok, the details of the page can display the correct information for the employee selected on the page of the employee, but when browsing back and choosing another employee, and then again click the details button, the details of the page is NOT updated, it still shows the initial information for the selected employee. I debug the actionListener in support bean and the second selected empId passed to pageFlowScope.empId, the link in the t variable should get the new value, right? But why the second page gets no updates (request using the new value of the bind variable)?
Thank you!
Published by: user774592 on July 20, 2011 23:13
Published by: user774592 on July 20, 2011 23:15
Published by: user774592 on July 20, 2011 23:15In theory, if you expose specific objects of customer to your business (for example pageflowscope) service layer, you may miss 1. test driven development assistance (case of unit test can fail) 2. Customer service of independent business etc... :)
To respond to your request try to call TargetPagesVO.execute () before the second page (by program or activity method) -
bind variables and dynamic sql
Hi all
Here's my situation:
I have a query with 2 bind variable: the FROM clause also uses a variable binding!
and the output is:PROCEDURE describe_columns(p_curr_tablename VARCHAR(50), p_curr_intentseq NUMBER) IS l_cur INTEGER; l_query VARCHAR (100); BEGIN l_query := 'select * from :table_name where ibmsnap_intentseq = :sequencenr'; l_cur := DBMS_SQL.OPEN_CURSOR; DBMS_OUTPUT.PUT_LINE (p_curr_tablename); DBMS_OUTPUT.PUT_LINE (p_curr_intentseq); DBMS_OUTPUT.PUT_LINE (l_query); DBMS_SQL.PARSE (l_cur, l_query, DBMS_SQL.V7); DBMS_SQL.bind_variable (l_cur, ':table_name', p_curr_tablename); DBMS_SQL.bind_variable (l_cur, ':sequencenr', p_curr_intentseq); DBMS_SQL.DESCRIBE_COLUMNS (l_cur, g_count, g_desc_tab); DBMS_SQL.CLOSE_CURSOR (l_cur); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line ('DF-EXCEPTION: ' || SQLERRM); DBMS_OUTPUT.put_line ( 'DF-EXCEPTION: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE ); IF DBMS_SQL.IS_OPEN (l_cur) THEN DBMS_SQL.CLOSE_CURSOR (l_cur); END IF; -- RAISE; END;
So is the problem that I want to use a variable binding for the name of the table?CD_B136V4_NEW 16 select * from :table_name where ibmsnap_intentseq = :intentseq DF-EXCEPTION: ORA-00903: invalid table name DF-EXCEPTION: ORA-06512: in "SYS.DBMS_SYS_SQL", line 906
I'd appreciate any help!
Thank you!http://asktom.Oracle.com/pls/asktom/f?p=100:11:0:P11_QUESTION_ID:227413938857
Identifiers cannot be used as variable bind - never. Identifiers must be "hard-coded".
in the query.I can't put in a link for "emp" variable because I can't use a string
constant for emp.The reason is quite simple - a bind variable query is parsed and optimized once
variables are evaluated before linking. If I could code:Select * from: bind_x
the optimzer would not have an idea of what will come with, security (access rights)
could be evaluated and so on. We could not develop a plan for this query - not
enough information. Therefore, no variable bind for identifiers. -
by the way a Bind Variable in a sql file
Hi all
I have a sql file in which a variable binding is defined as follows:
The variable var number;
Start
: var: = & Give_value_for_var;
end;
/
then I'm calling an another sql fine within this file and passing var as an argument to this file as below:
@another_sql_file.sql: var;
The above doesn't seem to work. Could you please let me know the correct way to pass this?
Thanks in advance.
Edited by: Ash_ December 4, 2009 05:09You mean something like: -.
variable var number; begin :var := &&Give_value_for_var; end; / @another_sql_file.sql &&Give_value_for_var
-
I am writing a process to delete records based on dates.
Here is the chart:
Column name Data type Nullable Default Primary key ID NUMBER NO. - 1 CT_NAME VARCHAR2 (100) Yes - - CT_CATEGORY VARCHAR2 (100) Yes - - BASE_PTS NUMBER Yes - - PROD_PTS NUMBER Yes - - REF_PTS NUMBER Yes - - START_DATE DATE Yes - - END_DATE DATE Yes - - CREATED_ON DATE Yes - - CREATED_BY VARCHAR2 (50) Yes - - UPDATED_ON DATE Yes - - UPDATED_BY VARCHAR2 (50) Yes - - start_date and end_date are the fields of date key.
The query will remove the dates with specific start and end dates. The question I have, is that I get a ORA-01858: a non-digit character was found here where was waiting for a digital error while the query is running.
remove from ct_point_values
where start_date =: P4_START_DATE_V
and end_date =: P4_END_DATE_V
If I run the query in the sql window, no problem:
remove from ct_point_values
where start_date =' 01 / 01/2014 '
and end_date = 31 December 2014"
Find the query with the works of values hard-coded. Links to fail. I tried casting and to_char to_date variations with no luck.
One thing that I notice, is that when I go to enter my bind variables in the sql workshop, the fields are pre-populated with this:
1 & amp; #x2F 1 & amp; #x2F; 2014
12 & amp; #x2F 31 & amp; #x2F; 2014
01/01/2014 and 31/12/2014. I found that the only element relates to this suggests that this is a possible bug:
SQL Bind Variables workshop - Date issues
Any thoughts on how to address this issue, or is it really a bug?
I run on Apex 4.2, 11g.
Thank you!
Hello
I guess that these dates come from elements on the page to which the user can select a range of dates.
These fields have a custom format mask?
What seems to be the case for me, is that these fields have an explicit format mask (for example: DD/MM/YYYY) but the default database/session format mask is something different (e.g. DD-MON-YYYY).
I suppose also that the issue in the SQL workshop isn't something related.
-
Hello
What is the difference between literal and bind variables?
What happens if I use
literal variable has.
variable b.bind
who is suggested?
Kind regards
KKKThere are two phases of any SQL performance.
1. analysis (check Oracle this SQL syntax, also generates the implementation PLAN)
2. execution (the real execution takes place)Below, SQL.
Select * from emp where empno = 1234;
I used literal in the SQL above.
For each SQL type similar (average for empno modified value) oracle must analyze the SQL for each performance.
Select * from emp where empno =: v_emp_no;
I used the bind variable in the SQL above.
In the oracle SQL above needs to analyze once, next time ehen this SQl will be executde with the value of the bound different variable, oracle will use the old execution PLAN and analysis will be not not happed. It will be a little fast.
Also variable binding instead of literal use reduced use shared pool.
HTH
Best regards
oratest -
SQL * more substitution vs bind variable question
Hi all, I am trying to automate some SQL within SQL codes * more script that is triggered by a script .bat, the only parts that change are Dates...
example:
create table blah as
Select * from table
WHERE DATE between start_date and END_DAY;
the DATE is a numeric field, YYYYMMDD
The script runs always at the beginning of a new week, so a Monday, unless a public holiday, then a Tuesday.
The END_DAY is * always * last Friday and I realized that:
variable L_FRIDAY char (15);
Start
Select to_char (next_day(sysdate-7,'FRIDAY'), 'YYYYMMDD') as Last_Friday in: double L_FRIDAY;
end;
/
The thing is that I get an error when I try to use the binding variable?
create table blah as
Select * from table
WHERE DATE between start_date and: L_FRIDAY;
Then once I found the end date, I was going to use add_months(L_FRIDAY,-12) for previous 12 months for the start_date...
When I tried to use a variable Substitution I could just hard code the date, but I can not or do not know how to set the value of this exec to the variable?
Help!
:-)
Basically my research reveals that - Bind variables are not allowed for operations of data definition, use substutions instead of bind variables
I need an automated way to find the END_DAY which is last Friday and START_DATE that is 12 months before Friday and refer to those in the SQL without errors.
Hello
Kodiak_Seattle wrote:
Hi all, I am trying to automate some SQL within SQL codes * more script that is triggered by a script .bat, the only parts that change are Dates...
example:
create table blah as
Select * from table
WHERE DATE between start_date and END_DAY;
the DATE is a numeric field, YYYYMMDD
The script runs always at the beginning of a new week, so a Monday, unless a public holiday, then a Tuesday.
The END_DAY is * always * last Friday and I realized that:
variable L_FRIDAY char (15);
Start
Select to_char (next_day(sysdate-7,'FRIDAY'), 'YYYYMMDD') as Last_Friday in: double L_FRIDAY;
end;
/
The thing is that I get an error when I try to use the binding variable?
create table blah as
Select * from table
WHERE DATE between start_date and: L_FRIDAY;
Then once I found the end date, I was going to use add_months(L_FRIDAY,-12) for previous 12 months for the start_date...
When I tried to use a variable Substitution I could just hard code the date, but I can not or do not know how to set the value of this exec to the variable?
Help!
:-)
Basically my research reveals that - Bind variables are not allowed for operations of data definition, use substutions instead of bind variables
I need an automated way to find the END_DAY which is last Friday and START_DATE that is 12 months before Friday and refer to those in the SQL without errors.
Or SQL * more bind variable or variable substitution can be DATEs. The best you can do is set a different type, as a string, representing a date. A string as June 19, 2015"represents a date, but so strings like 'SYSDATE' and ' SYSDATE - 7', so you can do something like this:
SET l_friday = ' NEXT_DAY ((SYSDATE-7), 'FRIDAY').
DEFINE start_date = "ADD_MONTHS (& l_friday, - 12)"
SELECT & start_date AS t_n
, & l_friday AS l_f
OF the double
;
Output (when executed on 25 June 2015):
L_F T_N
----------- -----------
June 19, 2014 19 June 2015
-
Convert SQL to take advantage of the Bind Variables
Hi all
Is it possible to convert the SQL below so I can enjoy variable Bind? It's just my personal way of followed by the name of the script that I use on a daily basis... the file is passed to a point that its about 2K lines long, and whenever I run this specific file to get a script name, it creates a new SQL in the database pool shared... I tried to change this option to use bind variables , but it doesn't seem to work properly and I wanted what suggestion of the community...
ACCEPT script_name_like prompt 'ENTER SCRIPT NAME OR HIT ENTER TO GET ALL SCRIPT NAME OR PUT PART OF THE SCRIPT NAME : ' WITH help_script AS ( SELECT 'top_seg_tab_obj_ash' AS Script_Name, 'top segment by tot wait time' AS Description, '# of mins to go back' AS INPUT FROM dual UNION ALL SELECT 'v$_tab' AS Script_Name, 'shows list v$ views' AS Description, 'view name like' AS INPUT FROM dual UNION ALL SELECT 'dba_tab' AS Script_Name, 'shows list dba views' AS Description, 'view name like' AS INPUT FROM dual UNION ALL SELECT 'nls_params' AS Script_Name, 'shows list of current NLS setting for DB/INST/SESS' AS Description, 'no Input Needed' AS INPUT ) SELECT upper(script_name) AS "MY SCRIPT NAME", upper(description) AS description, upper(INPUT) AS INPUT FROM help_script WHERE script_name LIKE nvl('%&script_name_like%', script_name) ;
Hello
user13454469 wrote:
Hi all
Is it possible to convert the SQL below so I can enjoy variable Bind? It's just my personal way of followed by the name of the script that I use on a daily basis... the file is passed to a point that its about 2K lines long, and whenever I run this specific file to get a script name, it creates a new SQL in the database pool shared... I tried to change this option to use bind variables , but it doesn't seem to work properly and I wanted what suggestion of the community...
- ACCEPT script_name_like invites ' ENTER NAME or HIT ENTER to GET ALL THE SCRIPT NAME or PART OF THE SCRIPT the SCRIPT NAME: '
- WITH help_script AS
- (SELECT "top_seg_tab_obj_ash" AS Script_Name,
- "upper segment by tot queue time" AS Description,.
- "# of minutes to go back" AS INPUT
- OF the double
- UNION ALL SELECT ' v$ _tab "AS Script_Name,.
- "Show list views$ v ' AS Description,.
- 'show the name as' AS ENTRY
- OF the double
- UNION ALL SELECT 'dba_tab' AS Script_Name,
- "Show list views dba" AS Description,.
- 'show the name as' AS ENTRY
- OF the double
- UNION ALL SELECT 'nls_params' AS Script_Name,
- 'displays the list of current NLS parameter for DB/INST/SESS' AS Description,.
- ("No input is necessary" IN ENTRY)
- SELECT upper (script_name) AS "MY SCRIPT NAME",
- Upper (Description) as a description,
- Upper (Input) AS INPUT
- OF help_script
- WHERE script_name AS nvl (script_name ' % & script_name_like %',);)
The WHERE clause (last line) of is the only place where you are using the proxy & script_name_like? If so:
-ACCEPT command is exactly the same as before
ACCEPT script_name_like invites ' ENTER NAME or HIT ENTER to GET ALL THE SCRIPT NAME or PART OF THE SCRIPT the SCRIPT NAME: '
VARIABLE script_name_like_b VARCHAR2 (30)
EXEC: script_name_like_b: = '% & script_name_like;
WITH the help _script AS
...
WHERE script_name AS NVL (: script_name_like_b, script_name);
-
How to pass a list as a bind variable in SQL Developer?
How can I pass a list as a bind variable in SQL Developer?
The following query in SQL Developer so work I put ": prmRegionID = 2.
SELECT COUNTRY_ID,
COUNTRY_NAME
OF HUMAN RESOURCES. COUNTRY
WHERE IN REGION_ID (: prmRegionID);
The problem is that I can't find how to set ": prmRegionID = 2, 3.
I know that I can replace ": prmRegionID" by a proxy '& prmRegionID '. The above query will work well with"& prmRegionID = 2" and with "& prmRegionID = 2, 3". "
But with this solution, I lost all the benefit of the use of bound variables (analysis hard against soft parse, possibility of SQL injection, etc.).
I'm learning how to do this in SQL, as well as the use of UDT in this thread: How to move a list as a bind variable?
But with this solution, I've lost nice SQL Developer user interface. In SQL developer, it is easy to test a query using the standard binding variable. When we start the application, a pop up asking for a value of the variable binding.
With the UDT, the interface request always variable binding standard. You have an idea on how I can get a variable string binding (such as 1, 2, 10) in a set of NUMBER or VARCHAR2? This way I would be able to launch a standard query in SQL Developer to test my application.
Can someone tell me what is the best approach to this?
Thank you in advance,
MBHi Blais,
Thank you for trying the SQL and PL/SQL instance before coming here - it was definitely the right approach, and you've got some very good suggestions there. Your needs for a invite only bind to the value in the clause list, I think I have a possible solution. I'll introduce you to a list of characters, so you'll have to tweak it for other types of data. First, add the following to your schema:
create or replace TYPE bind_tab_typ AS TABLE OF VARCHAR2(4000); create or replace FUNCTION comma_to_table(iv_raw IN VARCHAR2) RETURN bind_tab_typ PIPELINED IS ltab_lname dbms_utility.lname_array; ln_len BINARY_INTEGER; BEGIN dbms_utility.comma_to_table(list => iv_raw ,tablen => ln_len ,tab => ltab_lname); FOR i IN 1 .. ln_len LOOP PIPE ROW (ltab_lname(i)); END LOOP; END;
Now you can write a query, say for scott.dept, as follows, and have executed statement ask the value list in the clause as a single binding variable:
select * from dept where dname in ( select * from table( comma_to_table( :BNDS )) );
When you are prompted, provide the list of values separated by a single comma without any extra spaces.
I don't know if the Varchar2 (4000) really needs to be which is great. I use it because that's what dbms_utility.lname_array uses.
Kind regards
Gary
SQL development team -
SQL Bind Variables workshop - Date issues
I use SQL Workshop to run through some queries. I'm having a problem with Bind Variables that contain dates. I enter the following date:
12/12/2013
but it is converted to:
12 & amp; #x2F 12 & amp; #x2F; 2013
I'm doing something wrong?
Thank you
GlenIt looks like a bug. It should not escape what either.
Denes Kubicek
-------------------------------------------------------------------
http://deneskubicek.blogspot.com/
http://www.Apress.com/9781430235125
http://Apex.Oracle.com/pls/Apex/f?p=31517:1
http://www.Amazon.de/Oracle-Apex-XE-Praxis/DP/3826655494
------------------------------------------------------------------- -
How to get SQL that do not use bind variables
Hello
I am trying to identify the SQL code which should benefit from the use of bind variables.
First of all, I tried to get the common signature of all the sql calls, using:
Then I copied these values to the Clipboard and run:select * from ( select force_matching_signature, count(1) from v$sql where force_matching_signature<>0 group by force_matching_signature order by 2 desc ) where rownum < 50;
Now, I want to make it automatically and get only 1 occurrence of each SQL that resembles others by using a query.select sql_text from v$sql where force_matching_signature=<<<copied_signature_value>>>;
I tried this:
But it is not returning results by showing up at the count (1) from the first query, I've used. How can I change this if I get the results in order of "importance"?select sql_text from ( select sql_text, force_matching_signature, row_number() over (partition by force_matching_signature order by sql_text desc)rn from v$sql where force_matching_signature <>0 )where rn <2 and rownum < 10 order by force_matching_signature desc
Thank youAnd I said. First use the command by then use rownum. I did not mention row_number. Also, there should be no need to add more columns.
Have you tried it? Why it did not work?example not tested
select * from ( select sql_text from (select sql_text, force_matching_signature, row_number() over (partition by force_matching_signature order by sql_text desc) rn from v$sql where force_matching_signature != 0) where rn = 1 order by force_matching_signature desc /* add any ordering you like here */ ) where rownum < 10 /* then filter on the first 10 results */
If you want to order that the statement that found most of the time comes first, say so. However, I don't see how to group in your case.
Maybe like thisexample of tested
select * from ( select cnt, sql_text from (select sql_text, force_matching_signature, row_number() over (partition by force_matching_signature order by sql_text desc) rn , count(*) over (partition by force_matching_signature) cnt from v$sql where force_matching_signature != 0) where rn = 1 order by cnt desc, force_matching_signature desc /* add any ordering you like here */ ) where rownum < 10 /* then filter on the first 10 results */ ;
Published by: Sven w. October 11, 2012 14:49
Published by: Sven w. October 11, 2012 14:51
Published by: Sven w. on October 11, 2012 14:56 - number column added to the output
-
The use of bind variables (in &; out) with sql dynamic
I have a table that contains code snippets to make postings on a set of pl/sql database. what the code does is basically receives an ID and returns a number of errors found.
To run the code, I use dynamic sql with two bind variables.
When codes consists of a simpel query, it works like a charm, for example with this code:
However when I get to post more complexes that must perform calculations or run several queries I run into trouble.BEGIN SELECT COUNT (1) INTO :1 FROM articles atl WHERE ATL.CSE_ID = :2 AND cgp_id IS NULL; END;
I have boiled down the problem into that:
This code is not really make sense, but it's just to show you what is the problem. When I run this code, I get the errorDECLARE counter NUMBER; my_id NUMBER := 61; BEGIN EXECUTE IMMEDIATE (' declare some_var number; begin select 1 into some_var from dual where :2 = 61; :1 := :2; end; ') USING OUT counter, IN my_id; DBMS_OUTPUT.put_line (counter || '-' || my_id); END;
ORA-6537 ON bind variable linked to a position IN
The error doesn't seem wise,: 2 is the only one IN bind variable and it is only used in a where clause clause.
As soon as I remove this where clause, the code works again (giving me 61-61, in case you want to know).
Any idea what goes wrong? I just use bind variables in a way that you're not supposed to use it?
I'm using Oracle Database 11 g Enterprise Edition Release 11.2.0.3.0 - 64 bitCorrection. With immediate execution , the binding is in position, but binds do not need to be repeated. My statement above is incorrect...
You must link only once - but bind by position. And the connection must correspond to the use of the variable binding.
If the connection never variable assigns a value in the code, link by in.
If the binding variable assigns a value in the code, link as OUTPUT.
If the binding variable assigns a value and is used a variable in another statement in the code, link as IN OUT.
For example
SQL> create or replace procedure FooProc is 2 cnt number; 3 id number := 61; 4 begin 5 execute immediate 6 'declare 7 n number; 8 begin 9 select 10 1 into n 11 from dual 12 where :var1 = 61; --// var1 is used as IN 13 14 :var2 := n * :var1; --// var2 is used as OUT and var1 as IN 15 :var2 := -1 * :var2; --// var2 is used as OUT and IN 16 end; 17 ' 18 using 19 in out id, in out cnt; --// must reflect usage above 20 21 DBMS_OUTPUT.put_line ( 'cnt='||cnt || ' id=' || id); 22 end; 23 / Procedure created. SQL> SQL> exec FooProc cnt=-61 id=61 PL/SQL procedure successfully completed. SQL>
Maybe you are looking for
-
DVD SuperMulti drive on laptop Satellite Pro
I am looking to buy a Toshiba Satellite Pro PSCMMA001001 Notebook 15.6 ".Is the optical drive: SuperMulti DVD drive provided appropriate to save backups of large databases (genealogical)? IE is it fully recordable for data, photographs, etc. ?Thank y
-
Problem setting up an online number
I tried to order an online number. An hour or so later I received the message "Unfortunately, we cannot establish a number online for you in Germany." Given that my Paypal account has already been charged and the amount has not yet been refunden I do
-
Original title: Task Manager Manager tasks shows my CPU 100% usage but when I go to the processes tab and sort by CPU usage there are only a handful of programs with a percentage higher than 0 if displayed and none of those who are more than 3%. Wha
-
HotSync "Z72 palm pilot" with "PalmOne Office" using bluetooth. palmOne Office v 4.14 installed on my Vista64 laptop worked at the same time, re-installed pgm after system restore and get a message: "Cannot start the Hotsync operation because the por
-
Cannot run Schwab Street Smart Edge
Downloaded Schwab without problem. Try to run causes cancellation of the program.