在where子句(oracle)中使用嵌套表值

时间:2014-03-22 12:51:27

标签: sql oracle oracle10g nested-table

我是Oracle DBMS的新手,想了解如何在where子句中使用嵌套表的成员

具体地
我有一个名为poll_nest的嵌套表

   SQL> desc poll_nest
     Name                                      Null?    Type
    ----------------------------------------- -------- ----------------------------

    ID                                                 VARCHAR2(20)
    CID                                                VARCHAR2(20)

创建如下

create or replace type voter_arrive as object(id varchar(20),cid varchar(20));
create or replace type poller as table of voter_arrive;

然后它作为poll_nest

插入到选举表中
    SQL> desc election;
    Name                                      Null?    Type
   ----------------------------------------- -------- ----------------------------

     REGION                                             VARCHAR2(20)
     STIME                                              TIMESTAMP(6)
     ETIME                                              TIMESTAMP(6)
     VOTES                                              POLLER

我需要根据当前输入的poll_nest cid属性的值进行一些操作(比如根据cid递增值)

所以我使用after trigger我做了这个:

select distinct t.cid into voted from election e,table(e.votes) t where t.cid=:new.votes.cid;

但是我收到了编译错误。 我看到this回答了这个问题: Oracle Nested Table predicate in where clause
但无法理解它们是如何工作的。

有人可以帮我解释一下语法吗?

1 个答案:

答案 0 :(得分:0)

poll_nest不是嵌套表。它的表存储PL SQL对象。

来自http://www.orafaq.com/wiki/NESTED_TABLE

  

NESTED TABLE是一种Oracle数据类型,用于支持包含多值属性的列,在本例中是可以包含整个子表的列。

您可以通过首先实例化对象构造函数(如

)在对象类型表中插入值

insert into poll_nest values (voter_arrive('122','112'));

要访问插入的值,您可以使用

select e.voter.arrive.cid from poll_tab e where e.voter_arrive.id = '122';

也请查看此链接:http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/objects.htm

更新: 我查找了oracle文档http://docs.oracle.com/cd/A97630_01/appdev.920/a96624/05_colls.htm,发现poller是一个嵌套表。我不知道他们为什么称它为嵌套表,它应该只被称为PL / SQL表。

我认为poll_nest就像,并回答了问题 CREATE TABLE APPS.POLL_NEST ( VOTER APPS.VOTER_ARRIVE )

但现在我认为你已经创建了表格和对象,如

create or replace type voter_arrive as object(id varchar(20),cid varchar(20));


 create or replace type poller as table of voter_arrive;

create  table election(
 REGION                                             VARCHAR2(20),
 STIME                                              TIMESTAMP(6),
 ETIME                                              TIMESTAMP(6),
 VOTES                                              POLLER
)    NESTED TABLE VOTES STORE AS VOTES_TAB;

对于每个区域(应该是唯一的),您将在VOTES嵌套表中保存记录。如果我是正确的

INSERT INTO election
 VALUES ( 'A',
         CURRENT_TIMESTAMP,
         CURRENT_TIMESTAMP,poller(voter_arrive('100','001'),voter_arrive('200','002')) )

poller()是嵌套表类型轮询器的构造函数。传递给构造函数的所有值都将在poller中创建新行。因此,您可以在选举表中执行插入和更新,如

INSERT INTO table (select e.votes from election e where region ='A')      values((voter_arrive('300','003')))

要访问poller嵌套表中的单个行,您需要使用TABLE()函数,如下所示:     select * from table(从选举e中选择e.votes,其中region =' A')a其中a.id = 100

election table after insert

相关问题