我有两个表,我们称之为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"
答案 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)