powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle Database 21c. SQL. New Features
25 сообщений из 54, страница 2 из 3
Oracle Database 21c. SQL. New Features
    #40032015
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
SQL*Plus,

А коллизии возможны? (одинаковый результат для разных значений поля, например)


Мы с вами знаем, что разработчики Oracle используют наилучшие алгоритмы.
Поэтому вероятность такого события должна быть очень мала.

https://en.wikipedia.org/wiki/Checksum
https://ru.wikipedia.org/wiki/Контрольная_сумма
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032020
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus
Мы с вами знаем, что разработчики Oracle используют наилучшие алгоритмы.
Поэтому вероятность такого события должна быть очень мала.


Джон: Ага! Вы только что признали, что ученые могут ошибаться, а вот мы знаем, что Хэнк всегда прав.
Я: Мы знаем?
Мэри: Конечно, из 7-го пункта.
http://lurkmore.to/Жопа_Хэнка
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032028
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
SQL*Plus
Мы с вами знаем, что разработчики Oracle используют наилучшие алгоритмы.
Поэтому вероятность такого события должна быть очень мала.


Джон: Ага! Вы только что признали, что ученые могут ошибаться, а вот мы знаем, что Хэнк всегда прав.
Я: Мы знаем?
Мэри: Конечно, из 7-го пункта.
http://lurkmore.to/Жопа_Хэнка

...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032089
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andreymx
с разными NLS-ами пробовал?
да тут в общем-то очевидно:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> select dump(-1),dump('>df') from dual;

DUMP(-1)                DUMP('>DF')
----------------------- ------------------------
Typ=2 Len=3: 62,100,102 Typ=96 Len=3: 62,100,102

SQL> select checksum(-1),checksum('>df') from dual;

CHECKSUM(-1) CHECKSUM('>DF')
------------ ---------------
      811538          811538




env
А коллизии возможны? (одинаковый результат для разных значений поля, например)
ну, конечно, же. Имхо, очевидно, что выбран алгоритм с какой-то коммуникативной операцией над (скорее всего) хэшами значений.
коллизии 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.
  1  with v as (
  2  select
  3    (select listagg(tc.column_value,',') from table(t.column_value)tc) as vals
  4   ,(select checksum(tc.column_value) from table(t.column_value)tc) as chksum
  5  from table(powermultiset(sys.ku$_vcnt(
  6  1,2,3,4,5,6,7,8,9,0
  7  ,'1a','2a'
  8  ))) t
  9  )
 10  --select count(distinct vals), count(distinct chksum) from v
 11  select chksum,min(vals) cmin,max(vals)cmax,count(*) cnt
 12  from v
 13  group by chksum
 14* having count(*)>1
SQL> /

    CHKSUM CMIN                                     CMAX                                            CNT
---------- ---------------------------------------- ---------------------------------------- ----------
      9254 1,2,4,9,0,2a                             1,2,6,7,8,0,1a,2a                                 2
    125834 2,3,0,2a                                 3,7,8,9,0                                         2
    288809 1,2,3,4,5,8,9,0                          1,2,4,5,6,7,8,9,1a                                2
    345903 1,2,3,4,6,8,9,0,1a,2a                    4,6,7,0,1a                                        2
    419682 1,2,3,4,8,2a                             4,7,8                                             2
    812935 1,2,3,4,6,8,0,1a,2a                      1,7,8,9,0,1a                                      2
    899015 1,2,4,6,7,8,9,0,2a                       2,4,8,9,1a,2a                                     2
    920128 1,2,3,4,6,8,9,1a,2a                      2,4,9,0,1a,2a                                     2

8 rows selected.

коллизии 2
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  1  with v as (select n,checksum(rpad('x',n,'x')) chk from xmltable('1 to 4000' columns n for ordinality) group by n)
  2* select chk,min(n),max(n),count(*) from v where chk>0 group by chk having count(*)>1
SQL> /

       CHK     MIN(N)     MAX(N)   COUNT(*)
---------- ---------- ---------- ----------
     84203       2948       3266          2
     72871       1552       2633          2
    203951        738       2208          2
    234729       1796       1903          2
    218740        787       2446          2
    906628       3506       3739          2

6 rows selected.

Заметно, что с увеличением длины входных параметров, вероятность коллизий повышается. Можно, конечно, посмотреть что там за функция внутри вызывается(скорее всего не стали велосипедить и взяли что-то уже готовое что уже используется в ora_hash, standard_hash и тп) над каждым параметром, но мне лень, а главное не вижу смысла.

зы. Некоммутативные операции они использовали для новых "блокчейн таблиц".
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032098
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus
Как видим, если значения столбца уникальны, результат для ALL и DISTINCT одинаковый.

У них же есть STANDARD_HASH, который умеет считать SHA, зачем этот чексум нужен?
BIT_OR_AGG
Битодрочить - это очень актуально.

И всё? Что там еще есть свежего и интересного? Должно же быть что-то.
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032115
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Как-то совсем печально выглядит, можно ненароком пропустить изменение значения с такими пересечениями.
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032136
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus


Очень интересно работают MINUS ALL / EXCEPT ALL и INTERSECT ALL:



внутри аналитика, или чесно сделали?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> ed
Wrote file afiedt.buf

  1  select job,row_number() over (partition by job order by null) rn from emp where deptno = 20
  2  MINUS --ALL
  3* select job,row_number() over (partition by job order by null) rn from emp where deptno = 10
SQL> /

JOB               RN
--------- ----------
ANALYST            1
ANALYST            2
CLERK              2

SQL




.....
stax
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032244
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SQL*Plus


Очень интересно работают MINUS ALL / EXCEPT ALL и INTERSECT ALL:


внутри аналитика, или чесТно сделали?

Сделали честно:
Код: 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.
SQL> EXPLAIN PLAN FOR
  2  select job from emp where deptno = 20
  3  MINUS ALL
  4  select job from emp where deptno = 10;
Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
----------------------------------------------------------------------------------------------------
Plan hash value: 261732639
 
---------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |            |     5 |    88 |     6  (34)| 00:00:01 |
|   1 |  MINUS ALL HASH                      |            |       |       |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| EMP        |     5 |    55 |     2   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN                  | EMP#R#DEPT |     5 |       |     1   (0)| 00:00:01 |
|   4 |   TABLE ACCESS BY INDEX ROWID BATCHED| EMP        |     3 |    33 |     2   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN                  | EMP#R#DEPT |     3 |       |     1   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
----------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - access("DEPTNO"=20)
   5 - access("DEPTNO"=10)
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032250
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus,

спасибо


listagg дальше при переполнении обрезают с запасом?

зы
мне не принципиально, так больше из-за интереса

.....
stax
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032263
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выпустили новых джиннов "из бутылки":
SQL MacrosYou can create SQL Macros (SQM) to factor out common SQL expressions and
statements into reusable, parameterized constructs that can be used in other SQL
statements. SQL macros can either be scalar expressions , typically used in SELECT
lists, WHERE, GROUPBY and HAVING clauses, to encapsulate calculations and business
logic or can be table expressions , typically used in a FROM clause.

SQL macros increase developer productivity, simplify collaborative development, and
improve code quality.


SQL Macros - Scalar Valued Macros

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> --SQL Macros - Scalar Valued Macros: Examples
SQL> --Print Hello <name>
SQL> --A PL/SQL function greet is defined as a scalar SQL Macro that returns the string
SQL> --'Hello, <name>! ' when called from a SQL SELECT statement.
SQL> create or replace function greet(name varchar2 default 'World')
  2  return varchar2 SQL_MACRO(Scalar) is
  3  begin
  4     return q'{ 'Hello, ' || name || '!' }';
  5  end;
  6  /
Function GREET compiled

SQL> SELECT greet from dual;

GREET        
-------------
Hello, World!

SQL> SELECT greet('uncle Bob') from dual;

GREET('UNCLEBOB')
-----------------
Hello, uncle Bob!

Может быть в этом варианте всё будет делать SQL Engine без переключения на PL/SQL Engine?
Тогда получилось бы ускорение.

SQL Macros - Table Valued Macros: Examples

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> --SQL Macros - Table Valued Macros: Examples
SQL> --The macro function budget computes the amount of each department's budget for a given job. 
SQL> -- It returns the number of employees in each department with the specified job title.
SQL> create or replace function budget(job varchar2) return varchar2 SQL_MACRO is
  2  begin
  3  return q'{
  4  select deptno, sum(sal) AS budget
  5  from emp
  6  where job = budget.job
  7  group by deptno
  8  }';
  9  end;
 10  /

Function BUDGET compiled

SQL> SELECT * FROM budget ('MANAGER');

    DEPTNO     BUDGET
---------- ----------
        20       2975
        30       2850
        10       2450



Это прямо для любителей 'SELECT из процедуры, как в Microsoft SQL Server" :-)

Посмотрим, как эти "джинны" себя в жизни проявят.
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032266
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus

внутри аналитика, или чесТно сделали?


Не знаю насколько "чесТно". Зависит от того что у MINUS ALL HASH под капотом. "Умен" ли оптимизатор настолько чтобы не хешировать с гулькин нос job и сравнивать хеши а просто сравнивать job.

SY.
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032273
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus


SQL Macros - Table Valued Macros: Examples


недавно SY антипример приводил для SQL_MACRO

.....
stax
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032283
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

недавно SY антипример приводил для SQL_MACRO


Stax, это не был "антипример" а просто пример того что SQL MACRO облегчает кодирование SELECTа с переменным числом полей но полностью не решает (пока Oracle не даст возможность указать hard parse).

SY.
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032314
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Stax

недавно SY антипример приводил для SQL_MACRO


Stax, это не был "антипример" а просто пример того что SQL MACRO облегчает кодирование SELECTа с переменным числом полей но полностью не решает (пока Oracle не даст возможность указать hard parse).

SY.


возможности я так понял нет, то фича сомнительная (в некотором смысле вредная)

я б сделал просто, если ф-ция not determenistic то надо делать 'hard parse'

или sql-ки сравнивать после применения ф-ции

.....
stax
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032332
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SQL*Plus,

спасибо

listagg дальше при переполнении обрезают с запасом?
зы
мне не принципиально, так больше из-за интереса
.....
stax
Все точно так же, как было в Oracle 19c

listagg_overflow_clause::=

...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032346
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus,

неясно выразился
я об реализации
Код: 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.
with t as (
select -2 id,lpad('*',2000,'-') n from dual union all
select -1 id,lpad('$',2000,'-') from dual union all
select 0 id,lpad('^',3964,'-') from dual union all
select 1 id,'1' from dual union all
select 2 id,'2' from dual union all
select 3 id,'3' from dual union all
select 4 id,'4' from dual union all
select 5 id,'5' from dual union all
select 6 id,'6' from dual union all
select 7 id,'7' from dual union all
select 8 id,'8' from dual union all
select 9 id,'9' from dual union all
select 10 id,'0' from dual union all
select 11 id,'a' from dual union all
select 12 id,'b' from dual union all
select 13 id,'c' from dual union all
select 14 id,'d' from dual union all
select 15 id,'e' from dual union all
select 16 id,'f' from dual union all
select 17 id,'g' from dual union all
select 18 id,'h' from dual union all
select 19 id,'i' from dual union all
select 20 id,'j' from dual union all
select 21 id,'k' from dual union all
select 22 id,'l' from dual union all
select 23 id,'m' from dual union all
select 24 id,'n' from dual union all
select 25 id,'o' from dual union all
select 26 id,'p' from dual union all
select 27 id,'q' from dual union all
select 28 id,'r' from dual union all
select 29 id,'s' from dual union all
select 30 id,'t' from dual union all
select 31 id,'u' from dual union all
select 32 id,'v' from dual union all
select 33 id,'w' from dual union all
select 34 id,'x' from dual union all
select 35 id,'y' from dual union all
select 36 id,'z' from dual union all
--
select 200 id,'!' from dual 
)
select 
length(
 listagg(n ON OVERFLOW TRUNCATE '>' WITH /*OUT*/ COUNT) WITHIN GROUP (ORDER BY id ) 
) 
s 
from t where id>=0 --group by 1

3977
1 rows returned in 0.01 seconds	   



еще куча елементов в 4000 поместится, а он взял и обрезал

.....
stax
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032383
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SQL*Plus,

неясно выразился
я об реализации
об реализации
Код: 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.
with t as (
select -2 id,lpad('*',2000,'-') n from dual union all
select -1 id,lpad('$',2000,'-') from dual union all
select 0 id,lpad('^',3964,'-') from dual union all
select 1 id,'1' from dual union all
select 2 id,'2' from dual union all
select 3 id,'3' from dual union all
select 4 id,'4' from dual union all
select 5 id,'5' from dual union all
select 6 id,'6' from dual union all
select 7 id,'7' from dual union all
select 8 id,'8' from dual union all
select 9 id,'9' from dual union all
select 10 id,'0' from dual union all
select 11 id,'a' from dual union all
select 12 id,'b' from dual union all
select 13 id,'c' from dual union all
select 14 id,'d' from dual union all
select 15 id,'e' from dual union all
select 16 id,'f' from dual union all
select 17 id,'g' from dual union all
select 18 id,'h' from dual union all
select 19 id,'i' from dual union all
select 20 id,'j' from dual union all
select 21 id,'k' from dual union all
select 22 id,'l' from dual union all
select 23 id,'m' from dual union all
select 24 id,'n' from dual union all
select 25 id,'o' from dual union all
select 26 id,'p' from dual union all
select 27 id,'q' from dual union all
select 28 id,'r' from dual union all
select 29 id,'s' from dual union all
select 30 id,'t' from dual union all
select 31 id,'u' from dual union all
select 32 id,'v' from dual union all
select 33 id,'w' from dual union all
select 34 id,'x' from dual union all
select 35 id,'y' from dual union all
select 36 id,'z' from dual union all
--
select 200 id,'!' from dual 
)
select 
length(
 listagg(n ON OVERFLOW TRUNCATE '>' WITH /*OUT*/ COUNT) WITHIN GROUP (ORDER BY id ) 
) 
s 
from t where id>=0 --group by 1

3977
1 rows returned in 0.01 seconds	   



еще куча елементов в 4000 поместится, а он взял и обрезал

.....
stax
Выражайтесь яснее :-)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
...
 48  s 
 49  from t where id>=0;

         S
----------
      4001
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032394
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus
Stax
SQL*Plus,

неясно выразился
я об реализации
об реализации
Код: 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.
with t as (
select -2 id,lpad('*',2000,'-') n from dual union all
select -1 id,lpad('$',2000,'-') from dual union all
select 0 id,lpad('^',3964,'-') from dual union all
select 1 id,'1' from dual union all
select 2 id,'2' from dual union all
select 3 id,'3' from dual union all
select 4 id,'4' from dual union all
select 5 id,'5' from dual union all
select 6 id,'6' from dual union all
select 7 id,'7' from dual union all
select 8 id,'8' from dual union all
select 9 id,'9' from dual union all
select 10 id,'0' from dual union all
select 11 id,'a' from dual union all
select 12 id,'b' from dual union all
select 13 id,'c' from dual union all
select 14 id,'d' from dual union all
select 15 id,'e' from dual union all
select 16 id,'f' from dual union all
select 17 id,'g' from dual union all
select 18 id,'h' from dual union all
select 19 id,'i' from dual union all
select 20 id,'j' from dual union all
select 21 id,'k' from dual union all
select 22 id,'l' from dual union all
select 23 id,'m' from dual union all
select 24 id,'n' from dual union all
select 25 id,'o' from dual union all
select 26 id,'p' from dual union all
select 27 id,'q' from dual union all
select 28 id,'r' from dual union all
select 29 id,'s' from dual union all
select 30 id,'t' from dual union all
select 31 id,'u' from dual union all
select 32 id,'v' from dual union all
select 33 id,'w' from dual union all
select 34 id,'x' from dual union all
select 35 id,'y' from dual union all
select 36 id,'z' from dual union all
--
select 200 id,'!' from dual 
)
select 
length(
 listagg(n ON OVERFLOW TRUNCATE '>' WITH /*OUT*/ COUNT) WITHIN GROUP (ORDER BY id ) 
) 
s 
from t where id>=0 --group by 1

3977
1 rows returned in 0.01 seconds	   



еще куча елементов в 4000 поместится, а он взял и обрезал

.....
stax
Выражайтесь яснее :-)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
...
 48  s 
 49  from t where id>=0;

         S
----------
      4001



надо для базы с MAX_STRING_SIZE = STANDARD (4000байт, или тест делать для 32767)

lenght ('--------------------^12345678>(29)')=3977

до 4000 еще есть 23 байта, туда поместятся записи с id=9-31, но оракля их в результат не включил, хотя запросто мог

.....
stax
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032510
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
надо для базы с MAX_STRING_SIZE = STANDARD (4000байт, или тест делать для 32767)


MAX_STRING_SIZE = STANDARD в автономной базе я сделать не смогу.
Напишите, как считаете нужным "тест делать для 32767", а я выполню такой тест.
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032523
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus,

Код: 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.
with t as (
select -2 id,lpad('*',2000,'-') n from dual union all
select -1 id,lpad('$',2000,'-') from dual union all
--select 0 id,lpad('^',3964,'-') from dual union all
select 0 id,lpad('^',32767-30,'-') from dual union all
select 1 id,'1' from dual union all
select 2 id,'2' from dual union all
select 3 id,'3' from dual union all
select 4 id,'4' from dual union all
select 5 id,'5' from dual union all
select 6 id,'6' from dual union all
select 7 id,'7' from dual union all
select 8 id,'8' from dual union all
select 9 id,'9' from dual union all
select 10 id,'0' from dual union all
select 11 id,'a' from dual union all
select 12 id,'b' from dual union all
select 13 id,'c' from dual union all
select 14 id,'d' from dual union all
select 15 id,'e' from dual union all
select 16 id,'f' from dual union all
select 17 id,'g' from dual union all
select 18 id,'h' from dual union all
select 19 id,'i' from dual union all
select 20 id,'j' from dual union all
select 21 id,'k' from dual union all
select 22 id,'l' from dual union all
select 23 id,'m' from dual union all
select 24 id,'n' from dual union all
select 25 id,'o' from dual union all
select 26 id,'p' from dual union all
select 27 id,'q' from dual union all
select 28 id,'r' from dual union all
select 29 id,'s' from dual union all
select 30 id,'t' from dual union all
select 31 id,'u' from dual union all
select 32 id,'v' from dual union all
select 33 id,'w' from dual union all
select 34 id,'x' from dual union all
select 35 id,'y' from dual union all
select 36 id,'z' from dual union all
--
select 200 id,'!' from dual 
)
select 
  substra(listagg(n ON OVERFLOW TRUNCATE '>' WITH /*OUT*/ COUNT) WITHIN GROUP (ORDER BY id ),-50 ) s, 
  length (listagg(n ON OVERFLOW TRUNCATE '>' WITH /*OUT*/ COUNT) WITHIN GROUP (ORDER BY id ) ) len 
from t where id>=0 



ps
никогда не работал с EXTENDED

.....
stax
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032527
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Вот результат
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
............
44  )
 45  select 
 46    substr(listagg(n ON OVERFLOW TRUNCATE '>' WITH /*OUT*/ COUNT) WITHIN GROUP (ORDER BY id ),-50 ) s, 
 47    length (listagg(n ON OVERFLOW TRUNCATE '>' WITH /*OUT*/ COUNT) WITHIN GROUP (ORDER BY id ) ) len 
 48  from t where id>=0;

S                                                         LEN
-------------------------------------------------- ----------
------------------------------------------^12>(35)      32744



Это хорошо? Это плохо?

>>>никогда не работал с EXTENDED
Всё когда-то делается впервые :-)
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032538
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus


Stax,

Вот результат
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
............
44  )
 45  select 
 46    substr(listagg(n ON OVERFLOW TRUNCATE '>' WITH /*OUT*/ COUNT) WITHIN GROUP (ORDER BY id ),-50 ) s, 
 47    length (listagg(n ON OVERFLOW TRUNCATE '>' WITH /*OUT*/ COUNT) WITHIN GROUP (ORDER BY id ) ) len 
 48  from t where id>=0;

S                                                         LEN
-------------------------------------------------- ----------
------------------------------------------^12>(35)      32744



Это хорошо? Это плохо?

>>>никогда не работал с EXTENDED
Всё когда-то делается впервые :-)


имхо
ето неакуратно

Код: plsql
1.
2.
3.
4.
5.
SQL> select 32767-32744 from dual;

32767-32744
-----------
         23



в строку listagg могло еще поместится "примерно" 23 значения
оракля мог их включить в результат, но замного (35строк) обрезал (TRUNCATE)

типа +-

-----^1234567890abcdefghijklmn>(12)

та ж история с 18-кой, правда я пробовал на 4000

.....
stax
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032559
ASNexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Из описания функции LISTAGG в Oracle Database SQL Language Reference, 19c , но, я думаю, что принцип в разных версиях одинаковый:

If you specify WITH COUNT , then after the truncation indicator, the database
appends the number of truncated values, enclosed in parentheses. In this case,
the database truncates enough measure values to allow space in the return value
for a final delimiter, the truncation indicator, and 24 characters for the number
value enclosed in parentheses
.

Хорошо это или плохо, но такое поведение соответствует документации.
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032561
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot ASNexus#22256992Хорошо это или плохо, но такое поведение соответствует документации.[/quot]
Всё, что соответствует документации - это хорошо!
...
Рейтинг: 0 / 0
Oracle Database 21c. SQL. New Features
    #40032575
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus

Всё, что соответствует документации - это хорошо!


мож и хорошо

но всеравно берет немножко больше 24-х characters для value enclosed in parentheses
что есть не очень гут

....
stax
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 2 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle Database 21c. SQL. New Features
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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