powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
10 сообщений из 10, страница 1 из 1
Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
    #40107783
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!

В Oracle 9 можно было безбоязненно писать to_char(CLOB_поле) не парясь, что там длина текста может быть > 4000. Текст автоматически обрезался до 4000 знаков.

Попробовал в Oracle 19,так вылетает с ошибкой ORA-22835, вот в моём конкретном случае для длины 4012 знаков пишет "ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 4012, maximum: 4000)"


теперь вопрос
существует ли в базе какой-нибудь волшебный параметр, просто установив который в "true" вызовы to_char бы стали вести себя, как в Oracle 9, молча обрезая первые 4000 знаков?
...
Рейтинг: 0 / 0
Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
    #40107797
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён,

event 22836 level 1
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
SQL> conn tc/tc@localhost/pdb
Connected.
SQL>
SQL> set echo on serverout on
SQL>
SQL> !oerr ora 22836
22836, 00000, "Event to turn on lob to char/raw silent truncation"
// *Document: NO
// *Cause:    N/A
// *Action:   Do not throw error 22835 for truncation during LOB to CHAR/RAW
//            conversion. Truncate the data instead.

SQL>
SQL> drop table t;

Table dropped.

SQL>
SQL> create table t(vc varchar2(4000));

Table created.

SQL>
SQL> var c clob
SQL>
SQL> begin
  2    select xmltype.createxml(cursor(select * from all_objects)).getClobVal()
  3      into :c
  4      from dual;
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL>
SQL> exec dbms_output.put_line(dbms_lob.getlength(:c))
12273513

PL/SQL procedure successfully completed.

SQL>
SQL> insert into t values (to_char(:c));
insert into t values (to_char(:c))
                      *
ERROR at line 1:
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual:
12273513, maximum: 4000)


SQL>
SQL> alter session set events '22836 level 1';

Session altered.

SQL>
SQL> insert into t values (to_char(:c));

1 row created.

SQL>
SQL> select length(vc) from t;

LENGTH(VC)
----------
      4000

SQL>
SQL> select banner_full from v$version;

BANNER_FULL
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0

...
Рейтинг: 0 / 0
Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
    #40107817
=nomad=
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
l_buffer := DBMS_LOB.SUBSTR(pi_clob, 4000, 1);
l_str := SUBSTRB(l_buffer, 1, 4000);
...
Рейтинг: 0 / 0
Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
    #40107839
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGate
event 22836 level 1


это очень круто
еще не проверял правда

спасибо огромное!
...
Рейтинг: 0 / 0
Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
    #40107841
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=nomad=SUBSTRB(l_buffer, 1, 4000)


спасибо за совет, но
так то оно так, но я хотел именно "малой кровью" без адаптации SQL-запросов под новые реалии
...
Рейтинг: 0 / 0
Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
    #40107851
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён
SeaGate
event 22836 level 1


это очень круто
еще не проверял правда

спасибо огромное!




Код: plsql
1.
alter session set events '22836 level 1';


проверил, оно работает, класс

применил к системе
Код: plsql
1.
alter system set events '22836 level 1';



и стало ещё душевнее
...
Рейтинг: 0 / 0
Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
    #40107852
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеюсь, я этим не сломал какие-нибудь важные штуки ...
...
Рейтинг: 0 / 0
Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
    #40107887
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён

применил к системе
Код: plsql
1.
alter system set events '22836 level 1';



и стало ещё душевнее

Стоит учитывать, что работать будет до первой перезагрузки.
На постоянной основе нужно установить в spfile или logon trigger для конкретной PDB/пользователя, т.к. v$parameter.ispdb_modifiable='FALSE'.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
SQL> alter system set events '22836 level 1';

System altered.

SQL> oradebug setmypid
Statement processed.
SQL> oradebug eventdump system
22836 level 1
SQL> startup force
ORACLE instance started.

Total System Global Area 2113927808 bytes
Fixed Size                  9136768 bytes
Variable Size            1325400064 bytes
Database Buffers          771751936 bytes
Redo Buffers                7639040 bytes
Database mounted.
Database opened.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug eventdump system
Statement processed.
SQL> alter system set event='22836 level 1' scope=spfile;

System altered.

SQL> startup force
ORACLE instance started.

Total System Global Area 2113927808 bytes
Fixed Size                  9136768 bytes
Variable Size            1325400064 bytes
Database Buffers          771751936 bytes
Redo Buffers                7639040 bytes
Database mounted.
Database opened.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug eventdump system
22836 level 1

...
Рейтинг: 0 / 0
Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
    #40107910
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGate,

спасибо, ценное дополнение
...
Рейтинг: 0 / 0
Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
    #40108871
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
будет что рассказать потом про "it's not a bug it's a feature"

Oracle versions 9i and 10.1 have a bug in a LOB to CHAR conversion ....
https://mvelikikh.blogspot.com/2021/10/workaround-for-ora-22835-buffer-too.html
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как бы малой кровью разрешить to_char(при CLOB>4000), подобно как это было в Oracle 9
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]