有没有办法声明在Oracle或特定架构中可以全局访问的队列数据结构?
在全球范围内,我意味着可以访问所有数据库或特定模式的程序
编辑:
我发现我可以通过包装制作FIFO QUEUE。所以我写了一个代码,但我得到了错误。任何人都知道我为什么会收到这个错误?
包规格:
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 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;
答案 0 :(得分:1)
解决了问题。以下代码将在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 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;
/