SQL Oracle, динамический c PL / SQL поворот в функции - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть сценарий ниже, который поворачивает (транспонирует) строки в столбцы (имена столбцов хранятся в переменной «r», значения в «v», а «A» и «B» - это идентификаторы, которые останутся в строках). после поворота):

drop table T_out;
declare
      q2     clob;
      cols   clob;
    begin    

      select listagg(''''||r||''' as '||r||' ', ',') within group (order by r)
      into cols from (select distinct r from T);

     q2 :=
     'create table T_out as
      select * from
      (select A, B, r, v from T)
      pivot
      ( sum(v) for r in ('||cols||') )';

      execute immediate q2;
end;
/

Я пытался превратить его в функцию:

CREATE OR REPLACE PROCEDURE transpose(T IN char, riga IN char, classe IN char, valore IN char) 
IS
      q1   clob;
      q2   clob;
      cols clob;
BEGIN
      q1 :=
      'select 
      listagg(''''''''||'||riga||'||'''''' as ''||'||riga||'||'' '', '','') 
      within group (order by '||riga||')
      into cols 
      from (select distinct '||riga||' from '||T||')';

     dbms_output.put_line(q1);
     execute immediate(q1);

      q2 :=
     'create table '||T||'_out as
      select * from
      (select '||classe||', '||riga||', '||valore||' from '||T||')
      pivot
      ( sum(v) for  '||riga||' in ('||cols||') )';

    dbms_output.put_line(q2);    
    execute immediate(q2);         

end;

Однако, работает:

execute transpose('T','r', 'A, B', 'v'); 

Я получаю ошибку:

Error starting at line : 35 in command -
BEGIN transpose('T', 'r', 'A, B', 'v'); END;
Error report -
ORA-00905: missing keyword
ORA-06512: at "USER12345.TRANSPOSE", line 18
ORA-06512: at line 1
00905. 00000 -  "missing keyword"
*Cause:    
*Action:

Проблема заключается в выполнении запроса "q1", но я не могу выяснить, что такое пропущенное ключевое слово ... Вывод СУБД для "q1", кажется, идентичен части, выполняющейся в сценарии версия:

select listagg(''''||r||''' as '||r||' ', ',') 
      within group (order by r)
      into cols 
      from (select distinct r from T)

1 Ответ

0 голосов
/ 18 февраля 2020

Я думаю, что это проще, если вы вызываете listagg со вторым параметром ''',''', а затем просто добавляете и добавляете один '

Кроме того, для отладки просто распечатайте сгенерированную строку - вы будете возможно, сразу увижу твою проблему (мне кажется, что надо ').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...