簡體   English   中英

在C#中通過varchar2使用PL / SQL assoc數組索引

[英]using PL/SQL assoc array index by varchar2 in C#

我有PL / SQL代碼:

create or replace 
package        TEST_PKG2 as
  type AssocArray is table of varchar2(20) index by binary_integer;
  type AssocArray_varchar is table of varchar2(20) index by varchar2(10);
  --type AssocArray_varchar is table of varchar2(20) index by integer;

  function assoc_arry_return(Param1 in AssocArray) return AssocArray_varchar;
end TEST_PKG2;

create or replace 
package body        TEST_PKG2 as 
  function assoc_arry_return(Param1 in AssocArray) return AssocArray_varchar
    is
  v_return_value AssocArray_varchar;    
  begin
    v_return_value('name1'):=Param1(1);
    v_return_value('name2'):=Param1(2);
    v_return_value('name3'):=Param1(3);

    return v_return_value;
  end assoc_arry_return;
end TEST_PKG2; 

控制代碼以檢查pl / sql:

set serveroutput on
declare
  assoc_array test_pkg2.AssocArray;
  assoc_array_return test_pkg2.AssocArray_varchar;

begin
  assoc_array(1):='test1';
  assoc_array(2):='test2';
  assoc_array(3):='test3';
  assoc_array_return:= test_pkg2.assoc_arry_return(assoc_array);
  dbms_output.put_line(assoc_array_return.first||' - '||assoc_array_return(assoc_array_return.first));
end;

和用於執行此功能的C#代碼:

command = new OracleCommand("TEST_PKG2.assoc_arry_return", OracleConnection);
                command.CommandType = CommandType.StoredProcedure;
                OracleParameter return_value = new OracleParameter();
                return_value.OracleDbType = OracleDbType.Varchar2;
                return_value.Direction = ParameterDirection.ReturnValue;
                return_value.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
                return_value.Size=3;
                return_value.ArrayBindSize = new int[3] { 20, 20, 20 };
                command.Parameters.Add(return_value);

                OracleParameter Param4 = command.Parameters.Add("Param1", OracleDbType.Varchar2);
                Param4.Direction = ParameterDirection.Input;
                Param4.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
                Param4.Value = new string[3] { "First Element", "Second Element", "Third Element" };
                Param4.Size = 3;
                Param4.ArrayBindSize = new int[3] { 20, 20, 20 };
                Param4.ArrayBindStatus = new OracleParameterStatus[3] { OracleParameterStatus.Success, OracleParameterStatus.Success, OracleParameterStatus.Success };
                command.ExecuteNonQuery();

當我使用Thic代碼執行應用時,執行在最后一行終止,錯誤為“ ORA-06550:第1行,第15列:PLS-00382:表達式類型錯誤ORA-06550:第1行,第7列:PL / SQL:語句忽略”

當我使用由varchar2索引的assoc數組時,這是一種特殊情況。 當我用整數類型的包中的返回類型(通過注釋行代碼id包)來更改索引時,一切正常。

您知道如何在C#中使用此程序包嗎?

謝謝

盡管《 ODP.NET開發人員指南》和《 Oracle Call Interface程序員指南》都沒有明確提及,而且似乎也沒有人知道,但是看來您無法綁定varchar2索引的關聯數組。 我從C#(通過ODP.NET 10.2)和PHP 5.something(通過OCI)進行了嘗試,但均未成功。

因此,我嘗試使用數據類型對象。

在第一步中,我創建data_type對象

create or replace type STB_JIG_TARLOG_VALUE as object
(
    NAME varchar2(300),
    VALUE varchar2(500)
)

create or replace type
    STB_JIG_TARLOG_VALUES is table of STB_JIG_TARLOG_VALUE 

它們不是包裝的一部分。

我現在也可以將此類型用作函數的返回類型:

function get_data(...) return STB_JIG_TARLOG_VALUES
  is 
   items STB_JIG_TARLOG_VALUES := STB_JIG_TARLOG_VALUES();
  begin
   items.extend;
   items(1):= STB_JIG_TARLOG_VALUE('key_name','key_value');
   ...
end get_data;

最后我們只需選擇以下內容即可獲得返回值:

select * from table (get_data(...));

列名在STB_JIG_TARLOG_VALUE中定義,將值添加到返回值的方式可以不同(例如,循環...)

並且從該查詢中獲取數據對DataReader來說不是問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM