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