Oracle PL/SQL:解决 DBMS 输出大小限制的方法

Mih*_*ael 1 sql oracle plsql oracle19c

这个问题源于,但我遇到了另一个不同的问题。

我正在使用 PL/SQL 生成大文本输出

set serveroutput on size 1000000; -- maximum limit
declare my_text clob;    
begin
 for c in ( select letter from dummy_table ) 
  loop
    my_text := my_text  || c.letter || chr(10);
  end loop;
  dbms_output.put_line(my_text);
end;
Run Code Online (Sandbox Code Playgroud)

在真实的代码中,我当然不只是连接单个字母,字符串更长,并且连接有更多元素,整体也更长。我已经将输出缓冲区大小增加到 1000000(这是最大值),这有所帮助,但是当我进一步扩展串联时,又开始失败 - 但现在出现了与输出大小无关的不同错误消息,但我通过实验知道它确实有效,因为如果我减少行数它就会起作用。

在此输入图像描述

是否可以将 clob 保存到临时表中?clob 是这里使用的正确数据类型吗?

MT0*_*MT0 5

这感觉像是一个 XY 问题,解决方案是不使用DBMS_OUTPUT而不是尝试解决您可能无法更改的问题。

创建一个表:

CREATE TABLE table_name (datetime DATE, value CLOB);
Run Code Online (Sandbox Code Playgroud)

然后直接INSERT进入表格:

DECLARE
  my_text clob;    
BEGIN
  FOR c IN (SELECT letter FROM dummy_table)
  LOOP
    my_text := my_text  || c.letter || chr(10);
  END LOOP;
  INSERT INTO table_name (datetime, value) VALUES (SYSDATE, my_text);
END;
/
Run Code Online (Sandbox Code Playgroud)

同样,您可以将其写入CLOB文件。

CLOB然后使用您正在使用的任何客户端应用程序(SQL Developer、Java、PHP 等)从表中读取值。

小提琴