Oracle队列实现

Oracle队列实现

-- 核心技术点:for update

创建测试表

create table t

( id       number primary key,

processed_flag varchar2(1),

payload  varchar2(20)

);

创建函数索引

create index

t_idx on

t( decode( processed_flag, ‘N‘, ‘N‘ ) );

插入几条测试数据

insert into t

select r,

case when mod(r,2) = 0 then ‘N‘ else ‘Y‘ end,

‘payload ‘ || r

from (select level r

from dual

connect by level <= 5)

/

方式一,通过函数返回未锁定行

创建队列获取一行数据的函数

支持Oracle8.0及以后的版本

create or replace

function get_first_unlocked_row

return t%rowtype

as

resource_busy exception;

pragma exception_init( resource_busy, -54 );

l_rec t%rowtype;

begin

for x in ( select rowid rid

from t

where decode(processed_flag,‘N‘,‘N‘) = ‘N‘)

loop

begin

select * into l_rec

from t

where rowid = x.rid and processed_flag=‘N‘

for update nowait;

return l_rec;

exception

when resource_busy then null;

when no_data_found then null;

end;

end loop;

return null;

end;

/

获取未加锁的第一行数据

declare

l_rec  t%rowtype;

begin

l_rec := get_first_unlocked_row;

dbms_output.put_line( ‘I got row ‘ || l_rec.id || ‘, ‘ || l_rec.payload );

end;

/

eoda/muphy> I got row 2, payload 2

获取未加锁的第二行数据

declare

pragma autonomous_transaction;

l_rec  t%rowtype;

begin

l_rec := get_first_unlocked_row;

dbms_output.put_line( ‘I got row ‘ || l_rec.id || ‘, ‘ || l_rec.payload );

commit;

end;

/

eoda/muphy> I got row 4, payload 4

方式二,直接通过skip locked实现

获取未加锁的第一行数据

declare

l_rec t%rowtype;

cursor c

is

select *

from t

where decode(processed_flag,‘N‘,‘N‘) = ‘N‘

FOR UPDATE

SKIP LOCKED;

begin

open c;

fetch c into l_rec;

if ( c%found )

then

dbms_output.put_line( ‘I got row ‘ || l_rec.id || ‘, ‘ || l_rec.payload );

end if;

close c;

end;

/

eoda/muphy> I got row 2, payload 2

获取未加锁的第二行数据

declare

pragma autonomous_transaction;

l_rec t%rowtype;

cursor c

is

select *

from t

where decode(processed_flag,‘N‘,‘N‘) = ‘N‘

FOR UPDATE

SKIP LOCKED;

begin

open c;

fetch c into l_rec;

if ( c%found )

then

dbms_output.put_line( ‘I got row ‘ || l_rec.id || ‘, ‘ || l_rec.payload );

end if;

close c;

commit;

end;

/

eoda/muphy> I got row 4, payload 4

--参考自Oracle编程艺术 深入理解数据库体系结构第三版

原文地址:https://www.cnblogs.com/muphy/p/10890075.html

时间: 2024-10-29 17:41:40

Oracle队列实现的相关文章

oracle队列类型

本文参照oracle11gr2官方文档<Oracle? Database Reference11g Release 2 (11.2)> 队列定义:oracle队列存在共享内存中串行访问数据库资源的锁.它产生于一次回话或者一个事物. 队列查找:在系统数据库词典视图 DBA_LOCK_INTERNAL和DBA_LOCK的Lock_type那一列. 产生原因:oracle资源唯一地标识一个对象,可以被不同的会话实例之间在一个实例(本地资源)或(全球资源).每个会话试图锁定资源所以就会产生队列 队列名

(转载)Oracle AWR报告指标全解析

Oracle AWR报告指标全解析 2014-10-16 14:48:04 分类: Oracle [性能调优]Oracle AWR报告指标全解析 2013/08/31 BY MACLEAN LIU 26条评论 [性能调优]Oracle AWR报告指标全解析 开Oracle调优鹰眼,深入理解AWR性能报告:http://www.askmaclean.com/archives/awr-hawk-eyes-training.html 开Oracle调优鹰眼,深入理解AWR性能报告 第二讲: http:

Oracle AWR报告指标解析一例

啥是AWR? ===================================================================================================== AWR (Automatic Workload Repository) 一堆历史性能数据,放在SYSAUX表空间上, AWR和SYSAUX都是10g出现的,是Oracle调优的关键特性: 大约1999年左右开始开发,已经有15年历史 默认快照间隔1小时,10g保存7天.11g保存8

oracle 11g RAC 的一些基本概念(四)

RAC 在Grid Infrastructure安装完以后,我们把注意力转移到集群上的Oracle软件的安装上来.我们看到,Grid Infrasctructure提供了运行RAC的框架,包括集群通讯链接.节点分离.节点成员关系等服务.ASM是Oracle存储数据库的首选方式.RAC利用这些概念并扩展了需要的基本服务. 安装选项 成功安装了Grid Infrastructure/Clusterware以后,Oracle Universal Installer检测到集群环境的建立,然后提供安装整个

oracle AWR详解

原文地址:https://blog.csdn.net/elvis_lfc/article/details/52326148 啥是AWR? ===================================================================================================== AWR (Automatic Workload Repository) 一堆历史性能数据,放在SYSAUX表空间上, AWR和SYSAUX都是10g出现的,是

ODAC(V9.5.15) 学习笔记(二)控件列表

ODAC的控件有26个,简单介绍如下: TOraSession  管理Oracle的连接  TOraQuery  使用SQL进行数据获取,自动将更新提交数据库  TSmartQuery    在处理字段不多而记录多的大型表时更有效率的Query控件.  TOraSQL  SQL语句执行控件,包括PL/SQL块等,不返回数据集结果  TOraTable  对单表操作的控件  TOraStoredProc      存储过程控件,允许编辑光标数据并以参数形式返回  TOraNestedTable 

Oracle高级队列介绍

原始链接:http://www.oracle-developer.net/display.php?id=411 oracle高级队列介绍 高级队列Advanced Queuing(AQ)在oracle多个版本都可得到.他是oracle原生消息软件并且在每一个版本都在加强. 这篇文章提供了一个AQ的高级概览.尤其是我们将看到如何启动一个队列并进行入列--出列操作,还有通过通知创建异步出列. 注意AQ支持数据库意外的消息监听(例如JMS消息队列).本文仅涉及数据库内部消息通信. 要求: 本例要求指定

Oracle 中的作业队列和队列调度

一,启动执行作业的进程 在 Oracle 中,是使用 “作业队列协调进程(CJQ0)” 这个协调数据库实例的作业队列的后台进程,来监视作业队列中的作业表(JOB$),并启动作业队列进程(Jnnn).而当需要执行作业的时候,作业队列Jnnn 将会执行由 DBMS_JOBS 包创建的作业请求,如下面的一个过程就是从 DBMS_JOBS 包中提取出来的        * 提交的作业请求的过程声明:        PROCEDURE submit    ( job       OUT BINARY_IN

oracle 高级队列

转载:http://www.idevelopment.info/data/Oracle/DBA_tips/Advanced_Queuing/AQ_2.shtml Overview This article provides a brief overview on configuring and using Oracle's Advanced Queuing features using PL/SQL. This will demonstrate the basic functionality o