你会考虑打印CLOB
结果集吗?然后,您可以使用一个PIPELINED
函数(更多关于它们的信息:Tim Hall 的 PIPELINED 函数),它将CLOB
逐行返回,请看下面的示例:
CREATE TABLE my_clob_tab (
id NUMBER,
clob_col CLOB
)
/
INSERT INTO my_clob_tab
VALUES (1,
to_clob('first line' || chr(10) ||
'second line, a longer one' || chr(10) ||
'third'))
/
CREATE OR REPLACE TYPE t_my_line_str AS TABLE OF VARCHAR2(2000)
/
CREATE OR REPLACE FUNCTION print_clob_func(p_id IN NUMBER)
RETURN t_my_line_str PIPELINED
AS
v_buffer VARCHAR2(32767);
v_clob CLOB;
v_len NUMBER;
v_offset NUMBER := 1;
v_line_break_pos NUMBER;
v_amount NUMBER;
BEGIN
SELECT clob_col
INTO v_clob
FROM my_clob_tab
WHERE id = p_id;
IF v_clob IS NOT NULL THEN
v_len := dbms_lob.getlength(v_clob);
WHILE v_offset < v_len
LOOP
v_line_break_pos := instr(v_clob, chr(10), v_offset);
IF v_line_break_pos = 0 THEN
v_amount := v_len - v_offset + 1;
ELSE
v_amount := v_line_break_pos - v_offset;
END IF;
dbms_lob.read(v_clob, v_amount, v_offset, v_buffer);
v_offset := v_offset + v_amount + 1;
PIPE ROW (v_buffer);
END LOOP;
END IF;
END;
/
(可以更改函数,以便将CLOB
您从过程中获得的参数作为参数)
代码逐行读取内容CLOB
(我假设行分隔符是CHR(10)
- 如果您使用的是 Windows,则可以将其更改为CHR(10) || CHR(13)
)并将PIPE
每一行写入SELECT
语句。
读取 clob 的函数也可以通过 将输出打印到标准输出dbms_output.put_line
,但这会比较棘手,因为您必须考虑到标准输出的最大行长度是有限的,如果我错了,请纠正我, 2000 个字符,但它是可行的(不幸的是,现在无法尝试该解决方案)。同时,请检查上面的建议,如果这对你有用,请给我一些反馈。
回到解决方案,现在我们可以发出以下SELECT
语句:
SELECT COLUMN_VALUE AS clob_line_by_line FROM TABLE(print_clob_func(1));
这将为我们提供以下输出:
CLOB_LINE_BY_LINE
-------------------------
第一行
第二行,更长的
第三
在 SQLFiddle 检查它:SQLFiddle 示例