如何在AQADMIN中动态清除表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在AQADMIN中动态清除表相关的知识,希望对你有一定的参考价值。

当我试图动态清除QUEUE表时,我收到一个错误.Below是代码

 set serveroutput on;
declare
l_stmt varchar2(2000):='';
po_t dbms_aqadm.aq$_purge_options_t;
BEGIN
for i in (select NAME,queue_table from all_Queues where owner='AQADMIN') loop
--dbms_output.put_line(i.queue_table);
l_stmt:='DBMS_AQADM.PURGE_QUEUE_TABLE ('''||i.queue_table||''',''trunc(enq_time)<sysdate-90'',block => po_t)';
execute immediate l_stmt;
--dbms_output.put_line(l_stmt);
commit;
end loop;
END;
/

错误信息:

Error report -
ORA-00900: invalid SQL statement
ORA-06512: at line 8
00900. 00000 -  "invalid SQL statement"
*Cause:    
*Action:

要知道我的查询是否正确构建,我注释掉了执行立即部分并取消注释了DBMS_OUTPUT命令,结果发布在sql developer中并且执行完美,(下面是代码输出)。所以查询是正确的,不是确定我的代码有什么问题,

输出:

anonymous block completed

    DBMS_AQADM.PURGE_QUEUE_TABLE ('HEARTBEAT_MSG_QT','trunc(enq_time)<sysdate-90',block => po_t)

然后我在单独的SQL块中执行上面的输出,它运行正常.Below

declare
po_t dbms_aqadm.aq$_purge_options_t;
begin
DBMS_AQADM.PURGE_QUEUE_TABLE ('HEARTBEAT_MSG_QT','trunc(enq_time)<sysdate-90',po_t);
end;
/

匿名块完成

答案

当你调用execute immediate时,它是expecting dynamic SQL,而不是PL / SQL。要运行PL / SQL命令,您需要将其包装在匿名块中,就像您手动运行它时一样:

l_stmt:='DECLARE po_t dbms_aqadm.aq$_purge_options_t; BEGIN DBMS_AQADM.PURGE_QUEUE_TABLE ('''||i.queue_table||''',''trunc(enq_time)<sysdate-90'',block => po_t); END;';

或分成多行,使其更容易阅读:

l_stmt:='DECLARE po_t dbms_aqadm.aq$_purge_options_t;'
  || 'BEGIN '
  || 'DBMS_AQADM.PURGE_QUEUE_TABLE ('''||i.queue_table||''','
  || '''trunc(enq_time)<sysdate-90'',block => po_t);'
  || 'END;';

请注意,您必须在该块中重新声明po_t,因为原始声明超出了动态SQL调用的范围(实际上,原始声明现在是多余的...)。

您不需要使用动态SQL,您可以将游标值直接传递给过程:

DECLARE
  l_po dbms_aqadm.aq$_purge_options_t;
BEGIN
  for i in (select NAME,queue_table from all_Queues where owner='AQADMIN') 
  loop
    DBMS_AQADM.PURGE_QUEUE_TABLE (queue_table => i.queue_table,
      purge_condition => 'trunc(enq_time)<sysdate-90'
      purge_options=> l_po);
  end loop;
END;
/

我也删除了commit,因为它是多余的; from the docs

此过程在自治事务中提交批量消息。

以上是关于如何在AQADMIN中动态清除表的主要内容,如果未能解决你的问题,请参考以下文章

导航到Android中的另一个片段后如何清除导航堆栈

如何清除片段中的参数?

滑动 ViewPager 时如何清除片段相关状态

如何从另一个活动或底部工作表对话框/片段中关闭一个活动

使用片段清除回栈

支持动态或静态片段的不同屏幕尺寸?