更新时间:2025-06-04 GMT+08:00
U0100085:GaussDB不支持TABLE函数中使用子查询
描述
在 Oracle 中TABLE函数内可以包含子查询,例如TABLE(SELECT F_SPLIT(a) from dual);GaussDB不支持该语法。
数据库类型与版本
- 源库类型与版本:UGO 支持的 Oracle 版本。
- 目标库类型与版本:UGO 支持的 GaussDB 版本。
语法示例
CREATE OR REPLACE PROCEDURE P_CFG_B777_LRUPARSER (p_RAW_ID number , p_ATA_BLKIDENT varchar2) is begin declare cursor iCur_ATABlk is SELECT replace(COLUMN_VALUE,CHR(03)) FROM TABLE( SELECT f_split(replace(replace(replace(ATA_BLKCONT,'TXT LRU ','TXT LRU-'),CHR(13),''),':'||CHR(10)||'TXT ',':'),'LRU ') FROM CFG_B777_ATABLK WHERE RAW_ID = p_RAW_ID AND ATA_BLKIDENT = p_ATA_BLKIDENT ) WHERE COLUMN_VALUE IS NOT NULL; ii_LRUBlk varchar(4000); begin open iCur_ATABlk; loop fetch iCur_ATABlk into ii_LRUBlk; exit when iCur_ATABlk%notfound; end loop; close iCur_ATABlk; end; end P_CFG_B777_LRUParser; /
改造建议
取出cursor游标声明的整个select语句,然后将table函数里面的select取出来查询结果into给table类型的变量,最后open cursor for select语句,子查询的select使用table类型的变量替代即可。
GaussDB改写后:
CREATE OR REPLACE PROCEDURE P_CFG_B777_LRUPARSER (p_RAW_ID number , p_ATA_BLKIDENT varchar2) is begin declare iCur_ATABlk sys_refcursor; V_f_split T_SPLIT := T_SPLIT(); ii_LRUBlk VARCHAR(4000); begin SELECT f_split(replace(replace(replace(ATA_BLKCONT,'TXT LRU ','TXT LRU-'),CHR(13),''),':'||CHR(10)||'TXT ',':'),'LRU ') into V_f_split FROM CFG_B777_ATABLK WHERE RAW_ID = p_RAW_ID AND ATA_BLKIDENT = p_ATA_BLKIDENT; open iCur_ATABlk for SELECT replace(COLUMN_VALUE,CHR(03),'') FROM UNNEST_TABLE(V_f_split) AS COLUMN_VALUE WHERE COLUMN_VALUE IS NOT NULL; loop fetch iCur_ATABlk into ii_LRUBlk; exit when iCur_ATABlk%notfound; end loop; close iCur_ATABlk; end; end ; /