要将ID列表/数组从C#传递到Oracle PL/SQL过程,you have to define an associative array type(例如,具有整数索引的表):
TYPE Ids_t_a is table of Number index by binary_integer;
我想写一个存储过程,它 Package 一个如下所示的查询:
SELECT Id, Name from Person where Id in Ids;
我知道基本的SQL,但不是PL/SQLMaven,表值类型超出了我的能力范围。我尝试过:
PROCEDURE GetData(Ids in Ids_t_a, results out sys_refcursor) IS
BEGIN
Open Results for
SELECT Id, Name from Person p where p.Id in Ids;
END;
但这会产生错误“expression is of wrong type”,这似乎是因为您无法以这种方式使用关联数组。
要对输入参数运行所需的查询,还需要执行哪些步骤?
2条答案
按热度按时间xyhw6mcr1#
在Oracle中,有两个范围可以评估语句:
关联数组是一种PL/SQL数据类型,只能在PL/SQL作用域中使用。它不能在SQL语句中使用,因此无法直接使用关联数组(并且由于某些未知原因,C#不支持传递非关联数组)。
要对输入参数运行所需的查询,还需要执行哪些步骤?
您需要将从C#传入的关联数组集合类型转换为PL/SQL作用域中的非关联数组集合类型(嵌套表集合类型或已在SQL作用域中定义的VARRAY集合类型),然后在SQL作用域中使用该非关联数组。
您可以使用
SYS.ODCINUMBERTYPE
之类的内置集合类型,也可以在SQL作用域中定义自己的集合:然后,您可以创建包和过程以及一个helper函数来执行转换:
然后包身:
VARRAY
集合资料类型,例如内建的SYS.ODCINUMBERLIST
类型,则无法使用MEMBER OF
运算子,因为它只支援巢状表格集合类型。您必须改用子查询(或链接)和表格集合表示式。例如:Open Results for SELECT p.Id, p.Name FROM Person p INNER JOIN TABLE(map_ids(ids)) i ON p.id = i.COLUMN_VALUE;
*如果有示例数据:
然后可以调用过程(从C#或PL/SQL块),传递关联数组并检索游标:
输出:
fiddle
s3fp2yjn2#
Oracle提供了一个内置类型(
sys.odcinumberlist
),它能够包含数字(这样您就不必创建自己的类型);这就是我的示例所做的,我使用的是Scott的示例模式;emp
表包含一些在某些 * 部门 * 工作的 * 雇员 * -部门列表将被传递给过程。让我们试试看:
当然,您可以使用自己的类型;只是我不想创建一个包并在那里做所有的事情,因为type(您发布的那个)不能在SQL级别创建: