Oracle VARRAY Example
(Revised 09/20/2010, I've revised this example to be more pertinent.)
VARRAYs provide the interesting ability to store multiple values in a single column. Note, "interesting" doesn't mean I'm necessarily encouraging its use. I expect there are some potentially significant performance penalties using VARRAYs.
set serveroutput on; column id FORMAT A5; column url FORMAT A20; column Tag(s) FORMAT A20; clear; -- Create a VARRAY that can hold 10 "objects" [cells] of type VARCHAR2 (i.e. 10 Tags of up to 50 characters) create or replace type vcarray_tags as VARRAY(10) OF VARCHAR2(50); / -- Each URL is stored in a single row regardless of the number of tags create table site_tags (id number, url varchar2(100), tag_list vcarray_tags); insert into site_tags values (1, 'www.bing.com', vcarray_tags('search', 'microsoft')); insert into site_tags values (2, 'www.google.com', vcarray_tags('search', 'google')); commit; set echo on; -- Note, The VARRAY column is of type "object" select * from site_tags; -- Display each tag on a separate row select site_tags.id, site_tags.url, tags.column_value "Tag(s)" from site_tags, table(site_tags.tag_list) tags; -- Show all the URLs "tagged" with 'search' select site_tags.id, site_tags.url, tags.column_value "Tag(s)" from site_tags, table(site_tags.tag_list) tags where tags.column_value = 'search'; / -- PL/SQL Example begin for c in (select * from site_tags) loop dbms_output.put_line(c.id||' : '||c.url); for i in c.tag_list.first .. c.tag_list.last loop dbms_output.put_line(' Tag: '||c.tag_list(i)); end loop; end loop; end;Results:
create or replace type vcarray_tags as VARRAY(10) OF VARCHAR2(50); / Type created create table site_tags (id number, url varchar2(100), tag_list vcarray_tags); Table created insert into site_tags values (1, 'www.bing.com', vcarray_tags('search', 'microsoft')); 1 row inserted insert into site_tags values (2, 'www.google.com', vcarray_tags('search', 'google')); 1 row inserted commit; Commit complete set echo on; select * from site_tags; ID URL TAG_LIST ----- -------------------- -------- 1 www.bing.com <Object> 2 www.google.com <Object> select site_tags.id, site_tags.url, tags.column_value "Tag(s)" from site_tags, table(site_tags.tag_list) tags; ID URL Tag(s) ----- -------------------- -------------------- 1 www.bing.com search 1 www.bing.com microsoft 2 www.google.com search 2 www.google.com google select site_tags.id, site_tags.url, tags.column_value "Tag(s)" from site_tags, table(site_tags.tag_list) tags where tags.column_value = 'search'; ID URL Tag(s) ----- -------------------- -------------------- 1 www.bing.com search 2 www.google.com search begin for c in (select * from site_tags) loop dbms_output.put_line(c.id||' : '||c.url); for i in c.tag_list.first .. c.tag_list.last loop dbms_output.put_line(' Tag: '||c.tag_list(i)); end loop; end loop; end; / 1 : www.bing.com Tag: search Tag: microsoft 2 : www.google.com Tag: search Tag: google
5 comments:
Thanks, quite clear.
Very Nice example to understand what is an varray and Nested table
Thanks!
Hello,
Can we put Check constraint on varrays ?
example
create type abc as varrays(3) of varchar2(20);
now i want to insert specific strings in this datatype when I use it in table.
CREATE TYPE info AS OBJECT(
name varchar2(20),
checker abc
);
when I create table of info, I need to put check constraint on checker..
Any suggestion?
What kind of constraint are you thinking of? You have a built-in constraint on the datatype [Varchar2(20)] and in the number of allowed elements (3).
Have you looked at the member methods?
thank you very much
Post a Comment