Plsql 将PIVOT IN子句值作为变量
你能帮我解决这个错误吗。一切都很好,但我对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
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。您将看到列表的格式是否正确。