如何达到oracle对象属性?

时间:2013-02-15 13:05:29

标签: oracle object plsql attributes user-defined-types

我有一个包含oracle COLOR_HISTOGRAM列的表,它包含值。它是一个带有colorlist和colorfrequencielist的对象类型。 如果我想将SI_COLORS插入表中,我如何才能达到这些属性?

我解析了两种可能包含这些值的类型

--CREATE OR REPLACE TYPE colorsList AS VARRAY(100) OF SI_Color;
--CREATE OR REPLACE TYPE colorFrequenciesList AS VARRAY(100) OF DOUBLE PRECISION;


ORDSYS.SI_COLORHISTOGRAM(
ORDSYS.COLORSLIST(
ORDSYS.SI_COLOR(195,157,133),
ORDSYS.SI_COLOR(226,223,215),
ORDSYS.SI_COLOR(191,154,131),
ORDSYS.SI_COLOR(139,94,61),
ORDSYS.SI_COLOR(221,40,43),
ORDSYS.SI_COLOR(85,47,30),
ORDSYS.SI_COLOR(237,45,51),
ORDSYS.SI_COLOR(190,60,47),
ORDSYS.SI_COLOR(66,53,49),
ORDSYS.SI_COLOR(145,66,63),
ORDSYS.SI_COLOR(192,115,111),
ORDSYS.SI_COLOR(64,50,46),
ORDSYS.SI_COLOR(178,151,123),
ORDSYS.SI_COLOR(178,153,129),
ORDSYS.SI_COLOR(170,140,114),
ORDSYS.SI_COLOR(174,150,124),
ORDSYS.SI_COLOR(146,118,106),
ORDSYS.SI_COLOR(189,168,145),
ORDSYS.SI_COLOR(190,171,148),
ORDSYS.SI_COLOR(144,71,57),
ORDSYS.SI_COLOR(86,45,26),
ORDSYS.SI_COLOR(193,109,80),
ORDSYS.SI_COLOR(145,138,136),
ORDSYS.SI_COLOR(130,121,120),
ORDSYS.SI_COLOR(115,80,72),
ORDSYS.SI_COLOR(186,50,37),
ORDSYS.SI_COLOR(193,171,149),
ORDSYS.SI_COLOR(0,0,0)),
ORDSYS.COLORFREQUENCIESLIST(99014.1,67706.4,38034.6,28478.2,5075.64,3302.56,2429.49,856.41,638.462,560.256,520.513,476.923,439.744,296.154,247.436,232.051,194.872,138.462,123.077,110.256,82.0513,75.641,62.8205,51.2821,46.1538,43.5897,32.0513,0))

任何想法都非常感激。

1 个答案:

答案 0 :(得分:1)

您可以像这样引用SI_COLOR值:

SQL> create table foo(r integer, b integer, g integer);

Table created.

SQL> insert into foo
  2  select cl.redvalue, cl.bluevalue, cl.greenvalue
  3  from tbl t, table(t.color_histogram.SI_COLORSLIST) cl;

28 rows created.

SQL> select * from foo;

         R          B          G
---------- ---------- ----------
       195        133        157
       226        215        223
       191        131        154
       139         61         94
       221         43         40
...etc..

两个数组:

SQL> create table foo(r integer, b integer, g integer, freq number);

Table created.

SQL> insert into foo
  2  select cl.redvalue, cl.bluevalue, cl.greenvalue, fl.freq
  3    from (select t.rowid rid, cl.redvalue, cl.bluevalue, cl.greenvalue, rownum r
  4            from tbl t, table(t.color_histogram.SI_COLORSLIST) cl) cl
  5         inner join (select t.rowid rid, rownum r, fl.column_value freq
  6                       from tbl t, table(t.color_histogram.si_frequencieslist) fl) fl
  7                 on fl.rid = cl.rid
  8                and fl.r = cl.r;

28 rows created.

SQL> select * from foo;

         R          B          G       FREQ
---------- ---------- ---------- ----------
       195        133        157          1
       226        215        223          2
       191        131        154          3
       139         61         94          4
 ..etc..

(因为它们是varrays我们可以依赖于排序所以rownum是可以的)。

或pl / sql:

SQL> begin
  2    for r_row in (select t.color_histogram
  3                    from tbl t)
  4    loop
  5      for idx in 1..r_row.color_histogram.si_colorslist.count
  6      loop
  7        insert into foo
  8                    (r, g, b, freq)
  9        values (r_row.color_histogram.si_colorslist(idx).redvalue,
 10                r_row.color_histogram.si_colorslist(idx).greenvalue,
 11                r_row.color_histogram.si_colorslist(idx).bluevalue,
 12                r_row.color_histogram.si_frequencieslist(idx));
 13      end loop;
 14    end loop;
 15  end;
 16  /

PL/SQL procedure successfully completed.

SQL> select * from foo;

         R          B          G       FREQ
---------- ---------- ---------- ----------
       195        133        157          1
       226        215        223          2
       191        131        154          3
       139         61         94          4
       221         43         40          5
        85         30         47          6
 etc..