首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >收听高级Oracle队列(AQ)

收听高级Oracle队列(AQ)
EN

Stack Overflow用户
提问于 2018-06-20 07:58:18
回答 1查看 1.3K关注 0票数 2

我正在检查Go迁移现有C++应用程序的能力。主要任务之一是主动侦听高级Oracle队列(不进行轮询)。在Java和C++中,长期以来都有支持它的现有库。

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

EN

回答 1

Stack Overflow用户

发布于 2018-08-06 07:22:41

我有一个实现,使用"gopkg.in/goracle.v2“包连接到Oracle,以及通用的Go库"database/sql”。按照我的做法,我可以在PL/SQL过程中从AQ读取代码,这是我从Go代码中调用的。虽然这不是最好的方法--我实际上要改变它,使它不依赖于存储的oracle过程--但它还是有效的。代码如下所示:

Oracle /SQL:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50943153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档