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

时间:2016-02-03 09:59:49

标签: c# .net arrays oracle plsql

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

Create or Replace TYPE topic_tab IS TABLE OF VARCHAR2(400);

现在我尝试使用此link创建它的关联数组:

CREATE TYPE tutorial_tab IS 
            TABLE OF topic_tab INDEX BY VARCHAR2(400); 

但是会出现错误:在此上下文中不允许使用pl / sql表。 PFA图像。

但是,我无法知道在过程中使用此关联数组作为输入参数的方法。由于这个原因,我无法向程序发送任何二维或清单。

请帮助我。我的做法是错的吗?

enter image description here

2 个答案:

答案 0 :(得分:0)

问题在于逐个收集使用。这里只是oracle doc的参考表格:

  

无法在架构级别声明关联数组类型。   因此,将关联数组变量作为参数传递给   独立子程序,您必须在a中声明该变量的类型   包装规格。这样做可以使类型同时可用   调用子程序(声明该类型的形式参数)   和调用子程序或匿名块(声明和   传递该类型的变量。)

http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#LNPLS99930

如果您无权在数据库中创建包,则可以尝试在oracle包中查找某些现有的适当集合类型(您有权访问)。例如,我们有DBMS_UTILITYDBMS_SQL。那里有很多可以利用的集合类型。我们来看DBMS_UTILITY.ANYDATA_ARRAY。您可以在此数组中打包第二个维度集合。

DECLARE
     l_arr  DBMS_UTILITY.ANYDATA_ARRAY;
BEGIN
    l_arr(1) := anydata.ConvertCollection(topic_tab('topic1','topic2','topic3','topic4'));
END;  

但是DBMS_UTILITY.ANYDATA_ARRAYbinary_integer,看起来你必须拥有varchar-index-by集合。尝试查找另一个。

答案 1 :(得分:0)

  

嘿,我根据要求添加了多维数组。   希望这会有所帮助。

--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;