如何在oracle中使用daclare队列数据结构?

如何在oracle中使用daclare队列数据结构?,oracle,queue,Oracle,Queue,是否有任何方法可以声明在Oracle或特定架构中全局可访问的队列数据结构? 对于全局,我的意思是在数据库或特定模式的所有过程中都可以访问 已编辑: 我发现我可以按包进行FIFO排队。所以我写了一个代码,但我得到了错误。有人知道我为什么会出现这个错误吗? 包装规格: CREATE OR REPLACE PACKAGE HR.TEST_PACKAGE IS PROCEDURE ADDQ (TABLE_NAME VARCHAR2); FUNCTION DELQ RETURN VARCHAR2

是否有任何方法可以声明在Oracle或特定架构中全局可访问的队列数据结构?
对于全局,我的意思是在数据库或特定模式的所有过程中都可以访问


已编辑:
我发现我可以按包进行FIFO排队。所以我写了一个代码,但我得到了错误。有人知道我为什么会出现这个错误吗?
包装规格:

CREATE OR REPLACE PACKAGE HR.TEST_PACKAGE IS
  PROCEDURE ADDQ (TABLE_NAME VARCHAR2);
  FUNCTION DELQ RETURN VARCHAR2;
END TEST_PACKAGE;
/
CREATE OR REPLACE PACKAGE HR.TEST_PACKAGE IS
  PROCEDURE ADDQ (TABLE_NAME VARCHAR2);
  FUNCTION DELQ RETURN VARCHAR2;
END TEST_PACKAGE;
/
包体:

CREATE OR REPLACE PACKAGE BODY HR.TEST_PACKAGE IS
  REAR NUMBER := 0;
  FRONT NUMBER := 0;
  TYPE QUEUE_TYPE IS VARRAY(10) OF VARCHAR2(15);
  QUEUE_ARRAY QUEUE_TYPE;
PROCEDURE ADDQ (TABLE_NAME VARCHAR2) IS
BEGIN
  REAR := (REAR+1) MOD 10;
  IF (REAR = 0) THEN
    REAR := 10;
  END IF;
  QUEUE_ARRAY(REAR) := TABLE_NAME;
END ADDQ;
FUNCTION DELQ RETURN VARCHAR2 IS
BEGIN
  IF (FRONT = REAR) THEN
    RETURN 'EMPTY';
  ELSE
    FRONT := (FRONT + 1) MOD 10;
    IF (FRONT = 0) THEN
      front := 10;
    END IF;
    RETURN QUEUE_ARRAY(FRONT);
  END IF;
END DELQ;
END TEST_PACKAGE;
/
CREATE OR REPLACE PACKAGE BODY HR.TEST_PACKAGE IS
  REAR NUMBER := 0;
  FRONT NUMBER := 0;
  TYPE QUEUE_TYPE IS VARRAY(10) OF VARCHAR2(15);
  QUEUE_ARRAY QUEUE_TYPE := QUEUE_TYPE() ;
PROCEDURE ADDQ (TABLE_NAME VARCHAR2) IS
BEGIN
  REAR := (REAR+1) MOD 10;
  IF (REAR = 0) THEN
    REAR := 10;
  END IF;
  QUEUE_ARRAY.EXTEND;
  QUEUE_ARRAY(REAR) := TABLE_NAME;
END ADDQ;
FUNCTION DELQ RETURN VARCHAR2 IS
BEGIN
  IF (FRONT = REAR) THEN
    RETURN 'EMPTY';
  ELSE
    FRONT := (FRONT + 1) MOD 10;
    IF (FRONT = 0) THEN
      front := 10;
    END IF;
    RETURN QUEUE_ARRAY(FRONT);
  END IF;
END DELQ;
END TEST_PACKAGE;
/
当我运行此示例代码时:

create or replace procedure hr.test is
begin
  hr.test_package.addq('a');
  hr.test_package.addq('b');
  dbms_output.put_line(hr.test_package.delq);
end test;
我得到这个错误:

ORA-06531: Reference to uninitialized collection
06531. 00000 -  "Reference to uninitialized collection"
*Cause:    An element or member function of a nested table or varray
           was referenced (where an initialized collection is needed)
           without the collection having been initialized.
*Action:   Initialize the collection with an appropriate constructor
           or whole-object assignment.
如果要运行这部分代码,则会发生此错误:

QUEUE_ARRAY(REAR) := TABLE_NAME;  

问题解决了。以下代码将在oracle中声明FIFO队列。
addq过程将在队列中插入,delq函数将从队列中删除并返回一个值。
包装规格:

CREATE OR REPLACE PACKAGE HR.TEST_PACKAGE IS
  PROCEDURE ADDQ (TABLE_NAME VARCHAR2);
  FUNCTION DELQ RETURN VARCHAR2;
END TEST_PACKAGE;
/
CREATE OR REPLACE PACKAGE HR.TEST_PACKAGE IS
  PROCEDURE ADDQ (TABLE_NAME VARCHAR2);
  FUNCTION DELQ RETURN VARCHAR2;
END TEST_PACKAGE;
/
包体:

CREATE OR REPLACE PACKAGE BODY HR.TEST_PACKAGE IS
  REAR NUMBER := 0;
  FRONT NUMBER := 0;
  TYPE QUEUE_TYPE IS VARRAY(10) OF VARCHAR2(15);
  QUEUE_ARRAY QUEUE_TYPE;
PROCEDURE ADDQ (TABLE_NAME VARCHAR2) IS
BEGIN
  REAR := (REAR+1) MOD 10;
  IF (REAR = 0) THEN
    REAR := 10;
  END IF;
  QUEUE_ARRAY(REAR) := TABLE_NAME;
END ADDQ;
FUNCTION DELQ RETURN VARCHAR2 IS
BEGIN
  IF (FRONT = REAR) THEN
    RETURN 'EMPTY';
  ELSE
    FRONT := (FRONT + 1) MOD 10;
    IF (FRONT = 0) THEN
      front := 10;
    END IF;
    RETURN QUEUE_ARRAY(FRONT);
  END IF;
END DELQ;
END TEST_PACKAGE;
/
CREATE OR REPLACE PACKAGE BODY HR.TEST_PACKAGE IS
  REAR NUMBER := 0;
  FRONT NUMBER := 0;
  TYPE QUEUE_TYPE IS VARRAY(10) OF VARCHAR2(15);
  QUEUE_ARRAY QUEUE_TYPE := QUEUE_TYPE() ;
PROCEDURE ADDQ (TABLE_NAME VARCHAR2) IS
BEGIN
  REAR := (REAR+1) MOD 10;
  IF (REAR = 0) THEN
    REAR := 10;
  END IF;
  QUEUE_ARRAY.EXTEND;
  QUEUE_ARRAY(REAR) := TABLE_NAME;
END ADDQ;
FUNCTION DELQ RETURN VARCHAR2 IS
BEGIN
  IF (FRONT = REAR) THEN
    RETURN 'EMPTY';
  ELSE
    FRONT := (FRONT + 1) MOD 10;
    IF (FRONT = 0) THEN
      front := 10;
    END IF;
    RETURN QUEUE_ARRAY(FRONT);
  END IF;
END DELQ;
END TEST_PACKAGE;
/

也许您可以创建一个具有嵌套表的对象类型,以及从中添加和删除元素的方法。您希望实现什么?您运行的是哪个版本,SE还是EE?我的版本是EE,我想在oracle中有一个队列数据结构,因为队列是指FIFO数组。