SQL Oracle,函数中的动态PL/SQL pivot
我有下面的脚本,它将行旋转(转换)为列(列名存储在变量“r”中,值存储在“v”中,而“A”和“B”是旋转后保留在行上的标识符): 我试图将其转换为一个函数:SQL Oracle,函数中的动态PL/SQL pivot,sql,oracle,dynamic,pivot,transpose,Sql,Oracle,Dynamic,Pivot,Transpose,我有下面的脚本,它将行旋转(转换)为列(列名存储在变量“r”中,值存储在“v”中,而“A”和“B”是旋转后保留在行上的标识符): 我试图将其转换为一个函数: 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 :=
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”查询,但我无法找出缺少的关键字是什么……DBMS“q1”的输出似乎与脚本版本中运行的部分相同:
select listagg(''''||r||''' as '||r||' ', ',')
within group (order by r)
into cols
from (select distinct r from T)
我认为,如果您使用第二个参数调用listagg
''','''
,然后只是在前面加上一个'
另外,要调试,只需打印出生成的行——您可能会立即看到您的问题(我猜是一个额外的
“
).我不明白您为什么将第一部分更改为动态的——显然这是问题所在,因为这是您对工作代码所做的更改。第一部分需要是动态的,因为我必须能够选择不同的分组变量名称、表名等。我是否可以以非动态方式执行此操作,让输入不作为字符?嗨,调试实际上似乎有正确数量的“'”
select listagg(''''||r||''' as '||r||' ', ',')
within group (order by r)
into cols
from (select distinct r from T)