在Oracle中将集合或数组(2-D)从C#传递到多级集合
是否可以将列表或多维数组从C#传递到Oracle过程。 如果是,那么创建oracle过程的方法是什么。 我可以创建一个varray:在Oracle中将集合或数组(2-D)从C#传递到多级集合,c#,.net,arrays,oracle,plsql,C#,.net,Arrays,Oracle,Plsql,是否可以将列表或多维数组从C#传递到Oracle过程。 如果是,那么创建oracle过程的方法是什么。 我可以创建一个varray: Create or Replace TYPE topic_tab IS TABLE OF VARCHAR2(400); 现在,我尝试使用以下方法创建关联数组: 但是错误来了:在此上下文中不允许使用pl/sql表。PFA的形象 然而,我不知道如何使用这个关联数组作为过程中的输入参数。因此,我将无法向程序发送任何二维或列表 请帮我做同样的事。我的方法是错误的吗 该问
Create or Replace TYPE topic_tab IS TABLE OF VARCHAR2(400);
现在,我尝试使用以下方法创建关联数组:
但是错误来了:在此上下文中不允许使用pl/sql表。PFA的形象
然而,我不知道如何使用这个关联数组作为过程中的输入参数。因此,我将无法向程序发送任何二维或列表
请帮我做同样的事。我的方法是错误的吗
该问题在使用集合的索引中。以下是oracle文档的参考表格: 不能在架构级别声明关联数组类型。 因此,要将关联数组变量作为参数传递给 独立子程序,必须在 包装规格。这样做会使类型对两个用户都可用 调用的子程序(声明该类型的形式参数) 以及调用子程序或匿名块(声明和 传递该类型的变量) 如果您无权在数据库中创建包,则可以尝试在oracle包中查找现有的适当集合类型(您可以在其中访问)。例如,我们有
DBMS\u实用工具
,DBMS\u SQL
。其中有很多集合类型,您可以利用它们。让我们看看DBMS\u实用程序.ANYDATA\u数组
。您可以在此阵列中打包第二维度集合
DECLARE
l_arr DBMS_UTILITY.ANYDATA_ARRAY;
BEGIN
l_arr(1) := anydata.ConvertCollection(topic_tab('topic1','topic2','topic3','topic4'));
END;
但是
DBMS\u实用程序。ANYDATA\u ARRAY
是binary\u integer
,看起来您必须按集合使用varchar索引。请尝试查找另一个问题。该问题在使用集合的索引中。以下是oracle文档的参考表格:
不能在架构级别声明关联数组类型。
因此,要将关联数组变量作为参数传递给
独立子程序,必须在
包装规格。这样做会使类型对两个用户都可用
调用的子程序(声明该类型的形式参数)
以及调用子程序或匿名块(声明和
传递该类型的变量)
如果您无权在数据库中创建包,则可以尝试在oracle包中查找现有的适当集合类型(您可以在其中访问)。例如,我们有DBMS\u实用工具
,DBMS\u SQL
。其中有很多集合类型,您可以利用它们。让我们看看DBMS\u实用程序.ANYDATA\u数组
。您可以在此阵列中打包第二维度集合
DECLARE
l_arr DBMS_UTILITY.ANYDATA_ARRAY;
BEGIN
l_arr(1) := anydata.ConvertCollection(topic_tab('topic1','topic2','topic3','topic4'));
END;
但是DBMS\u实用程序。ANYDATA\u ARRAY
是binary\u integer
,看起来您必须按集合使用varchar索引。试着查另一个
嘿,我已经按照要求添加了多维数组。
希望这有帮助
嘿,我试着描述一下你所联系的概念的原因
实施。希望这有帮助
嘿,我已经按照要求添加了多维数组。
希望这有帮助
嘿,我试着描述一下你所联系的概念的原因
实施。希望这有帮助
我在创建类型(Oracle 11.1)过程中没有错误。请附上完整的操作列表好吗?我在创建类型(Oracle 11.1)时没有错误。请附上您的操作完整列表?是否有其他方法可用于完成此功能。因为我的主要目的是将多维数组从C#传递到多级集合存储过程。你读过引用吗?这里有一个引号:要将关联数组变量作为参数传递给独立子程序,必须在包规范中声明该变量的类型。但这里我们不允许创建包。我们只需要创建一个接受数组或光标作为输入参数的过程。我已经在答案@TansIs中添加了一些其他方法来完成这个功能。因为我的主要目的是将多维数组从C#传递到多级集合存储过程。你读过引用吗?这里有一个引号:要将关联数组变量作为参数传递给独立子程序,必须在包规范中声明该变量的类型。但这里我们不允许创建包。我们只需要创建一个接受数组或光标作为输入参数的过程。我对答案作了一些补充@TansI,我认为这是针对单个集合的。不是多级集合。如何将多维数组(锯齿数组)从C#传递到此过程。这也可以通过对象类型完成,然后使用嵌套表类型。这将为您的代码提供多维数组。我们必须为C#传递varchar值还是直接传递一个像这个新数组[2]{new Array1,new Array2}这样的数组?您必须从C#获取oracle对象类型,并映射那些具有集合元素的对象。我认为这是针对单个集合的。不是多级集合。如何将多维数组(锯齿数组)从C#传递到此过程。这也可以通过对象类型完成,然后使用嵌套表类型。这将为您的代码提供多维数组。我们必须为C#传递varchar值吗?或者直接传递像这个新数组[2]{new Array1,new Array2}这样的数组。您必须从C#获取oracle对象类型,并将它们与集合元素进行映射
--Mutlidimensional array list pass to procedure
CREATE OR REPLACE TYPE mul_obj IS OBJECT
(
FNAME VARCHAR2(100),
LNAME VARCHAR2(100)
);
--NESTED TABLE TYPE CREATION
CREATE OR REPLACE TYPE MUL_TAB IS TABLE OF mul_obj;
CREATE OR REPLACE PROCEDURE TEST_MLDIM(
p_array_in IN MUL_TAB )
AS
BEGIN
NULL;
FOR I IN p_array_in.FIRST..p_array_in.LAST
LOOP
dbms_output.put_line(p_array_in(i).fname||' '||p_array_in(i).lname);
END LOOP;
END;
set serveroutput on;
exec TEST_MLDIM(MUL_TAB(mul_obj('Avrajit','Roy')));
**--Since associative arrays can only be declared as PLSQL objects and not as SQL objects**
-- Anonymous block
SET SERVEROUTPUT ON;
DECLARE
TYPE topic_tab IS TABLE OF VARCHAR2(400) index by VARCHAR2(10);
topic_tab_var topic_tab;
BEGIN
topic_tab_var('SON'):='Avrajit';
topic_tab_var('Father'):='Tapas';
topic_tab_var('Brother'):='Shubhojit';
dbms_output.put_line(topic_tab_var('SON'));
END;
**--By the way you can still do it without associative array
--Create normal nested table array SQL Object and us this as IN Param for procedure**
Create or Replace TYPE topic_tab IS TABLE OF VARCHAR2(400);
CREATE OR REPLACE PROCEDURE test_nested_array(
p_array_in IN topic_tab )
AS
BEGIN
NULL;
--Your code logic should come here
END;