【问题标题】:SQL Oracle, dynamic PL/SQL pivot in functionSQL Oracle,函数中的动态 PL/SQL 枢轴
【发布时间】:2020-06-02 19:50:19
【问题描述】:

我有下面的脚本,它将行旋转(转置)到列(列名存储在变量“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)

【问题讨论】:

  • 我不明白您为什么将第一部分更改为动态的 - 显然这是问题所在,因为这是您对工作代码所做的更改。
  • 第一部分需要是动态的,因为我必须能够选择不同的分组变量名称、表名称等。我可以以非动态方式执行此操作,而不是输入字符吗?

标签: sql oracle dynamic pivot transpose


【解决方案1】:

我认为,如果您使用第二个参数 ''',''' 调用 listagg 并在前面添加一个 ',这会更容易

另外,要调试,只需打印出生成的行——您可能会立即看到您的问题(我猜是额外的')。

【讨论】:

  • 嗨,调试实际上似乎有正确的“'”数量
猜你喜欢
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多