Plsql 将PIVOT IN子句值作为变量

Plsql 将PIVOT IN子句值作为变量,plsql,oracle11g,Plsql,Oracle11g,你能帮我解决这个错误吗。一切都很好,但我对pivot IN子句印象深刻,我想通过使用变量传递值 CREATE OR REPLACE PROCEDURE Sample ( INPUT_TABLE_ID IN NUMBER,OUTPUT_TABLE IN VARCHAR2 ) IS AGG_COLUMNS VARCHAR2(2000); EXECUTE IMMEDIATE 'SELECT COLUMNS FROM COLUMN_NAMES' INTO AGG_COLUMNS; EXEC

你能帮我解决这个错误吗。一切都很好,但我对pivot IN子句印象深刻,我想通过使用变量传递值

CREATE OR REPLACE PROCEDURE Sample
(
  INPUT_TABLE_ID IN NUMBER,OUTPUT_TABLE IN VARCHAR2
)
IS
  AGG_COLUMNS VARCHAR2(2000);

 EXECUTE IMMEDIATE 'SELECT COLUMNS FROM COLUMN_NAMES' INTO AGG_COLUMNS;
 EXECUTE IMMEDIATE      
      'CREATE TABLE '||OUTPUT_TABLE||' AS
      (
          SELECT *
          FROM BW_COLUMN_ROW_CELL_JOIN
          PIVOT
          (
            MAX(STRING_VALUE)
            FOR COLUMN_NAME  IN ( '||AGG_COLUMNS ||')
          )
      )';
错误是:

00936. 00000 -  "missing expression"

谢谢。

您的
AGG\u列应符合以下格式:

Value1 as ColumnName1, Value2 as ColumnName2, ...

您必须对
列\u name
表中的值进行如下编码:

SQL> create table  COLUMN_NAMES(COLUMNS  varchar2(20));

Table created.


SQL> insert into column_names values ('''A'',''B''');

1 row created.

SQL>
SQL> create table  BW_COLUMN_ROW_CELL_JOIN(column_name  varchar2(15),
  2                                        string_value  varchar2(15));

Table created.

SQL> insert into   BW_COLUMN_ROW_CELL_JOIN values ('A', 'test');

1 row created.

SQL> insert into   BW_COLUMN_ROW_CELL_JOIN values ('B', 'pickle');

1 row created.

SQL> insert into   BW_COLUMN_ROW_CELL_JOIN values ('C', 'foo');

1 row created.

SQL>
SQL> commit;

Commit complete.

SQL> CREATE OR REPLACE PROCEDURE Sample
  2  (
  3    INPUT_TABLE_ID IN NUMBER,OUTPUT_TABLE IN VARCHAR2
  4  )
  5  IS
  6    AGG_COLUMNS VARCHAR2(2000);
  7  begin
  8   EXECUTE IMMEDIATE 'SELECT COLUMNS FROM COLUMN_NAMES' INTO AGG_COLUMNS;
  9   EXECUTE IMMEDIATE
 10        'CREATE TABLE '||OUTPUT_TABLE||' AS
 11        (
 12            SELECT *
 13            FROM BW_COLUMN_ROW_CELL_JOIN
 14            PIVOT
 15            (
 16              MAX(STRING_VALUE)
 17              FOR COLUMN_NAME  IN ( '||AGG_COLUMNS ||')
 18            )
 19        )';
 20  end;
 21  /

Procedure created.

SQL> exec Sample(1, 'TEST');

PL/SQL procedure successfully completed.

SQL> select * from test;

'A'             'B'
--------------- ---------------
test            pickle
或者在程序中执行:

SQL> insert into column_names values ('A,B');

1 row created.

SQL>
SQL> create table  BW_COLUMN_ROW_CELL_JOIN(column_name  varchar2(15),
  2                                        string_value  varchar2(15));

Table created.

SQL> insert into   BW_COLUMN_ROW_CELL_JOIN values ('A', 'test');

1 row created.

SQL> insert into   BW_COLUMN_ROW_CELL_JOIN values ('B', 'pickle');

1 row created.

SQL> insert into   BW_COLUMN_ROW_CELL_JOIN values ('C', 'foo');

1 row created.

SQL>
SQL> commit;

...

SQL> CREATE OR REPLACE PROCEDURE Sample
  2  (
  3    INPUT_TABLE_ID IN NUMBER,OUTPUT_TABLE IN VARCHAR2
  4  )
  5  IS
  6    AGG_COLUMNS VARCHAR2(2000);
  7  begin
  8   EXECUTE IMMEDIATE 'SELECT COLUMNS FROM COLUMN_NAMES' INTO AGG_COLUMNS;
  9   EXECUTE IMMEDIATE
 10        'CREATE TABLE '||OUTPUT_TABLE||' AS
 11        (
 12            SELECT *
 13            FROM BW_COLUMN_ROW_CELL_JOIN
 14            PIVOT
 15            (
 16              MAX(STRING_VALUE)
 17              FOR COLUMN_NAME  IN ( '''||replace(AGG_COLUMNS, ',', ''',''') ||''')
 18            )
 19        )';
 20  end;
 21  /

Procedure created.

SQL> exec Sample(1, 'TEST');

PL/SQL procedure successfully completed.

SQL> select * from test;

'A'             'B'
--------------- ---------------
test            pickle

变量“AGG_COLUMNS”将包含逗号分隔的值。是否可以在PIVOT in子句中提供一个包含逗号分隔值的变量。@user1990383-如果
AGG_COLUMNS
包含逗号分隔的字符串值列表,则这些字符串必须用单引号括起来,如
'val1',val2',…
。列名是可选的。实际上,要求动态查找逗号分隔的值。。。之后,我需要通过传递AGG_COLUMNS变量来透视。@user1990383-在执行它之前只显示动态SQL。您将看到列表的格式是否正确。