【发布时间】:2020-07-07 02:03:28
【问题描述】:
我是 oracle 新手,我正在尝试使用以下查询将动态生成的列名传递到 oracle 中
DECLARE
v_cols VARCHAR2(100);
v_query VARCHAR2(4000);
BEGIN
SELECT LISTAGG('''' ||product_code||'''',',') WITHIN GROUP (ORDER BY product_code)
INTO v_cols
FROM (
SELECT DISTINCT product_code
FROM pivot_test
);
v_query:='
SELECT *
FROM (
SELECT product_code,
quantity
FROM pivot_test)
PIVOT (sum(quantity) AS qunts
FOR product_code IN ('|| v_cols ||'));';
EXECUTE IMMEDIATE v_query;
--dbms_output.Put_line(v_cols);
--dbms_output.Put_line(v_query);
END;
生成的列是'A','B','C','D',使用动态列生成的查询是
SELECT *
FROM (
SELECT
product_code,
quantity
FROM pivot_test) PIVOT (sum(quantity) AS qunts FOR product_code IN ('A','B','C','D'));
当我接受上述查询并单独运行它时,它运行正常,但是当我使用 EXECUTE IMMEDIATE v_query; 时,我得到了错误
ORA-00911: invalid character
ORA-06512: at line 20
我不知道是什么导致了这里的问题,请指出这个动态查询执行有什么问题
用于测试的值
CREATE TABLE pivot_test
(
id NUMBER,
customer_id NUMBER,
product_code VARCHAR2(5),
quantity NUMBER
);
INSERT INTO pivot_test VALUES (1,1,'A',10);
INSERT INTO pivot_test VALUES (2,1,'B',20);
INSERT INTO pivot_test VALUES (3,1,'C',30);
INSERT INTO pivot_test VALUES (4,2,'A',40);
INSERT INTO pivot_test VALUES (5,2,'C',50);
INSERT INTO pivot_test VALUES (6,3,'A',60);
INSERT INTO pivot_test VALUES (7,3,'B',70);
INSERT INTO pivot_test VALUES (8,3,'C',80);
INSERT INTO pivot_test VALUES (9,3,'D',90);
INSERT INTO pivot_test VALUES (10,4,'A',100);
COMMIT;
【问题讨论】:
-
您不希望在动态构建语句的末尾有分号。如果删除它,问题会消失吗?
-
@JustinCave 是的,问题消失了,但是,它显示查询已完成,没有显示结果,不知道为什么
标签: oracle oracle11g pivot dynamic-sql