更新时间: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 ;
/