Oracle - PLS-00642:SQL语句中不允许使用本地集合类型

时间:2016-03-02 13:50:38

标签: oracle

我是ORACLE编程的新手,我正在尝试将表列值与传入的数组进行比较,这样做的时间相当令人沮丧。

以下是包头的类型声明。

TYPE T_STRING_ARRAY IS TABLE OF VARCHAR2(5); 

这是使用它的函数。

create or replace PACKAGE BODY TEST_PACK IS 

  FUNCTION TEST_LOG_FN 
  (
        PI_START_DATE IN VARCHAR2,
        PI_END_DATE IN VARCHAR2, 
        PI_LOG_TYPE IN T_STRING_ARRAY
  )
   RETURN T_REF_CURSOR
    AS  
    PO_RESULT T_REF_CURSOR;

  BEGIN   


  OPEN PO_RESULT FOR
  SELECT
        EL.ENTRY_BASE_LOG_ID,
          EL.APP_NAME,
          EL.APP_MODULE,
          EL.CREATION_DATE,
          EL.APP_STATUS,
          EL.LOG_TYPE
    FROM 
          LG_ENTRY_BASE_LOG EL
  WHERE     
          CREATION_DATE > PI_START_DATE AND
          CREATION_DATE  < PI_END_DATE AND              
         (EL.LOG_TYPE IN PI_LOG_TYPE OR PI_LOG_TYPE = NULL);

  RETURN 
      PO_RESULT;

EXCEPTION
      WHEN NO_DATA_FOUND THEN 
           RETURN NULL;
       END TEST_LOG_FN;
END;

我得到的错误是PLS-00642:SQL语句中不允许使用本地集合类型。我在线阅读

&#34;为了避免使用PLS-00642,需要在模式级别定义集合;因此,您需要使用具有CREATE TYPE语法的Oracle DDL将varray表定义为实际表。 &#34;

http://www.dba-oracle.com/t_pls_00642_local_collection_types_not_allowed_in_sql_statement.htm

我不知道该怎么做,也没有在网上找到任何我可以使用的参考资料。有人可以帮助我吗?如果有人知道更简单的方法来查看数组中是否存在字符串,那么这也是一个完全可以接受的答案。

2 个答案:

答案 0 :(得分:1)

您可以使用Oracle 12C或更高版本的软件包规范中定义的类型。

这一行:

[Route("product/update")]
[ResponseType(typeof(void))]
public async Task<IHttpActionResult> PutProduct(int id, Product product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    if (id != product.Id)
    {
        return BadRequest();
    }

    db.Entry(product).State = EntityState.Modified;

    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return StatusCode(HttpStatusCode.NoContent);
}

需要:

(EL.LOG_TYPE IN PI_LOG_TYPE OR PI_LOG_TYPE = NULL)

在12C之前,您需要使用CREATE TYPE在数据库中定义类型。 select的语法无论如何都是相同的。

答案 1 :(得分:0)

您可以使用专为集合设计的MEMBER OF运算符,而不是使用IN

(PI_LOG_TYPE = NULL OR EL.LOG_TYPE MEMBER OF PI_LOG_TYPE);

如@TonyAndrews所述如果您使用的是Oracle 12c,那么您可以使用PL / SQL中的包中定义的集合,但在早期版本中,您需要使用CREATE TYPE语句在SQL中定义它们。