如何在匿名块执行时打印值
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 语句?