ITPub博客

首页 > 数据库 > Oracle > ORACLE中嵌套表的基本知识

ORACLE中嵌套表的基本知识

原创 Oracle 作者:programlv 时间:2009-09-19 23:41:52 0 删除 编辑

create or replace type rss_obj as object( --基础类型
seed_id varchar2(10),
seed_name varchar2(100),
url varchar2(100)
);

create or replace type rss_tab is table of rss_obj; --嵌套表


declare

v_tab rss_tab := rss_tab(
rss_obj('sid_1' ,
'wEB:=1' ,
'' ),
rss_obj('sid_2' ,
'wEB:=2' ,
''),
rss_obj('sid_3',
'wEB:=3' ,
'' )
);
--创建打印嵌套表功能的存储过程:
procedure p_print(tab in rss_tab)is
begin
dbms_output.put_line('tab.first:='||tab.first ||'-----------------------'|| 'tab.last:=' || tab.last);
if tab.count>0 then
for i in tab.first..tab.last loop
dbms_output.put_line('[procedure]SEEDID:='||tab(i).seed_id);
dbms_output.put_line('[procedure]SEEDNAME:='||tab(i).seed_name);
dbms_output.put_line('[procedure]URL:='||tab(i).url);
dbms_output.put_line('----------------------------------[procedure]------------------>>');
end loop;
dbms_output.put_line('Count:=' || tab.count);
dbms_output.put_line('Last:=' || tab.last);
dbms_output.put_line('----------------------------------END [procedure]------------------>>');
else
dbms_output.put_line('the count is:=' || tab.count || ' Canot be deleted');
end if;
end;

--方法,实现同样打印嵌套表,使用NEXT函数
function f_print(tab in rss_tab) return boolean is
v_index number:=tab.first;
begin
if v_index<=tab.last then
while v_index<=tab.last loop
dbms_output.put_line('[Function]SEEDID:='||tab(v_index).seed_id);
dbms_output.put_line('[Function]SEEDNAME:='||tab(v_index).seed_name);
dbms_output.put_line('[Function]URL:='||tab(v_index).url);
dbms_output.put_line('----------------------------------[Function]------------------>>');
v_index:=tab.next(v_index);
end loop;
dbms_output.put_line('----------------------------------END [Function]------------------>>');
return true;
else
dbms_output.put_line('----------------------------------print error the tab.count:='||tab.count||'------------------>>');
return false;
end if;
end;
--程序主体
begin
p_print(v_tab);
v_tab.delete(1);
dbms_output.put_line('----------------------------------Now delete no:1------------------>>');
if f_print(v_tab) then dbms_output.put_line('---------------------------------------------------->>');end if;
--extend();
--trim();
--v_tab.trim();--trim()在末尾删除1个元素
--v_tab.trim(2); --trim(n)在末尾删除n个元素

--dbms_output.put_line(v_tab(20).seed_id);
/**异常:
SQLCODE1:-6533
SQLCODE1:ORA-06533: 下标超出数量
*/


v_tab.trim(); --删除最后一个元素
p_print(v_tab);
/* tab.first:=2-----------------------tab.last:=2
以为上面应经使用v_tab.delete(1)所以只打印2号元素
[procedure]SEEDID:=sid_2
[procedure]SEEDNAME:=wEB:=2
[procedure]URL:=*/
v_tab.extend(30);
--扩大嵌套表
dbms_output.put_line(v_tab(20).seed_id);--不报异常,不打印,未赋值为空字段


EXCEPTION
WHEN NO_DATA_FOUND THEN --NO_DATA_FOUND 没有数据异常
dbms_output.put_line('SQLCODE0:' || SQLCODE);--SQLCODE 错误代码
dbms_output.put_line('SQLCODE0:' || SQLERRM);--SQLERRM 错误的描述信息
WHEN OTHERS THEN
dbms_output.put_line('SQLCODE1:' || SQLCODE);
dbms_output.put_line('SQLCODE1:' || SQLERRM);
end;

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22050934/viewspace-1027153/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-07-06

  • 博文量
    5
  • 访问量
    7460