使用CLOB字段时,我收到“字符串连接的结果太长”错误。结果字段是
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;