Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 用于表复制到其他数据库的高级队列_Oracle_Database Link_Advanced Queuing - Fatal编程技术网

Oracle 用于表复制到其他数据库的高级队列

Oracle 用于表复制到其他数据库的高级队列,oracle,database-link,advanced-queuing,Oracle,Database Link,Advanced Queuing,因此,我尝试使用高级队列将表中的数据复制到另一个数据库。我在两个数据库上创建了一个表: create table test ( id number(10) primary key, text varchar2(100) ); 然后我创建了队列 create type table_repli_payload_type AS OBJECT ( rowid_record varchar2(100) , tabelle VARCHAR2(255) , schema

因此,我尝试使用高级队列将表中的数据复制到另一个数据库。我在两个数据库上创建了一个表:

create table test
(
  id number(10) primary key,
  text varchar2(100)
);
然后我创建了队列

create type table_repli_payload_type AS OBJECT
(   rowid_record   varchar2(100)
  , tabelle        VARCHAR2(255)
  , schema         VARCHAR2(50)
);



begin
  SYS.DBMS_AQADM.create_queue_table(queue_table        => 'table_repli_queue_table',
        queue_payload_type => 'table_repli_payload_type',
        multiple_consumers => TRUE);
   SYS.DBMS_AQADM.CREATE_QUEUE (
          queue_name  => 'table_repli_queue',
          queue_table => 'table_repli_queue_table'
          );
       SYS.DBMS_AQADM.START_QUEUE (
          queue_name => 'table_repli_queue'
          );
end;
为复制编写了一个过程

create or replace procedure table_repli_callback(
                 context  RAW,
                 reginfo  SYS.AQ$_REG_INFO,
                 descr    SYS.AQ$_DESCRIPTOR,
                 payload  RAW,
                 payloadl NUMBER
                 ) AS

   r_dequeue_options    DBMS_AQ.DEQUEUE_OPTIONS_T;
   r_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
   v_message_handle     RAW(16);
   o_payload            table_repli_payload_type;
   v_error varchar2(4000);

BEGIN
   insert into log_table values(sysdate, 'start table_repli_callback');
   r_dequeue_options.msgid := descr.msg_id;
   r_dequeue_options.consumer_name := descr.consumer_name;

   DBMS_AQ.DEQUEUE(
      queue_name         => descr.queue_name,
      dequeue_options    => r_dequeue_options,
      message_properties => r_message_properties,
      payload            => o_payload,
      msgid              => v_message_handle
      );
    insert into log_table values(sysdate, 'ROWID: '||o_payload.rowid_record);

    merge into test@test_link a
    using (select * from test where rowid=o_payload.rowid_record) b on (a.id=b.id)
    when matched then
    update set text=b.text
    when not matched then
      insert values(b.id, b.text);

   COMMIT;
exception
  when others then
    v_error:=sqlerrm;
    insert into log_table values(sysdate, 'ERROR: '||v_error);
    commit;    
END;
/
并签署了它

BEGIN
   DBMS_AQADM.ADD_SUBSCRIBER (
      queue_name => 'table_repli_queue',
      subscriber => SYS.AQ$_AGENT(
                       'table_repli_queue_subscriber',
                       NULL,
                       NULL )
      );
    DBMS_AQ.REGISTER (
       SYS.AQ$_REG_INFO_LIST(
          SYS.AQ$_REG_INFO(
             'table_repli_queue:table_repli_queue_subscriber',
             DBMS_AQ.NAMESPACE_AQ,
             'plsql://table_repli_callback',
             HEXTORAW('FF')
             )
          ),
       1
       );
END;
/
我在
TEST
-表中插入/更新数据,然后执行(更改ID)这段代码

DECLARE
   r_enqueue_options    DBMS_AQ.ENQUEUE_OPTIONS_T;
   r_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
   v_message_handle     RAW(16);
   o_payload            table_repli_payload_type;
   v_rowid_record varchar2(100);
BEGIN
   select rowid
     into v_rowid_record
     from test
     where id=2;
   o_payload := table_repli_payload_type(
                   v_rowid_record, '', ''
                   );
   DBMS_AQ.ENQUEUE(
      queue_name         => 'table_repli_queue',
      enqueue_options    => r_enqueue_options,
      message_properties => r_message_properties,
      payload            => o_payload,
      msgid              => v_message_handle
      );
  COMMIT;
END;
/

如果它起作用的话,它是相当随机的。他似乎总是在
中写入一些东西,但是当它消失后,大约有一半的时间
日志表
中没有出现任何东西,第二个数据库中的数据也没有改变。

这个错误在蟾蜍身上是一种奇怪的行为。 我有时编写测试脚本,其中包含ddl、dml、selects、pl/sql块,并通过将光标放在所需命令的一部分并按shift+F9来执行它们。看起来我的蟾蜍没有执行PL/SQL块,尽管它告诉我,它执行了。
我将PL/SQL块放在另一个选项卡中,只需点击F9,每次都可以正常工作。

向日志表的插入应该是通过一个自治事务进行的,在开始执行提交时,最好在过程之外进行提交。当别人出去的时候,把衣服拿走。然后告诉我们显示了什么错误消息这里没有错误消息,因为过程是/应该从队列中调用的,但是由于一半的时间日志表中甚至没有条目,所以它似乎根本没有被调用。