Cursor_sharing='FORCE' - удивительные последствия: rows will be truncated

dbstalker, 06 октября

Сегодня мне нужно было выгрузить информацию в спул –файл. Данные форматировались с помощью функции 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 комментария

Прокоментировать

viman
7 октября 2008 г. в 14:17

видимо происходит неверное определение предполагаемой ширины строки столбца. применяйте, по возможности, всегда форматирование столбцов вида "column test1 format a30;", и будете получать то, что нужно независимо от значения cursor_sharing.

denix1
8 октября 2008 г. в 16:56

это не баг и не "неверное определение преполагаемой ширины строки столбца",
а особенности реализации шаринга курсоров...
т.е. длина строковых полей результата задается максимальной
данная поведение может привести к неработоспособности клиентских приложений,
например написанных на Делфи, когда возвращаемая колонка имеет длину 4000,
а в клиентской программе подвязывается к строке
рантайм ругается - дескать Мемо подвязывается к строке
скорее всего в последних версиях Делфей уже подрихтовал

 

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

Я не спамер: введите суму 2+1



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Товары для взрослых
24 мая, 1 ответа
Выделенный сервер
23 мая, 3 ответа
Где скачать 1с
21 мая, 1 ответа