是否可以将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图像。
但是,我无法知道在过程中使用此关联数组作为输入参数的方法。由于这个原因,我无法向程序发送任何二维或清单。
请帮助我。我的做法是错的吗?
答案 0 :(得分:0)
问题在于逐个收集使用。这里只是oracle doc的参考表格:
您无法在架构级别声明关联数组类型。 因此,将关联数组变量作为参数传递给 独立子程序,您必须在a中声明该变量的类型 包装规格。这样做可以使类型同时可用 调用子程序(声明该类型的形式参数) 和调用子程序或匿名块(声明和 传递该类型的变量。)
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#LNPLS99930
如果您无权在数据库中创建包,则可以尝试在oracle包中查找某些现有的适当集合类型(您有权访问)。例如,我们有DBMS_UTILITY
,DBMS_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_ARRAY
是binary_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;