powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / как в db2 транспонировать таблицу?
2 сообщений из 2, страница 1 из 1
как в db2 транспонировать таблицу?
    #37091399
zzet_sash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как в db2 транспонировать таблицу?
...
Рейтинг: 0 / 0
как в db2 транспонировать таблицу?
    #37093471
massaraksh33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тынц
Код: plaintext
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.
74.
75.
76.
77.
78.
79.
80.
create procedure cols2rows(
  in p_sel_stmt clob(2m)
, in p_collen   int
, in p_vallen   int
--, out p_rc      int
--, out p_msg     varchar(128)
--, out p_stmt    clob(2m)
)
LANGUAGE SQL
DYNAMIC RESULT SETS  1 
BEGIN
 declare p_rc      int;
 declare p_msg     varchar( 128 );
 declare p_stmt    clob(2m);
 declare SQLCODE        int;
 declare l_SQLTYPE_ID   int;
 declare l_SQLTYPE      varchar( 128 );
 declare l_SQLLENGTH    int;
 declare l_SQLSCALE     int;
 declare l_SQLNAME_DATA varchar( 128 );
 declare l_SQLTYPEF     varchar( 128 );
 declare l_colexpr      clob(2m) default '';
 declare l_valexpr      clob(2m) default '';
 declare l_colid        int default  0 ;
 declare l_collen	varchar( 10 );
 declare l_vallen	varchar( 10 );
 declare l_colname      varchar( 128 );
 declare l1             RESULT_set_LOCATOR VARYING;

 declare c_out cursor with return for s_out;

 declare EXIT HANDLER FOR SQLEXCEPTION
 BEGIN
   GET DIAGNOSTICS EXCEPTION  1  p_msg = MESSAGE_TEXT;
   set p_rc = SQLCODE;
 END;

 set l_collen=trim(char(coalesce(p_collen,  10 ))), l_vallen=trim(char(coalesce(p_vallen,  80 )));
 -- construct case clauses
 set p_stmt = 'describe '||p_sel_stmt;
 set l_colexpr = 'when 0 then cast(repeat(''-'', '||l_collen||') as char('||l_collen||'))';
 set l_valexpr = 'when 0 then cast(repeat(''-'', '||l_vallen||') as char('||l_vallen||'))';
 call SYSPROC.ADMIN_CMD(p_stmt);
 associate result set locator (l1)
 with procedure SYSPROC.ADMIN_CMD;
 allocate c1 cursor for result set l1;
 open c1;
 fetch c1 into l_SQLTYPE_ID, l_SQLTYPE, l_SQLLENGTH, l_SQLSCALE, l_SQLNAME_DATA;
 while (SQLCODE!= 100 ) do
   set l_colid = l_colid+ 1 ;
   set l_colname = 
   case l_SQLTYPE_ID
     when  404  -- BLOB
       then '''x''''''||hex(a.'||l_SQLNAME_DATA||')||'''''''''
     when  988  -- XML
       then 'xmlserialize(a.'||l_SQLNAME_DATA||' as clob(4000))'
     else 'a.'||l_SQLNAME_DATA
   end;
   set l_colexpr=l_colexpr||' '||'when '||rtrim(char(l_colid))||' then cast('''||l_SQLNAME_DATA||''' as char('||l_collen||'))';
   set l_valexpr=l_valexpr||' '||'when '||rtrim(char(l_colid))||' then cast('||l_colname||' as char('||l_vallen||'))';
   fetch c1 into l_SQLTYPE_ID, l_SQLTYPE, l_SQLLENGTH, l_SQLSCALE, l_SQLNAME_DATA;
 end while;
 close c1;

 -- construct select statement
 set p_stmt=
   'with '
 ||'  a as (select s.*, rownumber() over() rn_ from ('||p_sel_stmt||') s) '
 ||', t (i) as (values 0 union all select i+1 from t where i<'||trim(char(l_colid))||') '
 ||'select '
 ||'  case t.i '||l_colexpr||' end as col '
 ||', case t.i '||l_valexpr||' end as val '
 ||'from a, t '
 ||'order by a.rn_, t.i';
 -- execute this statement
 prepare s_out from p_stmt;
 open c_out;
 set p_rc= 0 ;
END;


вызов:
Код: plaintext
1.
2.
3.
4.
call cols2rows('select * from table(values 
  (current date, current time, current timestamp, double(1), real(1), 1, dec(1), clob(''123''), blob(''123''), decfloat(1), xmlparse (document ''<d><n>1</n></d>''))
, (current date, current time, current timestamp, double(2), real(2), 2, dec(2), clob(''456''), blob(''456''), decfloat(2), xmlparse (document ''<d><n>2</n></d>''))
) t(dt, tm, ts, dbl, rl, i, dec, cl, bl, df, xl)',  10 ,  80 );
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / как в db2 транспонировать таблицу?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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