October 2005
Intermediate to advanced
454 pages
14h 44m
English
Explicit and implicit cursors do not match up in the shared pool. What do I mean by that? I’ll explain with an example.
DECLARE
CURSOR get_region IS
SELECT region_id FROM orders WHERE region_id = 2;
v_region NUMBER;
BEGIN
OPEN get_region;
FETCH get_region INTO v_region;
CLOSE get_region;
SELECT region_id INTO v_region FROM orders WHERE region_id = 2;
END;How many shared pool cursors does this produce? The answer is two.
SQL_TEXT PARSE_CALLS EXECUTIONS
------------------------------ ----------- ----------
SELECT REGION_ID FROM ORDERS W 1 1
HERE REGION_ID = 2
SELECT REGION_ID FROM ORDERS W 1 1
HERE REGION_ID = 2Even though these cursors look identical and share the same address in the shared pool, they differ just enough (perhaps the INTO clause?) for Oracle to store two separate ones. The moral is that you can’t assume that explicit and implicit cursors will match up in the shared pool. It’s best to stick with one way or the other.