是否可以从 ODP.NET 调用具有嵌套表参数的 Oracle 存储过程?

发布于 2024-10-29 22:30:20 字数 538 浏览 1 评论 0原文

我有一个存储过程,其中有几个参数是嵌套表。

CREATE TYPE FOO_ARRAY AS TABLE OF NUMBER;
CREATE TYPE BAR_ARRAY AS TABLE OF INTEGER;

CREATE PROCEDURE Blah(
  iFoos IN FOO_ARRAY,
  iBars IN BAR_ARRAY,
  oResults OUT SOMECURSORTYPE
) AS
BEGIN
  OPEN oResults FOR
    SELECT *
    FROM SomeTable T
    JOIN TABLE(iFoos) foos ON foos.column_value = T.foo
    JOIN TABLE(iBars) bars ON bars.column_value = T.bar;    
END

使用ODP.NET(Oracle.DataAccess.dll),有没有办法调用这个存储过程并将数组传递给这些参数?我发现传递数组的唯一方法是参数类型是否为关联数组(一种在 SQL 中无法访问的不同类型的集合)。

I've got a stored procedure that has a couple parameters that are nested tables.

CREATE TYPE FOO_ARRAY AS TABLE OF NUMBER;
CREATE TYPE BAR_ARRAY AS TABLE OF INTEGER;

CREATE PROCEDURE Blah(
  iFoos IN FOO_ARRAY,
  iBars IN BAR_ARRAY,
  oResults OUT SOMECURSORTYPE
) AS
BEGIN
  OPEN oResults FOR
    SELECT *
    FROM SomeTable T
    JOIN TABLE(iFoos) foos ON foos.column_value = T.foo
    JOIN TABLE(iBars) bars ON bars.column_value = T.bar;    
END

Using ODP.NET (Oracle.DataAccess.dll), is there a way to call this stored procedure and pass arrays into these parameters? The only way I've found to pass arrays is if the parameter type is an associative array (a different type of collection that isn't accessible within SQL).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吃素的狼 2024-11-05 22:30:20

我以这种方式工作:

  • 在数据库中创建一个类型,例如“创建或替换 TYPE NT_LNG IS TABLE OF varchar(2);”
  • 创建实现 IOracleCustomType 和 INullable 的类 (SimpleStringArray)
  • 创建实现 IOracleCustomTypeFactory (SimpleStringArrayFactory) 的类。使用此属性“[OracleCustomTypeMappingAttribute("KNL.NT_LNG")]”对其进行标记

,然后传递如下参数:

 SimpleStringArray sa1 = new SimpleStringArray();
 sa1.Array = new String[]{"aaa","bbb"};
 OracleParameter param = new OracleParameter("p_lngsrc", OracleDbType.Array, sa1, ParameterDirection.Input);
 param.UdtTypeName = "KNL.NT_LNG";

Good Luck

I made it work this way:

  • Create a type in the database like "create or replace TYPE NT_LNG IS TABLE OF varchar(2);"
  • Create a Class implementing IOracleCustomType and INullable (SimpleStringArray)
  • Create a Class implementing IOracleCustomTypeFactory (SimpleStringArrayFactory). Mark it with this attribute "[OracleCustomTypeMappingAttribute("KNL.NT_LNG")]"

and you pass the parameter like this:

 SimpleStringArray sa1 = new SimpleStringArray();
 sa1.Array = new String[]{"aaa","bbb"};
 OracleParameter param = new OracleParameter("p_lngsrc", OracleDbType.Array, sa1, ParameterDirection.Input);
 param.UdtTypeName = "KNL.NT_LNG";

Good Luck

太傻旳人生 2024-11-05 22:30:20

Oracle 还提供了一个免费工具来生成映射到嵌套表类型的自定义 .NET 类:

下载“Oracle Developer Tools for Visual Studio”(免费),打开服务器资源管理器,打开“用户定义类型”节点,找到您的用户定义类型,右键单击并选择“生成自定义类”。

以下是帮助您开始使用 UDT 的一般演练:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/hol08/dotnet/udt/udt_otn.htm

Oracle also offers a free tool to generate a custom .NET class that maps to your nested table type:

Download "Oracle Developer Tools for Visual Studio" (free), open Server Explorer, open "User Defined Types" node, find your user defined type, right click and choose "Generate Custom Class".

Here's a walkthrough to get you started with UDTs in general:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/hol08/dotnet/udt/udt_otn.htm

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文