gpt4 book ai didi

go - 聆听高级 Oracle 队列 (AQ)

转载 作者:IT王子 更新时间:2023-10-29 01:44:16 25 4
gpt4 key购买 nike

我正在检查 Go 迁移现有 C++ 应用程序的能力。主要任务之一是主动监听(无轮询)高级 Oracle 队列。在 Java 和 C++ 中,很早就有支持它的现有库。

我在 Go 中找不到任何类似的东西(库和示例)。你能帮我吗?

最佳答案

我有一个实现,其中我使用“gopkg.in/goracle.v2”包连接到 Oracle,以及通用 Go 库“database/sql”。我这样做的方式是,我有从我的 Go 代码调用的 PL/SQL 过程中的 AQ 读取的代码。尽管这不是最好的方法——实际上我将对其进行更改,使其不依赖于存储的 oracle 过程——但它确实有效。代码如下所示:

Oracle PL/SQL 过程:

PROCEDURE GetAQMessage ( out_content    OUT VARCHAR2, in_acknowledge IN  VARCHAR2 DEFAULT 'N' )
IS
dyn_sql VARCHAR2(32000);
l_content VARCHAR2(4000);
BEGIN

dyn_sql := '
DECLARE
l_payload MESSAGE_TYPE := MESSAGE_TYPE (NULL);
l_msg_id RAW(16);
l_dequeue_options DBMS_AQ.DEQUEUE_OPTIONS_T;
l_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
BEGIN
DBMS_AQ.DEQUEUE(
queue_name => '''|| v_queue_name ||''',
dequeue_options => l_dequeue_options,
message_properties => l_message_properties,
payload => l_payload,
msgid => l_msg_id
);
:b_output := l_payload.message;
END;';

EXECUTE IMMEDIATE dyn_sql USING OUT l_content;
-- Return the content to the OUT parameter
out_content := l_content;

-- Permanently removes the message from the Queue
IF in_acknowledge = 'Y' THEN
COMMIT;
END IF;

END GetAQMessage;

Go代码:

func GetAQMessage(transaction *sql.Tx) (string, error) {
var outResult string
var resErr error
var debug int

configuration = conf.Read()

//Run the command
_, resErr = transaction.Exec(`BEGIN CONSENT.GETAQMESSAGE(:1,:2) ; END;`, sql.Out{Dest: &outResult}, "N")

return outResult, resErr
}

关于go - 聆听高级 Oracle 队列 (AQ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50943153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com