如何在匿名块执行时打印值

Posted

技术标签:

【中文标题】如何在匿名块执行时打印值【英文标题】:How to print a value while an anonymous block is executing 【发布时间】:2019-01-31 20:54:12 【问题描述】:

我正在尝试这个匿名块:

SET SERVEROUTOUT ON;
DECLARE
VAR_1:=1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('Variable'||VAR_1);
VAR_1:=VAR_1+1;
EXIT WHEN VAR_1=10;
END LOOP;
END;
/

所以我希望系统在循环中打印我的消息,而不是在块结束时打印(因为它在最后打印所有消息)。

谢谢。

【问题讨论】:

它是块的一个例子,我的原始块是关于分区表的(并且循环中的每次重复都需要很多时间)所以这就是我希望我的消息在循环中打印的原因。 DBMS_OUTPUT 仅在调用块结束后打印结果。如果要查看长时间运行的进程的进度,应将其记录到表中。 AskTom 推荐github.com/OraOpenSource/Logger 查看重复的问题***.com/questions/1729739/… PL/SQL 不是交互式的。 DBMS_OUTPUT 缓冲区是在调用结束时传回客户端应用程序的数组。如果您想在代码执行时检查值,那么您可以尝试使用调试器。 它实际上是一个匿名块吗?如果没有,您可以使用 oracle 并发程序并将所有内容写入日志。 【参考方案1】:

为变量添加数据类型

SET SERVEROUTOUT ON;
DECLARE
VAR_1 NUMBER :=1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('Variable'||VAR_1);
VAR_1:=VAR_1+1;
EXIT WHEN VAR_1=10;
END LOOP;
END;

【讨论】:

【参考方案2】:

我的回复与 DBMS_OUTPUT 无关,但它可以让您在应用程序运行时观察它。查看 DBMS_APPLICATION_INFO.SET_MODULE。它有两个参数。一个是module_name,它可以用来在你的匿名块上放置一个“标签”。第二个参数是 action_name,它可以让您将一串文本与您的“标签”相关联。操作名称可以设置为您的“'Variable'||VAR_1”。您可以在循环中调用 SET_MODULE。然后,在单独的会话中,您可以查询包含使用 SET_MODULE 设置的 MODULE 和 ACTION 列的 v$session。

【讨论】:

以上是关于如何在匿名块执行时打印值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL、PL/pgSQL 上执行匿名代码块切换 CASE 语句?

如何在 DB2 中执行 SQL 匿名块?

如何在 C# 中从 Npgsql 4.1.5.0 执行匿名块 PL/pgSQL (PostgreSQL 13)

使用来自 java 的值执行匿名 pl/sql 块文件

如何在 Ruby 中结束块的执行?

匿名函数lambda