Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle中将集合或数组(2-D)从C#传递到多级集合_C#_.net_Arrays_Oracle_Plsql - Fatal编程技术网

在Oracle中将集合或数组(2-D)从C#传递到多级集合

在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的形象 然而,我不知道如何使用这个关联数组作为过程中的输入参数。因此,我将无法向程序发送任何二维或列表 请帮我做同样的事。我的方法是错误的吗 该问

是否可以将列表或多维数组从C#传递到Oracle过程。 如果是,那么创建oracle过程的方法是什么。 我可以创建一个varray:

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;