我可以将多大的关联数组传递给 Oracle 存储过程?

How large an associative array can I pass into an Oracle stored procedure?

几年前,我为 Oracle 数据库编写了一个导入程序,它将数据加载到 table。数据作为三个独立的关联数组传递到过程中。导入代码使用 ODP.Net 在 C# 中编写,过程在 PL/SQL.

客户现在报告了 table 中缺少预期行的问题。传递给存储过程的关联数组的元素数量或大小限制是多少?

过程和数组声明为:

TYPE ArrayOfStoreNumber IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
TYPE ArrayOfStoreName IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
TYPE ArrayOfStoreType IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;

PROCEDURE ImportDestinationStores(
    pStoreNumbers IN ArrayOfStoreNumber,
    pStoreNames IN ArrayOfStoreName,
    pStoreTypes IN ArrayOfStoreType,
    pCount IN BINARY_INTEGER
);

根据 Oracle 文档,没有限制。当然,有些地方的大小是有限的,但现实中你永远不应该达到这样的限制。

根据我在文档 (Understanding PL/SQL Collection Types) 中看到的内容,它是无限制的。所以这取决于你的RDBMS的内存。

对于大型集合的操作,您应该考虑使用 NOCOPY 提示。 通常参数是按值调用的(实际变量的副本传递给 function/procedure),但 NOCOPY 提示将其变成按引用调用(实际变量传递给 function/procedure)。 同样的事情适用于 return 值。

您只需像这样扩展您的程序签名:

PROCEDURE ImportDestinationStores(
            pStoreNumbers IN NOCOPY ArrayOfStoreNumber,
            pStoreNames IN NOCOPY ArrayOfStoreName,
            pStoreTypes IN NOCOPY ArrayOfStoreType,
            pCount IN BINARY_INTEGER
);

但是既然你告诉我们客户端缺少数据,我就不会在这里开始搜索了。 ;-)