06окт
Cursor_sharing='FORCE' - удивительные последствия: rows will be truncated
Сегодня мне нужно было выгрузить информацию в спул –файл. Данные форматировались с помощью функции rpad. Получили ошибки - «rows will be truncated». В чем же дело?
Результат разборок с этой проблемой - виноват параметр инициализации Cursor_sharing, вернее, его значение 'FORCE' . Может кто-то знает почему?
А я Вам предлагаю самим попробовать ( для чистоты эксперимента лучше после изменения значения параметра перегружать экземпляр ) :
conn sys/пароль@строка_коннекта as sysdba
alter system set cursor_sharing=’FORCE’;
set linesize 90
select ‘1111111111’,’1111111111’ from dual;
select rpad( ‘1111111111’,10) test1,rpad(’2222222’,10) test2,rpad(’333333’,10) test3 from dual;
SQL> conn sys/ пароль@строка_коннекта as sysdba
Connected.
SQL> alter system set cursor_sharing='FORCE';
System altered.
SQL> set linesize 90
SQL> select '1111111111','1111111111' from dual;
'1111111111' '1111111111'
-------------------------------- --------------------------------
1111111111 1111111111
SQL> select rpad( '1111111111',10) test1,rpad('2222222',10) test2,rpad('333333',10) test3 from dual;
TEST1
------------------------------------------------------------------------------------------
TEST2
------------------------------------------------------------------------------------------
TEST3
------------------------------------------------------------------------------------------
1111111111
2222222
333333
Получается, что если к столбцу применяется rpad, то значение столбца выводится с новой строки.
conn sys/ пароль@строка_коннекта as sysdba
alter system set cursor_sharing=’FORCE’;
set linesize 90
SET WRAP OFF
Set TrimSpool ON
select ‘1111111111’,’1111111111’ from dual;
select rpad( ‘1111111111’,10) test1,rpad(’2222222’,10) test2,rpad(’333333’,10) test3 from dual;
SQL> conn sys/ пароль@строка_коннекта as sysdba
Connected.
SQL> alter system set cursor_sharing='FORCE';
System altered.
SQL> set linesize 90
SQL> SET WRAP OFF
SQL> Set TrimSpool ON
SQL> select '1111111111','1111111111' from dual;
'1111111111' '1111111111'
-------------------------------- --------------------------------
1111111111 1111111111
SQL> select rpad( '1111111111',10) test1,rpad('2222222',10) test2,rpad('333333',10) test3 from dual;
rows will be truncated
rows will be truncated
TEST1
------------------------------------------------------------------------------------------
1111111111
А если использовать WRAP OFF, то, вообще, выводится в спул только первый столбец и сообщение "rows will be truncated".Изменим параметр: cursor_sharing=’EXACT’
conn sys/ пароль@строка_коннекта as sysdba
alter system set cursor_sharing=’EXACT’;
set linesize 90
SET WRAP OFF
Set TrimSpool on
select ‘1111111111’,’1111111111’ from dual;
select rpad( ‘1111111111’,10) test1,rpad(’2222222’,10) test2,rpad(’333333’,10) test3 from dual;
SQL> conn sys/ пароль@строка_коннекта as sysdba
Connected.
SQL> set linesize 90
SQL> SET WRAP OFF
SQL> Set TrimSpool on
SQL> select '1111111111','1111111111' from dual;
'111111111 '111111111
---------- ----------
1111111111 1111111111
SQL> select rpad( '1111111111',10) test1,rpad('2222222',10) test2,rpad('333333',10) test3 from dual;
TEST1 TEST2 TEST3
---------- ---------- ----------
1111111111 2222222 333333
При таком значении параметра cursor_sharing в спул выводится все корректно. Чудеса!