У меня есть сценарий ниже, который поворачивает (транспонирует) строки в столбцы (имена столбцов хранятся в переменной «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)