Фролов |
Вот что у меня
select * from v$sqlarea where sql_text like 'select id from ort.wip%';
no rows selected
declare
c sys_refcursor;
begin
execute immediate 'alter session set cursor_sharing=force';
open c for 'select id from ort.wip where name=''name''';
end;
/
PL/SQL procedure successfully completed.
select * from v$sqlarea where sql_text like 'select id from ort.wip%';
SQL_TEXT
----------------------------------------
select id from ort.wip where name='name'
...
...
|
Хм...
Версию сервера точнее назовите, пожалуйста.
У меня в 9.2.0.6.0 все как и должно быть:
SQL> select * from v$version where rownum = 1;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
SQL> select sql_text from v$sqlarea
2 where sql_text like 'select dummy from sys.dual%';
строки не выбраны
SQL> declare
2 c sys_refcursor;
3 begin
4 execute immediate 'alter session set cursor_sharing=force';
5 open c for 'select dummy from sys.dual where dummy=''X''';
6 end;
7 /
Процедура PL/SQL успешно завершена.
SQL> select sql_text from v$sqlarea
2 where sql_text like 'select dummy from sys.dual%';
SQL_TEXT
-----------------------------------------------------------------------
select dummy from sys.dual where dummy=:"SYS_B_0"
И кстати: ORT.WIP в Вашем запросе - это, случайно, не
view?
Если да - думаю, стоит посмотреть на его текст. Например, может оказаться, что:
SQL> create or replace view mydual as
2 select /*+ CURSOR_SHARING_EXACT */ * from sys.dual;
Представление создано.
SQL> select sql_text from v$sqlarea
2 where sql_text like 'select dummy from mydual%';
строки не выбраны
SQL> declare
2 c sys_refcursor;
3 begin
4 execute immediate 'alter session set cursor_sharing=force';
5 open c for 'select dummy from mydual where dummy=''X''';
6 end;
7 /
Процедура PL/SQL успешно завершена.
SQL> select sql_text from v$sqlarea
2 where sql_text like 'select dummy from mydual%';
SQL_TEXT
-----------------------------------------------------------------------
select dummy from mydual where dummy='X'
С другой стороны, в десятке все намного занятнее:
SQL> select * from v$version where rownum = 1;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - Prod
SQL> create or replace view mydual as
2 select /*+ CURSOR_SHARING_EXACT */ * from sys.dual;
Представление создано.
SQL> select sql_text from v$sqlarea
2 where sql_text like 'select dummy from mydual%';
строки не выбраны
SQL> declare
2 c sys_refcursor;
3 begin
4 execute immediate 'alter session set cursor_sharing=force';
5 open c for 'select dummy from mydual where dummy=''X''';
6 end;
7 /
declare
*
ошибка в строке 1:
ORA-32550: Замена выполнена несмотря на подсказку об обратном
ORA-06512: на line 5
SQL>
В документации по поводу ORA-32550 говорится:
Oracle® Database Error Messages 10g Release 1 |
ORA-32550: Replacement occured despite hint to the contrary Cause: This should never be signalled; it's internal. Action: Report to Oracle support. |
Странно все это...
Может, гуру чего скажут?