2

我有一個存儲過程,它具有嵌套表的幾個參數。可以從ODP.NET調用具有嵌套表參數的Oracle存儲過程嗎?

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中不可訪問的另一種類型的集合)。

回答

1

我做了它的工作是這樣的:

  • 創建像數據庫中的類型 「創建或替換TYPE NT_LNG爲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"; 

好運

1

Oracle還提供一個免費的工具以生成映射到嵌套表類型的自定義.NET類:

下載「用於Visual Studio的Oracle開發工具」(免費),打開服務器資源管理器,打開「用戶定義類型」節點,找到您的用戶定義類型,右鍵單擊並選擇「生成自定義類」。

這裏的演練,以幫助您開始使用的UDT一般:

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

相關問題