Oracle中作为永久存储机制的嵌套表的数据追加
2010-01-09 18:59
387 查看
头几天有人问了一个问题:
--创建类型minutiae
create OR REPLACE type minutiae_t as object(x number(3,0),y number(3,0),t varchar2(10),theta number(6,2));
/
--创建类型minutiaeset
create OR REPLACE type minutiaeset_t as table of minutiae_t;
/
--创建表tb_f
create table tb_f(fingerId NVARCHAR2(50),minutiaeSet minutiaeset_t)
nested table minutiaeSet store as minutiaeSettab;
/
--创建过程,向表中插入数据
create or replace procedure insert_into_minutiaeset_t
as
mydata minutiaeset_t;
begin
mydata:=minutiaeset_t(minutiae_t(1,3,'end',2.1));
insert into tb_f values('102.bmp',mydata);
end;
/
--更新嵌套表数据
declare
mydata minutiaeset_t;
begin
mydata:=minutiaeset_t(minutiae_t(1,3,'end',2.1));
update tb_f set minutiaeSet=mydata where fingerId='102.bmp';
end;
/
问题是如何根据查询条件在嵌套表中追加数据?例如,想要在fingerId='102.bmp'的一行中,追加特征点数据。
--------------------------
以我的能力可以给出两种解决方法:
--方法1:
select * from table(select minutiaeset from tb_f where fingerid='102.bmp');
X Y T THETA
---- ---- ---------- --------
1 3 end 2.10
insert into table(select minutiaeset from tb_f where fingerid='102.bmp') values(minutiae_t(5,7,'start',3));
1 row inserted
select * from table(select minutiaeset from tb_f where fingerid='102.bmp');
X Y T THETA
---- ---- ---------- --------
1 3 end 2.10
5 7 start 3.00
--方法2:
CREATE OR REPLACE PROCEDURE proc_append_minutiaeset_t(newvalue minutiae_t,search_value VARCHAR2)
AS
temp_nested_table minutiaeset_t:=minutiaeset_t();
BEGIN
SELECT minutiaeset INTO temp_nested_table FROM tb_f WHERE fingerid=search_value;
temp_nested_table.extend;
temp_nested_table(temp_nested_table.count):=newvalue;
update tb_f set minutiaeSet=temp_nested_table where fingerId=search_value;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Exception!');
END;
/
exec proc_append_minutiaeset_t(minutiae_t(2,2,'mid',2),'102.bmp')
SQL> select * from table(select minutiaeset from tb_f where fingerid='102.bmp');
X Y T THETA
---- ---- ---------- --------
1 3 end 2.10
5 7 start 3.00
2 2 mid 2.00
不过,用嵌套表作为数据的永久存储机制好像并不能得到什么好处。我认为是这样。
--创建类型minutiae
create OR REPLACE type minutiae_t as object(x number(3,0),y number(3,0),t varchar2(10),theta number(6,2));
/
--创建类型minutiaeset
create OR REPLACE type minutiaeset_t as table of minutiae_t;
/
--创建表tb_f
create table tb_f(fingerId NVARCHAR2(50),minutiaeSet minutiaeset_t)
nested table minutiaeSet store as minutiaeSettab;
/
--创建过程,向表中插入数据
create or replace procedure insert_into_minutiaeset_t
as
mydata minutiaeset_t;
begin
mydata:=minutiaeset_t(minutiae_t(1,3,'end',2.1));
insert into tb_f values('102.bmp',mydata);
end;
/
--更新嵌套表数据
declare
mydata minutiaeset_t;
begin
mydata:=minutiaeset_t(minutiae_t(1,3,'end',2.1));
update tb_f set minutiaeSet=mydata where fingerId='102.bmp';
end;
/
问题是如何根据查询条件在嵌套表中追加数据?例如,想要在fingerId='102.bmp'的一行中,追加特征点数据。
--------------------------
以我的能力可以给出两种解决方法:
--方法1:
select * from table(select minutiaeset from tb_f where fingerid='102.bmp');
X Y T THETA
---- ---- ---------- --------
1 3 end 2.10
insert into table(select minutiaeset from tb_f where fingerid='102.bmp') values(minutiae_t(5,7,'start',3));
1 row inserted
select * from table(select minutiaeset from tb_f where fingerid='102.bmp');
X Y T THETA
---- ---- ---------- --------
1 3 end 2.10
5 7 start 3.00
--方法2:
CREATE OR REPLACE PROCEDURE proc_append_minutiaeset_t(newvalue minutiae_t,search_value VARCHAR2)
AS
temp_nested_table minutiaeset_t:=minutiaeset_t();
BEGIN
SELECT minutiaeset INTO temp_nested_table FROM tb_f WHERE fingerid=search_value;
temp_nested_table.extend;
temp_nested_table(temp_nested_table.count):=newvalue;
update tb_f set minutiaeSet=temp_nested_table where fingerId=search_value;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Exception!');
END;
/
exec proc_append_minutiaeset_t(minutiae_t(2,2,'mid',2),'102.bmp')
SQL> select * from table(select minutiaeset from tb_f where fingerid='102.bmp');
X Y T THETA
---- ---- ---------- --------
1 3 end 2.10
5 7 start 3.00
2 2 mid 2.00
不过,用嵌套表作为数据的永久存储机制好像并不能得到什么好处。我认为是这样。
相关文章推荐
- ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的
- <Oracle基本的数据存储机制-表>
- php对图书的增删改查操作(xml作为数据存储机制)
- Oracle数据库(Oracle存储结构、Oracle运行机制、日期相关的函数、序列、大对象数据类型、表的修改与约束、事务)
- Oracle内置数据类型和存储数据的方法
- 嵌套表+语法+嵌套表作为表列的数据类型
- oracle 10g dataguard物理standby配置 (数据文件以文件系统存储)
- Oracle用户下不同表空间存储不同空间数据
- ios开发之数据的持久化存储机制
- (小笔记)()Oracle 批量复制一个数据表的数据,修改部分字段后追加加入到数据表中
- .net 使用oracle 的存储过程有返回值也有数据集
- Oracle根底数据标准存储名目浅析(三)——日期标准(三)
- iOS开发:沙盒机制以及利用沙盒存储字符串、数组、字典等数据
- ORACLE数据存储空间的管理
- Oracle基本数据类型存储格式浅析(一)——字符类型
- 优化Oracle的数据存储
- Oracle与Mysql数据的事务处理机制
- 转--Oracle数据类型以及存储方式【D】
- 【ORACLE】删除表数据的存储过程backup.sql