在 Oracle 12c 中使用 CLOB 时字符串连接的结果太长

Result of string concatenation is too long when using CLOB in Oracle 12c

我在使用 CLOB 字段时遇到 "result of string concatenation is too long" 错误。结果字段是

varSQLConcat CLOB;

拼接语句为

varSQLConcat := CONCAT(TO_CLOB(varSel_CREATION), TO_CLOB(varWhere_New));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(' AND SY_INPUT_UID_NEW.SUBMISSION_TYPE = '));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB('''CREATION'''));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(' UNION '));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varSel_SUBMISSION));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varWhere_New));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(' AND (SY_INPUT_UID_NEW.SUBMISSION_TYPE = '));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB('''SUBMISSION'''));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB('OR SY_INPUT_UID_NEW.SUBMISSION_TYPE = '));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB('''NEW_W_REG_PARENT'')'));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(' UNION '));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varSel_ROLLOVER));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varWhere_Rollover));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(' UNION '));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varSel_EMBED));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varWhere_Embed));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(' UNION '));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varSel_LIFECYCLE));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varWhere_Lifecycle));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(' UNION '));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varSel_MARK));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varWhere_Mark));
   varSQLConcat := CONCAT(varSQLConcat, TO_CLOB(varOrder_By));

以下语句出现错误:

OPEN cRecord FOR varSQLConcat; 

这是在 Oracle 12c 下。

我没有真正的解决方案,但这可能是一个解决方法:

DECALRE

    cmd DBMS_SQL.VARCHAR2A;
    cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
    res INTEGER;
    cRecord := SYS_REFCURSOR;

BEGIN
    cmd(1) := varSel_CREATION; -- each line is limited by 32767 characters!
    cmd(cmd.LAST+1) := varWhere_New;
    cmd(cmd.LAST+1) := 'AND SY_INPUT_UID_NEW.SUBMISSION_TYPE = ';
    cmd(cmd.LAST+1) := '''CREATION'''; 
    ...


    DBMS_SQL.PARSE(cur, cmd, cmd.FIRST, cmd.LAST, TRUE, DBMS_SQL.NATIVE); 
    res := DBMS_SQL.EXECUTE(cur);   
    cRecord := DBMS_SQL.TO_REFCURSOR(cur);

END;