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