dongqian1893 2018-06-20 07:58
浏览 99

收听高级Oracle队列(AQ)

I'm checking Go ability to migrate an existing C++ application. One of the main task is to listen actively (no polling) an Advanced Oracle Queue. In Java and C++ there are existing libraries supporting it since a long time.

I could not find anything similar in Go (libraries & examples). Could you help me with that?

  • 写回答

1条回答 默认 最新

  • dongling4383 2018-08-06 07:22
    关注

    I have an implementation whereby I'm using the "gopkg.in/goracle.v2" package to connect to Oracle, along with the generic Go library "database/sql". The way I did it, I have the code to read from the AQ in a PL/SQL procedure which I'm calling from my Go code. Although this is not the best approach - and I'm actually going to change it so that it doesn't rely on a stored oracle procedure - it works. The code looks something like the following:

    Oracle PL/SQL proc:

    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 code:

    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
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计