坑爹的plsql dev dbms_output输出长度限制

在尝试使用PL/SQL Developer通过DBMS_OUTPUT输出超过100万字符时,遇到buffer溢出问题,即使设置为unlimited仍受限。然而,SQL*Plus在相同情况下能成功处理长脚本输出,揭示了两者之间的差异。解决长脚本spooling的最佳选择是使用SQL*Plus。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候需要用dbms_output  spool出一些脚本,所以很受长度100w个字符这个限制的困扰,但是后来发现在10GR2版本下,buffer已经可以很长很长,而行长可以达到32767个字符,为什么plsql dev里还不行呢,今天有空做了个实验

 

首先 在plsql dev里打开一个command window

SQL> set serveroutput on size unlimited;
SQL> declare
  2  x varchar2(4000);
  3  begin
  4  x:=rpad('*',250,'*');
  5  for i in 1..4000 loop
  6  dbms_output.put_line(x);
  7  end loop;
  8  end;
  9  /

ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 32
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 97
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 112
ORA-06512: 在 line 7

我了个去啊!说好的unlimited呢......
好吧还是100w吧

SQL> set serveroutput on size 1000000;
SQL> declare
  2  x varchar2(4000);
  3  begin
  4  x:=rpad('*',250,'*');
  5  for i in 1..4000 loop
  6  dbms_output.put_line(x);
  7  end loop;
  8  end;
  9  /

PL/SQL procedure successfully completed

哦 好了,100w呢(要是钱就好了.... `ω`)

那么再来一个100w+1?

SQL> set serveroutput on size unlimited;
SQL> declare
  2  x varchar2(4000);
  3  begin
  4  x:=rpad('*',250,'*');
  5  for i in 1..4000 loop
  6  dbms_output.put_line(x);
  7  end loop;
  8  dbms_output.put_line('*');
  9  end;
 10  /

ORA-20000: ORU-10027: buffer overflow, limit of 1000000 bytes
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 32
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 97
ORA-06512: 在 "SYS.DBMS_OUTPUT", line 112
ORA-06512: 在 line 9

真是不负众望的溢出了啊.....

 

然后打开一个sqlplus

先不做任何限制,只打开显示,直接来个100w+1吧

SQL> set serveroutput on;
SQL> declare
  2  x varchar2(4000);
  3  begin
  4  x:=rpad('*',250,'*');
  5  for i in 1..4000 loop
  6  dbms_output.put_line(x);
  7  end loop;
  8  dbms_output.put_line('*');
  9  end;
 10  /

PL/SQL 过程已成功完成

真是给人一种莫名其妙的挫败感呢......一下就完成了......
恩,实际上就算循环8k次也就是 200w个字符也完全没有问题呢

所以说要spool出一个特别长的脚本的时候 还是sqlplus吧.....

 

 

最后是今天的卖萌小故事

oracle 还有plsql dev 之间的三角关系感觉就像

我:亲~
oracle:亲~
plsqldev:...

  100w次以后

我:亲~
oracle:亲~
plsqldev:尼玛!亲够了没有啊!老子是死死团的,都给我去死!

ora-剧终

### 创建 DBMS_SCHEDULER 作业 在 Oracle 数据库中,`DBMS_SCHEDULER` 是用于管理复杂调度请求的强大工具。通过 PL/SQL 可以方便地创建和管理这些作业。 要创建一个新的 `DBMS_SCHEDULER` 作业,可以使用如下所示的过程: ```plsql BEGIN DBMS_SCHEDULER.create_job ( job_name => 'MY_JOB', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN my_procedure(); END;', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=DAILY; BYHOUR=10; BYMINUTE=0; BYSECOND=0', enabled => TRUE ); END; / ``` 上述代码定义了一个名为 `MY_JOB` 的新作业[^1]。该作业将在每天上午十点执行一次存储过程 `my_procedure()`。设置 `enabled` 参数为 `TRUE` 表示立即启用此作业并按计划运行。 对于已经禁用的任务调度器,可以通过下面的命令重新激活它: ```plsql EXEC DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('SCHEDULER_DISABLED', 'FALSE'); ``` 这会使得整个数据库实例上的所有已配置窗口能够正常工作[^2]。 如果想要查看当前有哪些活动的时间窗以及它们的状态,则可查询数据字典视图 `dba_scheduler_windows` 如下: ```plsql DECLARE BEGIN FOR rec IN (SELECT * FROM dba_scheduler_windows w WHERE w.enabled = 'TRUE') LOOP DBMS_OUTPUT.PUT_LINE(rec.window_name); END LOOP; END; / ``` 这段脚本遍历所有启用了的时间窗,并打印其名称到控制台输出流中[^3]。 当需要监控特定作业的历史记录时,可以从表 `USER_SCHEDULER_JOB_RUN_DETAILS` 中获取相关信息,例如最近几次尝试的结果摘要: | JOB_NAME | LOG_DATE | STATUS | |--|-------------------|------------| | MY_JOB | 2023-09-28T10:00Z | SUCCEEDED | 以上表格展示了部分字段的内容,实际日志条目可能还包含更多细节如错误编号 (`ERROR#`) 和 CPU 使用情况(`CPU_USED`) 等等[^4]。 需要注意的是,在某些情况下提交带有参数的工作或程序可能会受到限制;具体取决于所使用的版本和其他因素[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值