Перейти к содержанию

Болталка обо всём


Лисичkа

Рекомендуемые сообщения

я не блондинка-раз :) мне уже 18+ :D

"а девочка созрела" :D

Или "Операция "Лесополоса Ольгино" "[emoji1]

первые 30 серий мочут неувиновных узбекотаджиков))))

Ссылка на комментарий
Поделиться на другие сайты

На чужую пиццу и чужой боулинг? :D :D

За все мной уплачено, так что правообладатель я! На Катрин денег не жалко и хрен с ней с Москвой!  :blush:

Ссылка на комментарий
Поделиться на другие сайты

За все мной уплачено, так что правообладатель я! На Катрин денег не жалко и хрен с ней с Москвой!  :blush:

у тебя случаем на КЛС аккаунта нет?

явно оживил бы форум

Ссылка на комментарий
Поделиться на другие сайты

хорош нам тут вирусы на форум постить :angry:

Это был разогрев- вот повкуснее (динамический разворот столбца в строку для DB2):

 

CREATE OR REPLACE FUNCTION TOOL.JOIN (
    STR_FROM VARCHAR(32000),
    SIMB VARCHAR(100) )
  RETURNS VARCHAR(32000)
BEGIN 
           DECLARE STR_EXEC   VARCHAR(32000); 
           DECLARE STR_RESULT VARCHAR(32000);
           DECLARE SQLSTATE CHAR(5);
           DECLARE WITH_STR INTEGER ;
           DECLARE POS_SELECT INTEGER; 
           DECLARE c1 CURSOR FOR s1 ; -- курсор
           
           -- получаем итоговый запрос динамически
          -- есть ли with
          SET  WITH_STR = 
          case when   locate(UPPER('with'),UPPER(STR_FROM)) >0  THEN 
          1  else  0 end ;
          
 
          IF(WITH_STR = 0) THEN
            -- with нет в динамической конструкции
            set STR_EXEC  = 'with  ttt(COL1) as (' || STR_FROM || ' ) ' 
            || ' select ' || ' listagg( ' || 'CAST(COL1 as VARCHAR(32000)) ,' || '''' || SIMB || '''' ||  ') from ttt ';
            
          ELSE
            -- опредилим последнее вхождение select или tceles наоборот
            set POS_SELECT = length(STR_FROM, CODEUNITS16) - locate(UPPER('tceles'),TOOLS.REVERSE(UPPER(STR_FROM))) - 6 ;
          
            -- with есть в динамической конструкции
            set STR_EXEC  =  SUBSTRING(STR_FROM,1,POS_SELECT,CODEUNITS16) 
            || ', ttt(COL1) as ( ' 
            || SUBSTRING(STR_FROM,POS_SELECT + 1 , locate(UPPER('tceles'),TOOLS.REVERSE(UPPER(STR_FROM))) + 6,  CODEUNITS16)
            || ' )'
            || ' select ' || ' listagg( ' || 'CAST(COL1 as VARCHAR(32000)) , ' || '''' || SIMB || '''' ||  ') from ttt ';
            
          END IF;
          
          -- выполняем в динамике (можно тлько в скалярных функциях)  
           PREPARE s1 FROM  STR_EXEC ; 
           OPEN c1;
                    WHILE SQLSTATE = '00000' DO 
                    FETCH  c1  INTO STR_RESULT;
                    END WHILE;
           CLOSE c1;
           -- возвращаем строку с данными 
           RETURN cast(STR_RESULT as VARCHAR(32000));
      END;
Ссылка на комментарий
Поделиться на другие сайты

 

Это был разогрев- вот повкуснее (динамический разворот столбца в строку для DB2):

 

CREATE OR REPLACE FUNCTION TOOL.JOIN (
    STR_FROM VARCHAR(32000),
    SIMB VARCHAR(100) )
  RETURNS VARCHAR(32000)
BEGIN 
           DECLARE STR_EXEC   VARCHAR(32000); 
           DECLARE STR_RESULT VARCHAR(32000);
           DECLARE SQLSTATE CHAR(5);
           DECLARE WITH_STR INTEGER ;
           DECLARE POS_SELECT INTEGER; 
           DECLARE c1 CURSOR FOR s1 ; -- курсор
           
           -- получаем итоговый запрос динамически
          -- есть ли with
          SET  WITH_STR = 
          case when   locate(UPPER('with'),UPPER(STR_FROM)) >0  THEN 
          1  else  0 end ;
          
 
          IF(WITH_STR = 0) THEN
            -- with нет в динамической конструкции
            set STR_EXEC  = 'with  ttt(COL1) as (' || STR_FROM || ' ) ' 
            || ' select ' || ' listagg( ' || 'CAST(COL1 as VARCHAR(32000)) ,' || '''' || SIMB || '''' ||  ') from ttt ';
            
          ELSE
            -- опредилим последнее вхождение select или tceles наоборот
            set POS_SELECT = length(STR_FROM, CODEUNITS16) - locate(UPPER('tceles'),TOOLS.REVERSE(UPPER(STR_FROM))) - 6 ;
          
            -- with есть в динамической конструкции
            set STR_EXEC  =  SUBSTRING(STR_FROM,1,POS_SELECT,CODEUNITS16) 
            || ', ttt(COL1) as ( ' 
            || SUBSTRING(STR_FROM,POS_SELECT + 1 , locate(UPPER('tceles'),TOOLS.REVERSE(UPPER(STR_FROM))) + 6,  CODEUNITS16)
            || ' )'
            || ' select ' || ' listagg( ' || 'CAST(COL1 as VARCHAR(32000)) , ' || '''' || SIMB || '''' ||  ') from ttt ';
            
          END IF;
          
          -- выполняем в динамике (можно тлько в скалярных функциях)  
           PREPARE s1 FROM  STR_EXEC ; 
           OPEN c1;
                    WHILE SQLSTATE = '00000' DO 
                    FETCH  c1  INTO STR_RESULT;
                    END WHILE;
           CLOSE c1;
           -- возвращаем строку с данными 
           RETURN cast(STR_RESULT as VARCHAR(32000));
      END;

 

круто - МОЗХ!!!!!

Ссылка на комментарий
Поделиться на другие сайты

Заархивировано

Эта тема находится в архиве и закрыта для дальнейших ответов.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу



×
×
  • Создать...