【发布时间】:2023-01-19 21:20:31
【问题描述】:
我有一个采用 PL/SQL 关联数组值输入的存储过程,如下所示:
TYPE IntegerArray is table of Number index by binary_integer;
PROCEDURE GetItems(itemIds in IntegerArray, results out sys_refcursor)
IS BEGIN
Open Results for
select id, name, price from Item where id in (select * from table(itemIds));
END;
它是从 C# 调用的,输入项 ID 按特定顺序排列,应保留在输出中。
我能够编写 C# 代码,它将根据输入 List<int> ids 对结果对象数组 List<(int id,string name,int price)> data 进行排序,因为存在 1:1 映射输入 - 输出,但我无法判断是否我需要to,否则 Oracle 将根据输入自动按顺序返回行。这有保证吗?甲骨文甚至有输入中的排序概念?
【问题讨论】:
-
如果 SELECT 语句中没有 ORDER BY 子句,则无法保证数据将以任何特定顺序返回。它是关于关系数据库的;表格中的行没有任何顺序(通常,它被比作装满苹果的篮子——哪个苹果是“第一个”?)。因此,以所需顺序返回行的唯一方法是应用 ORDER BY 子句。
-
@Littlefoot 这个过程不知道顺序,它是由输入定义的....我认为这回答了我的问题,调用 C# 代码将要需要处理订购。我什至不确定 PL/SQL 关联数组是否对 Oracle 有排序。如果这是答案,请随时提供
-
我有点惊讶你没有收到错误
PL/SQL: ORA-22905: cannot access rows from a non-nested table item。据我所知,select * from table(itemIds)仅适用于嵌套表,即没有index by binary_integer子句。 -
@WernfriedDomscheit 是的。我让这个工作但我不确定为什么 - 我期待需要基于 SO 答案的额外步骤但是然后它运行所以我停止寻找!
-
通常 PL/SQL 关联数组中的项目是有序的,请参阅PL/SQL Collections and Records:“索引按排序顺序存储,而不是创建顺序。对于字符串类型,排序顺序由初始化参数 NLS_SORT 和 NLS_COMP 确定。" 但是,通过使用
SELECT,订单变得不确定。