如何从 C 代码访问 dbms_output 缓冲区?

Posted

技术标签:

【中文标题】如何从 C 代码访问 dbms_output 缓冲区?【英文标题】:How to access the dbms_output buffer from C code? 【发布时间】:2021-08-17 00:44:42 【问题描述】:

各种 Oracle 解决方案都涉及带有 dbms_output 包的 PL/SQL sn-ps,尤其是 dbms_output.put_line()

这些使用 sqlplus 解释器,但我们的一些代码使用 C API(oci.hociapr.h 和朋友)。

有没有办法通过这些函数获取 DBMS 缓冲区的内容?

【问题讨论】:

你看过这个oracle示例代码吗? Programmer's Guide to the Oracle7 Server Call Interface Oracle 12.2 调用接口的 Oracle 文档位于 docs.oracle.com/en/database/oracle/oracle-database/12.2/lnoci/… -- tl;dr 所以不确定您是否可以调用 DBMS_OUTPUT 中的过程。 DBMS_OUTPUT 文档:docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/… 是的,@ryyker,示例代码几乎是 API 唯一可用的文档。不幸的是,它没有提到dbms_output。我知道,包中的程序在服务器内部的一些缓冲区上运行——我的问题是,客户端如何访问它们。 sqlplus 和各种 Oracle 客户端 GUI 客户端都这样做,但它们的源没有打开......我可以调用 SQL 语句,但获得结果的唯一已知方法是处理 数据集(当语句是 select ... 时)。 【参考方案1】:

您可以使用过程DBMS_OUTPUT.GET_LINE 从缓冲区中检索信息。 C 代码我帮不了你,但下面的代码是要调用的 Oracle PL/SQL 过程。

在运行调用DBMS_OUTPUT.PUT_LINE 的 PL/SQL sn-p 之前,运行此过程以启用缓冲区:

dbms_output.enable;

运行 PL/SQL sn-p 后,您可以像这样检索单行输出:

declare
    v_line varchar2(32767);
    v_status integer;
begin
    dbms_output.get_line(v_line, v_status);

    --Do something with the output in V_LINE here
    ...
end;
/

对于更大的输出,您可能需要调用DBMS_OUTPUT.GET_LINES,它会返回一个字符串数组和行数。有关过程和参数的完整描述,请参阅包文档。

【讨论】:

sqlplus 使用dbms_output 很容易——而且例子比比皆是。从 C 代码中执行它是我在这里寻找的。​​span> 抱歉,C 部分我帮不上忙。但是我提供的代码都是 PL/SQL,没有特定于 sqlplus 的。无论您如何调用当前的 PL/SQL sn-p,您都可以简单地在其前后添加这些命令。 看起来没有人从 C(甚至 C++)程序访问 Oracle。仍然有 C 专家和 SQL 专家,但没有人有 both...当然不是 SO... @MikhailT。这里有一些用户同时具备这两种技能,但并不多。我添加了一个更具体的标签,希望这能吸引他们回答这个问题。 检查这个(我的项目)github.com/tora-tool/tora/blob/master/src/widgets/tooutput.cpp 基本上你需要调用 DBMS_OUTPUT: ENABLE GET_LINES GET_LINE

以上是关于如何从 C 代码访问 dbms_output 缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

DBMS_OUTPUT 缓冲区大小(客户端或数据库端)

如何从 docker 访问显示设备

如何从 Linux 帧缓冲区获取 RGB 像素值?

oracle 10.2.0 如何在plsql 里设置 dbms_output.put_line 打印长度

如何访问 AudioQueue 缓冲区中的数据?

Linux内存从0到1学习笔记(8.7 DMA-BUF代码解读)