assission123456
2019-07-18 10:40
采纳率: 100%
浏览 444

请问使用游标处理动态sql的时候出现长度超长的问题如何解决?

大佬们,请问使用游标处理动态sql的时候出现长度超长的问题该如何解决?
我是想在系统表中获取到我想要的表名,之后再对表名进行一些处理,但是我在做第一步,也就是获取我想要的表名的时候,就出现了问题。

由于我使用了动态游标循环来执行我所用的sql已获取表名,但是当循环第十次的时候,就爆出字符超长(超过了游标的嘴馋长度4K字节),请问该如何解决这个问题?详细代码如下:

set serveroutput on 
declare    
 type cur_type is ref cursor;   
 cur cur_type;   
 rec USER_TAB_COLUMNS%rowtype;   
 str varchar2(1000);   
 letter char:= '1';   
begin  
        loop           
        str:= 'WITH TAB1 AS(
                SELECT DISTINCT TABLE_NAME FROM user_tab_columns WHERE TABLE_NAME IN (
                select TABLE_NAME from user_tab_columns 
                where (table_name like ''ODS_DMS%'' OR table_name like ''ODS_CDM%'') 
                AND COLUMN_NAME=''EFFECTIVE_START_DATE''
                AND table_name NOT like ''%LISTING%'') AND COLUMN_NAME=''PK_ID''),
               TAB2 AS(
                SELECT TABLE_NAME,ROW_NUMBER()OVER(ORDER BY TABLE_NAME)PK_ID 
                FROM TAB1)
               SELECT TABLE_NAME FROM TAB2 WHERE PK_ID='||letter||' ';   
         open cur for str;   
         dbms_output.put_line('PK_ID'||letter||':');   
          loop   
         fetch cur into rec.table_name;   
         exit when cur%notfound;   
         dbms_output.put_line(rec.table_name); 
          end loop; 
        exit when letter='9';  
        close cur;   
        letter:=letter+1;   
        end loop;   
end; 
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • assission123456 2019-07-18 16:27
    已采纳

    WOC ,回头看了一下代码,发现自己傻逼了。
    letter char:= '1'; 改成letter varchar2(100):= '1'; 就好了。

    已采纳该答案
    打赏 评论
  • 西门吹雪__ 2019-07-18 10:54

    增加undo空间和undo_retention

    打赏 评论
  • ZJHZ_叶 2019-07-19 11:18

    set serveroutput on size 100000

    打赏 评论

相关推荐 更多相似问题