问题描述
我有下表(在 SQL Commander 上运行)和过程(在 procedure 窗口上运行)。我正在尝试在 DB-VISUALIZER 上运行。
CREATE TABLE tempt( "set" VARCHAR2(1),"level" VARCHAR2(1),category VARCHAR2(3),value INT );
INSERT INTO tempt
SELECT 'A','Z','ABC',847549 FROM dual UNION ALL
SELECT 'A','Y',955808 FROM dual UNION ALL
SELECT 'A','X',983462 FROM dual UNION ALL
SELECT 'A','GHI',762369 FROM dual UNION ALL
SELECT 'A','DEF',615863 FROM dual UNION ALL
SELECT 'A',474257 FROM dual UNION ALL
SELECT 'B',959843 FROM dual UNION ALL
SELECT 'B',821704 FROM dual UNION ALL
SELECT 'B',377211 FROM dual UNION ALL
SELECT 'B',945053 FROM dual UNION ALL
SELECT 'B',919120 FROM dual UNION ALL
SELECT 'B',821704 FROM dual UNION ALL
SELECT 'C',377211 FROM dual UNION ALL
SELECT 'C',945053 FROM dual UNION ALL
SELECT 'C',919120 FROM dual UNION ALL
SELECT 'D',377211 FROM dual UNION ALL
SELECT 'D',945053 FROM dual UNION ALL
SELECT 'D',919120 FROM dual UNION ALL
SELECT 'E',377211 FROM dual UNION ALL
SELECT 'E',945053 FROM dual UNION ALL
SELECT 'E','IJK',326886 FROM dual
CREATE OR REPLACE PROCEDURE "SCHEMA.pivot"(v_recordset out sys_refcursor)
AS
--v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_cols_1 VARCHAR2(32767);
v_cols_2 VARCHAR2(32767);
BEGIN
SELECT LISTAGG( ''''||"level"||''' AS "'||"level"||'"',',' )
WITHIN GROUP ( ORDER BY "level" DESC )
INTO v_cols_1
FROM (
SELECT DISTINCT "level"
FROM tempt
);
SELECT LISTAGG( 'MAX(CASE WHEN category = '''||category||''' THEN "'||"level"||'" END) AS "'||"level"||'_'||category||'"',' )
WITHIN GROUP ( ORDER BY category,"level" DESC )
INTO v_cols_2
FROM (
SELECT DISTINCT "level",category
FROM tempt
);
v_sql :=
'SELECT "set",'|| v_cols_2 ||'
FROM
(
SELECT *
FROM tempt
PIVOT
(
MAX(value) FOR "level" IN ( '|| v_cols_1 ||' )
)
)
GROUP BY "set"
ORDER BY "set"';
DBMS_OUTPUT.PUT_LINE(v_sql);
OPEN v_recordset FOR v_sql;
end pivot;
当我执行它时,出现以下错误:-ORA-01489: result of string concatenation is too long ORA-06512
我已经看到了大多数涉及stackoverflow的答案,并且它们都具有相同的解决方法,即使用xmlagg
所提供的示例代码是: rtrim( xmlcast( xmlagg( xmlelement(e,val || ',') order by id) as clob),') as clob_agg
我尝试将其合并到我的代码中,但是如果这是解决此错误的唯一方法,则无法正确获取它,如何将listagg
转换为xmlagg
并运行它
Oracle错误消息经常令人误解,我也想知道代码前面是否有任何错误。 proc
成功编译,但仅在执行期间抛出上述错误
我仍然无法解决此问题,它不是前端/本地设置问题是错误,而且我不知道如何在此代码中合并xmlagg
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)