使用与DataSet

时间:2017-01-24 13:33:16

标签: sql oracle stored-procedures

我有两个表,我们称之为Table1和Table2。 我有一个名为role

的变量

现在我需要从Table1执行select语句(可以返回多行):

SELECT roles INTO role FROM TABLE1

然后我需要在Table2中插入role

INSERT INTO Table2(RELATION_ID, ROLES) VALUES (maxID+1, role);

现在我的问题是,第一个select语句返回的行数超过1行,因此我无法将值放在role变量中。所以我需要像ArrayList或DataSet这样的东西来放置值,因为我需要对这些值进行循环,然后将它们插入另一个表中。如何在SQL(Oracle)中使用列表并对其进行迭代。

下面你会看到我的代码,简化了一下,这样才能解决我的问题。当然代码不会编译,只是试图弄清楚我需要什么。感谢。

    CREATE OR REPLACE PROCEDURE "myProcedure"(eventID IN NUMBER)
    IS

    roleNumber NUMBER;
    maxID NUMBER;

    BEGIN
        SELECT roles FROM TABLE1;
        SELECT MAX(RELATION_ID) INTO maxID FROM SOMEOTHERTABLE;

    IF maxID IS NULL
     THEN
      maxID := 0;
    END IF;

    FOR counter IN theListThatINeed    
        INSERT INTO Table2(RELATION_ID, ROLES) VALUES (maxID+1, roleAtCounter);
    END IF;

    END "myProcedure"

3 个答案:

答案 0 :(得分:2)

在这种情况下,我只使用一个SQL语句。无需在SQL引擎和另一种语言之间来回切换上下文,并且无需一次处理这样的一行!

INSERT INTO Table2(RELATION_ID, ROLES)
SELECT (SELECT NVL(MAX(RELATION_ID),0) FROM SOMEOTHERTABLE)+rownum, roles
FROM table1;

答案 1 :(得分:1)

使用收藏品完成工作。见下文:

CREATE OR REPLACE PROCEDURE myProcedure (eventID IN NUMBER)
IS
   ID_max   NUMBER;

   CURSOR cur
   IS
      SELECT roles FROM TABLE1;

   TYPE x IS TABLE OF cur%ROWTYPE
      INDEX BY PLS_INTEGER;

   var      x;
BEGIN
   OPEN CUR;

   FETCH cur BULK COLLECT INTO var;

   CLOSE cur;

   SELECT MAX (RELATION_ID) INTO ID_max FROM SOMEOTHERTABLE;

   IF ID_max IS NULL
   THEN
      ID_max := 0;
   END IF;

   FOR i IN 1 .. var.COUNT
   LOOP
      INSERT INTO Table2 (RELATION_ID, ROLES)
           VALUES ( (ID_max + i), var(i).roles);
   END LOOP;

   COMMIT;
END myProcedure;

答案 2 :(得分:1)

我知道这不是你要问的问题,但问题的解决方案是:

new_reporter.article_set.add(new_article, bulk=False)
# will not use update and call save on article instance

如果某个其他流程也可以插入create sequence seqid start with 1 increment by 1; INSERT INTO Table2(RELATION_ID, ROLES) select seqid.nextval, role from table1; 而您确实需要table2,则可以使用:

max(id)