oracle存储过程中二维数组问题

ufo5054492 2007-07-12 11:11:30
oracle存储过程中传入二维数组,那传入的参数是要什么类型的
传进去后要怎么去解析这个二维数组,
二维数组解析出来然后插入数据库中!
哪位大哥可给以我一个现成的例子!
调试通过立刻给分!
...全文
2581 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fwyang_yfw 2012-03-30
  • 打赏
  • 举报
回复

DECLARE
TYPE emp_type IS RECORD(emp_no emp.empno%TYPE,emp_name emp.ename%TYPE );--定义emp记录类型
TYPE emp_type_array IS TABLE OF emp_type INDEX BY BINARY_INTEGER;--定义存放emp记录的数组类型
emp_rec emp_type;--声明变量,类型:emp记录类型
emp_rec_array emp_type_array;--声明变量,类型:存放emp记录的数组类型

BEGIN
--数组赋值
emp_rec.emp_no:=1001;
emp_rec.emp_name:='fwyang';
emp_rec_array(1):=emp_rec;

emp_rec.emp_no:=1002;
emp_rec.emp_name:='liwan';
emp_rec_array(2):=emp_rec;

--循环输出数组元素
FOR i IN 1..emp_rec_array.count LOOP
DBMS_OUTPUT.PUT_LINE(
'i='||i||
',emp_no='||emp_rec_array(i).emp_no||
',emp_name='||emp_rec_array(i).emp_name
);
END LOOP;
END;
又是违规昵称 2009-02-21
  • 打赏
  • 举报
回复
还缺人不?来凑个数
oraclelogan 2009-02-20
  • 打赏
  • 举报
回复
啥时候的帖子啊,顶出来啦,学习了!

可以用表变量来取代数据啊!
lsj47987850 2009-02-20
  • 打赏
  • 举报
回复
luguo
Raul_Gonzalez 2009-02-20
  • 打赏
  • 举报
回复
mark!~学习——数组
jdsnhan 2007-09-25
  • 打赏
  • 举报
回复
那就多凑几个人呗
liukang520236 2007-09-25
  • 打赏
  • 举报
回复
我也想给,可是好像回复的太少了,不能给的!

--------------------

还有这么一说?
langzi520 2007-09-24
  • 打赏
  • 举报
回复
那算我一个啊 呵呵
ufo5054492 2007-09-05
  • 打赏
  • 举报
回复
我也想给,可是好像回复的太少了,不能给的!
ufo5054492 2007-09-05
  • 打赏
  • 举报
回复
原来我太天真了,这世界上根本就没有这个东东!把数组做为参数传进去.哈哈,亏我想的出来!
不过还是要感谢楼上的各位,我分数就随便给了,不多希望不要介意!
IhaveGotYou 2007-07-22
  • 打赏
  • 举报
回复
Create or Replace type OneDimArray is varray(10) of varchar2(30);

Create or Replace type TwoDimArray is varray(5) of OneDimArray;

Create or replace procedure proc_csdn(va TwoDimArray) as
begin
test OneDimArray:=OneDimArray();
for i in 1..va.count loop
test.extend;
test:=va(i);
for j in 1..test.count loop
dbms_output.put_line(test(j));
end loop;
end loop;
end;

--测试
declare t TwoDimArray:=TwoDimArray();
o OneDimArray:=OneDimArray();
begin
o.extend;
o(1):='1';
o.extend;
o(2):='2';
t.extend;
t(1):=o;
proc_csdn(t);
end;

--测试环境: Oracle 9i Case:PL/SQL 6.0
hongqi162 2007-07-18
  • 打赏
  • 举报
回复
create type tab_num as table of number;
/

create function sum_it(tb tab_num) return number
as
ret number := 0;
begin
for i in 1..tb.count loop
ret := ret + tb(i);
end loop;
return ret;
end;
/

select sum_it(tab_num(2,3,5)) from dual;

drop function sum_it;
drop type tab_num;


DragonBill 2007-07-18
  • 打赏
  • 举报
回复
谢谢你,不过我想要的是怎么把二维数组给当做存储过程传进去并解析!
不是给传出来,传出来用游标就行了!

"把二维数组给当做存储过程传进去并解析"是什么意思? 二维数组中存放的是存储过程名字吗?
ufo5054492 2007-07-16
  • 打赏
  • 举报
回复
oracle 存储过程返回数组的方法:
=======================
谢谢你,不过我想要的是怎么把二维数组给当做存储过程传进去并解析!
不是给传出来,传出来用游标就行了!
hongqi162 2007-07-12
  • 打赏
  • 举报
回复
--create table
create table employee_table(emp_id int,emp_name varchar2(100),emp_gender varchar2(100) );




:) 分真多 有钱人
hongqi162 2007-07-12
  • 打赏
  • 举报
回复
因为在PL/SQL中并没有数组,这是我查资料找的范例和自己写的范例来解释如何在PL/SQL中使用数组。也许很多人已知道,不过就是让不知道的朋友们了解一下吧。

---------------------- 单维数组 ------------------------

DECLARE
TYPE emp_ssn_array IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;

best_employees emp_ssn_array;
worst_employees emp_ssn_array;

BEGIN
best_employees(1) := '123456';
best_employees(2) := '888888';

worst_employees(1) := '222222';
worst_employees(2) := '666666';

FOR i IN 1..best_employees.count LOOP
DBMS_OUTPUT.PUT_LINE('i='|| i || ', best_employees= ' ||best_employees(i)
|| ', worst_employees= ' ||worst_employees(i));
END LOOP;

END;

---------------------- 多维数组 ------------------------

DECLARE

TYPE emp_type IS RECORD
( emp_id employee_table.emp_id%TYPE,
emp_name employee_table.emp_name%TYPE,
emp_gender employee_table.emp_gender%TYPE );

TYPE emp_type_array IS TABLE OF
emp_type INDEX BY BINARY_INTEGER;

emp_rec_array emp_type_array;
emp_rec emp_type;

BEGIN
emp_rec.emp_id := 300000000;
emp_rec.emp_name := 'Barbara';
emp_rec.emp_gender := 'Female';

emp_rec_array(1) := emp_rec;

emp_rec.emp_id := 300000008;
emp_rec.emp_name := 'Rick';
emp_rec.emp_gender := 'Male';

emp_rec_array(2) := emp_rec;

FOR i IN 1..emp_rec_array.count LOOP
DBMS_OUTPUT.PUT_LINE('i='||i
||', emp_id ='||emp_rec_array(i).emp_id
||', emp_name ='||emp_rec_array(i).emp_name
||', emp_gender = '||emp_rec_array(i).emp_gender);
END LOOP;

END;
-------------- Result --------------
i=1, emp_id =300000000, emp_name =Barbara, emp_gender = Female
i=2, emp_id =300000008, emp_name =Rick, emp_gender = Male

注:在PL/SQL中是没有数组(Array)概念的。但是如果程序员想用Array的话,就得变通一下,用TYPE 和Table of Record来代替多维数组,一样挺好用的。

emp_type 就好象一个table 中的一条record 一样,里面有id, name,gender等。emp_type_array 象个table, 里面含有一条条这样的record (emp_type),就象多维数组一
hongqi162 2007-07-12
  • 打赏
  • 举报
回复
oracle 存储过程返回数组的方法:
1.建立包
create or replace package test is
TYPE filename_array IS TABLE OF varchar2(1);
filename filename_array;
end test;
2. 建立存储过程
create or replace procedure test_array(v_cfjg out test.filename_array ) is
begin DECLARE i number;
D_cfjg dic_cfjg%rowTYPE;
-- D_nr dic_cfjg%rowTYPE;
cursor c1 is SELECT * FROM dic_cfjg;
BEGIN
i:=0;
v_cfjg := test.filename_array(); --数组初始化

open c1;
LOOP fetch c1 into D_cfjg;
EXIT WHEN c1%NOTFOUND ;
i:=i+1;
v_cfjg.EXTEND;
-- DBMS_OUTPUT.PUT_LINE(TO_CHAR(D_cfjg.dm));
v_cfjg(v_cfjg.count):=D_cfjg.dm;
DBMS_OUTPUT.PUT_LINE(v_cfjg(v_cfjg.count));
-- 测试
-- FETCH C1 INTO D_cfjg;
-- EXIT WHEN c1%NOTFOUND ;
END LOOP;
end;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS');
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(sqlerrm);
end test_array;
ufo5054492 2007-07-12
  • 打赏
  • 举报
回复
hongqi162(失踪的月亮)
非常感谢!
不过我想要知道的是数组要传进去要如何实现,与在存储过程中如何解析!
我也明白存储过程中如何定义与使用数组,
现在难就难在我如何传进去,存储过程的参数要定义成什么格式!

再次感谢 hongqi162(失踪的月亮)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧