3

如果全局声明了“关联数组变量” ,则可以在OPEN CURSOR USING语句中使用它。

如果在 package中声明了“关联数组变量” ,而在OPEN CURSOR USING语句中使用,则会出现编译错误。

下面提供了更多详细信息

我将一些值存储在一个关联数组变量中。稍后通过将它们带入 Cursor 来迭代这些值,如下所示,

strQuery := 'select DISTINCT column_value from table(CAST(:v_Assoc_Collection AS AssocArray_Date_t))';
OPEN RefCur_Item FOR strQuery USING v_Assoc_Collection;

在这里,我使用了关联数组变量“v_Assoc_Collection”,它是“AssocArray_Date_t”的一种。

如果我在包 [] 之外声明了“AssocArray_Date_t”类型CREATE OR REPLACE TYPE AssocArray_Date_t IS TABLE OF DATE;,那么它工作正常。

但是,如果我在过程中声明类型,则会出现编译错误。

错误:PLS-00457:表达式必须是 SQL 类型。在:“使用 v_Assoc_Collection 为 strQuery 打开 RefCur_Item;”

错误:PL/SQL:语句被忽略。在:“使用 v_Assoc_Collection 为 strQuery 打开 RefCur_Item;”

作为参考,下面提供了代码,

    -- Package Declaration
CREATE OR REPLACE PACKAGE AssocTypePackage
AS   
  Type CursorType IS REF CURSOR;      

  PROCEDURE AssocTypeProcedure(name IN VARCHAR2);
END;


-- Package Body
CREATE OR REPLACE PACKAGE BODY AssocTypePackage
AS
PROCEDURE AssocTypeProcedure(
  name IN VARCHAR2
)
IS  
  strQuery             VARCHAR2(4000);
  v_Assoc_Collection   AssocArray_Date_t := AssocArray_Date_t();
BEGIN
  FOR i IN 1..5
  LOOP      
    v_Assoc_Collection.EXTEND;
    v_Assoc_Collection(v_Assoc_Collection.COUNT) := <<someDate>>;               
  END LOOP;

  strQuery := 'select DISTINCT column_value from table(CAST(:v_Assoc_Collection AS AssocArray_Date_t))';
  OPEN RefCur_Item FOR strQuery USING v_Assoc_Collection;
  LOOP 
    -- ----
    -- some processing
    -- ----
  END LOOP; 
END  AssocTypeProcedure; 
END AssocTypePackage;
4

1 回答 1

6

您应该知道,在 Oracle 中,SQL 引擎和 PL/SQL 引擎是两个独立的东西,尽管它们可以相互调用。要在 SQL 语句中使用数组,它们必须对 SQL 引擎可见,即必须使用 CREATE TYPE 语句将它们声明为 SQL 类型。在包中创建的类型对 SQL 引擎是不可见的。

于 2009-05-28T05:42:07.520 回答