sql - SQL Oracle,函数中的动态 PL/SQL 枢轴
问题描述
我有下面的脚本,将行旋转(转置)到列(列名存储在变量“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”的 DBMS 输出似乎与脚本版本中运行的部分相同:
select listagg(''''||r||''' as '||r||' ', ',')
within group (order by r)
into cols
from (select distinct r from T)
解决方案
我认为如果你用第二个参数调用 listagg''','''
然后只是前置和附加一个'
'
此外,调试只需打印出生成的行——您可能会立即看到您的问题(我猜是额外的)。
推荐阅读
- javascript - 为javascript设置相对URL(websocket连接到Spring MVC)
- angular - 拖动开始延迟不适用于移动设备
- matlab - 如何在matlab中求解代数方程组
- html - 需要帮助解决在将 HTML 转换为 PDF 时 Select.pdf 仅呈现最后一页上一半内容的错误
- python - 如何使用 TFlearn 中的新训练数据更新现有模型
- java - Spring AMQP中事务的用例
- repository - 我无法使用我的托管存储库安装包
- ios - IOS13 CNMutableContact Bug
- sql-server - 从 SQL Server 报价 14 天后生成并发送后续电子邮件
- php - 如何在带有框架 laravel 的另一个文件中使用引导程序?