日期:2014-05-17  浏览次数:21186 次

dbms_sql解决动态SQL字符过长问题
下面这个存储过程是一个包里用来执行SQL的入口,对执行一般SQL(字符比较短的)执行都是正常的(里面有一段注释的代码),但是有一些字符太长的SQL不能直接执行,所以在参数传递时用了CLOB类型,使用DBMS_SQL包来执行,但是下面的代码执行好像有问题?

SQL code

--执行SQL语句
  PROCEDURE P_EXECUTE_SQL(A_OBJECT_NAME VARCHAR2,
                          A_CONTENT     VARCHAR2,
                          A_SQL         CLOB) IS
  
    V_CURSOR        NUMBER;
    V_INDEX         NUMBER := 1;
    V_COUNT_EXECUTE NUMBER;
    --V_SQL_SUB       VARCHAR2(32767);
    V_SQLS DBMS_SQL.VARCHAR2A;
   
  BEGIN
    IF A_SQL IS NOT NULL THEN
      /*EXECUTE IMMEDIATE V_SQL_SUB;
      P_WRITE_LOG_SEGMENTS(A_OBJECT_NAME,
                           A_CONTENT || '(' || SQL%ROWCOUNT || ')',
                           A_SQL);
      COMMIT;*/
    
      --生成要执行的动态SQL
      BEGIN
      
        LOOP
        
          V_SQLS(V_INDEX) := SUBSTR(A_SQL, (V_INDEX - 1) * 4000 + 1, 4000);
          IF LENGTH(V_SQLS(V_INDEX)) < 4000 THEN
            EXIT;
          ELSE
            V_INDEX := V_INDEX + 1;
          END IF;
        
        END LOOP;
      
        V_CURSOR := DBMS_SQL.OPEN_CURSOR;
        FOR I IN 1 .. V_SQLS.LAST LOOP
          P_WRITE_LOG_SEGMENTS(A_OBJECT_NAME, A_CONTENT, V_SQLS(I));
        END LOOP;
      
        DBMS_SQL.PARSE(C             => V_CURSOR,
                       STATEMENT     => V_SQLS,
                       LB            => V_SQLS.FIRST,
                       UB            => V_SQLS.LAST,
                       LFFLG         => TRUE,
                       LANGUAGE_FLAG => DBMS_SQL.NATIVE);
        V_COUNT_EXECUTE := DBMS_SQL.EXECUTE(V_CURSOR);
        P_WRITE_LOG_SEGMENTS(A_OBJECT_NAME,
                             A_CONTENT || '(' || V_COUNT_EXECUTE || ':' ||
                             SQL%ROWCOUNT || ')',
                             A_SQL);
        DBMS_SQL.CLOSE_CURSOR(C => V_CURSOR);
      EXCEPTION
        WHEN OTHERS THEN
          IF DBMS_SQL.IS_OPEN(C => V_CURSOR) THEN
            DBMS_SQL.CLOSE_CURSOR(C => V_CURSOR);
          END IF;
          RAISE;
      END;
    
    END IF;
  
  END P_EXECUTE_SQL;



------解决方案--------------------
很感兴趣,但是不能解答你的问题,关注中!
------解决方案--------------------
很想知道你的CLOBSQL是怎么操作的