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 в спул выводится все корректно. Чудеса!

Комментарии (2)

[327] Комментарий от viman   07.10.2008(14:17:00)
видимо происходит неверное определение предполагаемой ширины строки столбца. применяйте, по возможности, всегда форматирование столбцов вида "column test1 format a30;", и будете получать то, что нужно независимо от значения cursor_sharing.
[331] Комментарий от denix1   08.10.2008(16:56:05)
это не баг и не "неверное определение преполагаемой ширины строки столбца", а особенности реализации шаринга курсоров... т.е. длина строковых полей результата задается максимальной данная поведение может привести к неработоспособности клиентских приложений, например написанных на Делфи, когда возвращаемая колонка имеет длину 4000, а в клиентской программе подвязывается к строке рантайм ругается - дескать Мемо подвязывается к строке скорее всего в последних версиях Делфей уже подрихтовал



Новый комментарий

Имя
Электронная почта
 
Ваш сайт
Защита от спама: укажите сумму 0 + 3
   
 

Поиск по блогам



Подпишись на RSS:

RSS - Подписаться на блог



Читателям


Рекомендую к прочтению





Разделы блога



Последние публикации



Последние коментарии