如何从 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.h
、ociapr.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 缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章