使用C#中varchar2的PL/SQL assoc数组索引
本文关键字:SQL assoc 数组 索引 PL varchar2 使用 | 更新日期: 2023-09-27 18:26:05
我有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数组时,这是一种特殊情况。当我在integer上更改包中返回类型的索引(注释行代码id包)时,一切都可以。
你知道如何在C#中使用这个包吗?
感谢
尽管ODP.NET开发人员指南和Oracle调用接口程序员指南都没有明确提到它,而且似乎没有人确切知道,但您似乎无法绑定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来说不是问题。