我正在检查Go迁移现有C++应用程序的能力。主要任务之一是主动侦听高级Oracle队列(不进行轮询)。在Java和C++中,长期以来都有支持它的现有库。
我在Go中找不到类似的东西(库和示例)。你能帮我吗?
发布于 2018-08-06 07:22:41
我有一个实现,使用"gopkg.in/goracle.v2“包连接到Oracle,以及通用的Go库"database/sql”。按照我的做法,我可以在PL/SQL过程中从AQ读取代码,这是我从Go代码中调用的。虽然这不是最好的方法--我实际上要改变它,使它不依赖于存储的oracle过程--但它还是有效的。代码如下所示:
Oracle /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
}https://stackoverflow.com/questions/50943153
复制相似问题