从loop / Select语句作为变量插入表值

时间:2015-11-03 12:54:34

标签: sql oracle plsql

我遇到一些需要循环的任务有困难。 作为Im pl / sql newbie,我不知道如何解决这个问题,有人可以看看吗?

也许最简单的方式是介绍而不是描述我想做的事情:

Select id from table1 t1 join table2 t2 on t1.column=t2.column2

insert into table2 id from previous operation.

Select id from table1 t1 join table2 t2 on t1.column=ts.column2 where t1.id in (Select id from table1 t1 join table2 t2 on t1.column=t2.column2);

insert into table2 id from previous operation

现在如果先前的操作返回一些数据,那么:

Select id from table1 t1 join table2 t2 on t1.column=t2.column2 WHERE t1.column in (Select id from table1 t1 join table2 t2 on t1.column=ts.column2 where t1.id in (Select id from table1 t1 join table2 t2 on t1.column=t2.column2)
insert into tablr2 id from previous operation

依此类推,直到select不会返回任何内容。

当然我意识到“select”会将重复的ID插入到table3中。 我只知道我必须使用循环,但不知道究竟是哪一个以及如何。有可能处理吗?

修改

再一次, 我有2张桌子:

Table1 
Column1 
1
2
3
4
5
6
7
8
9

Table2
Column1 Column2 Column3
2345    1   0
5346    2   0
67542   3   23432
3452    4   324665
64356   5   34234
23432   6   0
324665  7   67867
34234   8   0
67867   9   9

Table to insert:

ID 
    1
    2
    3
    4

作为输入,我得到了具有ID的Table3,我想插入到例如。表4(ID)。

但是其中一些ID可能有一些父/子ID。这是在循环中如何做到这一点的主要困难。通常我们可以使用statement:

找到父/子ID

从table1选择ID t1在t1.id = t2.Column2上连接Table2 t2 在t2.Column3 = t2.Column1

上加入Table2 t2

现在基于“要插入的表”插入语句(进入表4)应该插入值: 1,2,3,4 + 6和7(我们可以看到6和7有父ID(Column0!= 0)。

现在我们要检查帐户6,7中是否有任何父/子ID与以前相同。 因此插入Table4应插入值:9 端。

当然,这种情况只描述2-3次迭代,如果会有更多的父/子ID?

我想使用一些表类型,并且在每个循环之后将ID放入表变量并将其用于其他迭代...

2 个答案:

答案 0 :(得分:0)

将其设为insert into .. select from

insert into table2(id)
Select id from table1 t1 join table2 t2 on t1.column=t2.column2

答案 1 :(得分:0)

从您的问题看来,您似乎想要将所有ID插入到table2中,这对于table1和table2都是基于列“column”的。并且遗漏了没有任何共同点的其他行。

这意味着你希望table2包含table2 intersect table1(对于列“column”)

现在在sql中你可以轻松地做到这一点,因为它涉及设置操作而不是单行操作。

假设你的表1是

id列

1“A”

2“B”

3“C”

和table2是

id列

3“A”

4“C”

然后在表2中你要插入

1 - 因为“A”并且在table1和

中有id 1

3 - 因为“C”在table1中有id 3

你可以通过写

来做到这一点
insert into table2 (id)
select id from table1 where column in (select column from table2) ;

----我根据您的输入编辑答案-------

所以这次我创建了整个表格,我尝试复制你提到的每一个场景。

让我们先创建req表集

            create table table2 (row_id number , id number , parent_id number)

            CREATE table TABLE1 (id number) ;

            CREATE table TABLE3 (id number) ;

            CREATE table TABLE4 (id number) ;

现在让我们在这些表中插入相同的值(如示例中所述)

            --TABLE1 ---

            INSERT INTO table1 VALUES
            (1);
            INSERT INTO table1 VALUES
            (2);
            INSERT INTO table1 VALUES
            (3);
            INSERT INTO table1 VALUES
            (4);
            INSERT INTO table1 VALUES
            (5);
            INSERT INTO table1 VALUES
            (6);
            INSERT INTO table1 VALUES
            (7);
            INSERT INTO table1 VALUES
            (8);
            INSERT INTO table1 VALUES
            (9);

            --TABLE2 ---
            INSERT INTO table2 VALUES
            (2345   , 1 ,   0) ;
            INSERT INTO table2 VALUES
            (5346   , 2  , 0) ;
            INSERT INTO table2 VALUES
            (67542 ,  3  ,  23432) ;
            INSERT INTO table2 VALUES
            (3452  ,  4  ,  324665);
            INSERT INTO table2 VALUES
            (64356  , 5  ,  34234);
            INSERT INTO table2 VALUES
            (23432 ,  6 ,   0);
            INSERT INTO table2 VALUES
            (324665 , 7 ,  67867);
            INSERT INTO table2 VALUES
            (34234 ,  8 ,  0);
            INSERT INTO table2 VALUES
            (
            67867 ,  9 , 9);

            --TABLE3 ---
            INSERT INTO table3 VALUES
            (1);
            INSERT INTO table3 VALUES
            (2);
            INSERT INTO table3 VALUES
            (3);
            INSERT INTO table3 VALUES
            (4);
            set serveroutput on ;

现在运行这个anoy块将满足需求。

            DECLARE 
            table_var VARCHAR2(30) := 'TABLE3' ; -- replace this with any table
            lvc_cur sys_refcursor ;
            l_num NUMBER ;
            cnt number := 0 ;
            BEGIN

            OPEN lvc_cur FOR 'select distinct id from '||table_var ||' where id in (select table1.id from table1 , table2 where table1.id = table2.id )';

            loop 

            fetch lvc_cur into l_num ;


            exit WHEN lvc_cur%notfound ;

            INSERT INTO table4(ID)
            select id  from table2 connect by prior parent_id = row_id  start with id = l_num   ;

            end loop ;


            END ;

通过运行以下查询来检查

            select * from table4

                 ID
            ----------
                     1 
                     2 
                     4 
                     7 
                     9 
                     3 
                     6 

             7 rows selected