使用记录作为参数调用Oracle存储过程

时间:2010-03-02 12:39:08

标签: c# oracle stored-procedures parameters record

是否可以调用记录类型为IN参数的Oracle存储过程?

在Oracle中,我有一个记录定义:

TYPE R_InData_tab IS RECORD ( ... );
TYPE InData_tab IS TABLE OF R_InData_tab INDEX BY BINARY_INTEGER;

现在我想将此记录类型设置为参数:

PROCEDURE myProcedure (inRecord IN myPackage.InData_tab);

从我的C#代码中调用此过程。

有没有人有想法?

由于

3 个答案:

答案 0 :(得分:1)

我认为您仅限于OracleType中定义的内置Oracle类型。如果是这样,您将不得不编写一个采用常规参数的存储过程,构造类型值并调用原始过程。

答案 1 :(得分:1)

你可以通过发送一个代码块作为语句来实现这一点(自从我使用Oracle以来已经有一段时间了,所以语法可能略有偏差:

DECLARE
    param indata_tab;
BEGIN
    FOR i IN 1 .. :field1%COUNT LOOP
         param(i).field1 := :field1(i);
         param(i).field2 := :field2(i);
    END LOOP;
    myProcedure(param);
END;

然后将field1和field2参数绑定到数组。

答案 2 :(得分:0)

如果你正在使用Oracle Data Provider for .NET(ODP.NET),那么在不使用erikkallen建议的按摩的情况下,call the procedure directly肯定是可能的。

但是,我不确定这会解决您的问题。看起来您正在定义包含该过程的包中的类型。为了使用上面链接的方法,需要使用DDL将数据类型创建为数据库中的单独对象:

CREATE TYPE R_InData_tab AS OBJECT ( ... );
CREATE TYPE InData_tab AS TABLE OF R_InData_tab;

这可能需要对包进行一些细微的更改,因为不支持INDEX BY类型作为模式对象,因此需要使用嵌套表(或varrays)。