Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL Oracle-将行动态转换为字段_Sql_Plsql - Fatal编程技术网

PL/SQL Oracle-将行动态转换为字段

PL/SQL Oracle-将行动态转换为字段,sql,plsql,Sql,Plsql,我已经检查了相同的场景,但不幸的是仍然没有得到它:(,我尝试了一些代码,但仍然失败 将行动态转换为字段(字段取决于行数,行数取决于类型) 桌子 TYPE |ATTR_NAME | ATTR_VALUE **sample flat rate |Activity | N **sample flat rate |code | PLAN_999 **sample flat ra

我已经检查了相同的场景,但不幸的是仍然没有得到它:(,我尝试了一些代码,但仍然失败

  • 将行动态转换为字段(字段取决于行数,行数取决于类型)
桌子

TYPE                |ATTR_NAME              | ATTR_VALUE
**sample flat rate  |Activity               | N
**sample flat rate  |code                   | PLAN_999
**sample flat rate  |codes object           | object
**sample low  rate  |Activity               | Y
**sample low  rate  |code                   | PLAN_1299
**sample low  rate  |codes object           | charge
**sample low  rate  |indicator              | 0
代码:

declare
  sqlqry VARCHAR2(4001);
  cols VARCHAR2(4001);
begin
  select listagg('''' || ATTR_NAME || ''' as "' || ATTR_NAME || '"', ',') within group (order by ATTR_NAME)
  into   cols
  from   (select distinct ATTR_NAME from temp_2);
sqlqry :=
'select * from
(
    select *
    from temp_2
)
pivot
(
  MIN(ATTR_VALUE) for ATTR_NAME in (' || cols  || ')    
)'
;

使用一个表,如下所示:

create table temp_2 (TYPE, ATTR_NAME, ATTR_VALUE) as (
    select 'sample flat rate',  'Activity'    , 'N' from dual union all
    select 'sample flat rate',  'code'        , 'PLAN_999' from dual union all
    select 'sample flat rate',  'codes object', 'object' from dual union all
    select 'sample low  rate',  'Activity'    , 'Y' from dual union all
    select 'sample low  rate',  'code'        , 'PLAN_1299' from dual union all
    select 'sample low  rate',  'codes object', 'charge' from dual union all
    select 'sample low  rate',  'indicator'   , '0' from dual
)
这是一个工作示例:

SQL> variable x refcursor
SQL>
SQL> declare
  2    sqlqry VARCHAR2(4001);
  3    cols VARCHAR2(4001);
  4  begin
  5    select listagg('''' || ATTR_NAME || ''' as "' || ATTR_NAME || '"', ',') within group (order by ATTR_NAME)
  6    into   cols
  7    from   (select distinct ATTR_NAME from temp_2);
  8  sqlqry :=
  9      'select * from
 10      (
 11          select *
 12          from temp_2
 13      )
 14      pivot
 15      (
 16        MIN(ATTR_VALUE) for ATTR_NAME in (' || cols  || ')
 17      )';
 18  open :x for sqlqry;
 19  end;
 20  /

PL/SQL procedure successfully completed.

SQL> print :x

TYPE             Activity  code      codes obj indicator
---------------- --------- --------- --------- ---------
sample low  rate Y         PLAN_1299 charge    0
sample flat rate N         PLAN_999  object

SQL>

也许可以useful@Aleksej…谢谢..我成功地执行了PL/SQL,但在执行结果变量x ref cursor exec dynamic_pivot(:x)print x时出错;请发布您尝试过的内容和遇到的错误;这将帮助人们更好地理解这个问题并给出一个很好的答案抱歉:)Bind变量“x”不是宣布而是做什么?。。。您发布的内容中没有X:)@Aleksej..很抱歉造成混淆。。我们只有一张桌子。。临时工2。。我已经更新了上面的代码。它工作正常,但当我在我的真实表格中运行它时,它只显示了3个字段。。。可能真正的表有15行。。因此,这意味着应该显示15个“字段”。如果我根据其中的行数更改不同的类型,也应该等于要显示的字段数,如果我按类型筛选,则从temp_2中选择distinct ATTR_NAME,其中TYPE=“采样低速率”。。结果不会被过滤