Oracle PLSQL 中的 for 循环
for loop in oracle PLSQL
我希望 table employee_dep
中的每个插入值 i 递增 1
i := 1
For lh in
(SELECT DISTINCT z.emp_id
FROM employee z)
LOOP
INSERT INTO employee_dep
(emp_id, emp_lfd, dep_name, dept_no)
SELECT w.emp_id, i, w.dep_name, w.dep_no)
FROM
central_dep w
where w.emp_id= lh.emp_id;
i := i+1;
end loop;
但是如果有两行具有相同的 emp_id 那么这两行的 i 是相同的。
我希望 i 在下一行中增加 1。 (table 中每插入一个新内容,i 就会增加 1)
例如。
我希望这些列是
emp_id emp_lfd
1111 1
1111 2
1111 3
1122 1
1122 2
1122 3
1122 4
但我目前得到的是
emp_id emp_lfd
1111 3
1111 3
1111 3
1122 4
1122 4
1122 4
1122 4
你不想要一个 insert ... select
声明 row_number()
吗?
insert into employee_dep (emp_id, emp_lfd, dep_name, dept_no)
select emp_id, row_number() over(order by emp_id), dep_name, dep_no
from central_dep
或者,如果您正在练习 PL/SQL,那将是一个嵌套循环,例如
DECLARE
i NUMBER;
BEGIN
i := 1;
FOR lh IN (SELECT DISTINCT z.emp_id
FROM employee z)
LOOP
FOR cur_r IN (SELECT w.emp_id, w.dep_name, w.dep_no
FROM central_dep w
WHERE w.emp_id = lh.emp_id)
LOOP
INSERT INTO employee_dep (emp_id,
emp_lfd,
dep_name,
dept_no)
VALUES (cur_r.emp_id,
i,
cur_r.dep_name,
cur_r.dep_no);
i := i + 1;
END LOOP;
END LOOP;
END;
似乎您只需要 ROW_NUMBER()
分析函数和 PARTITION BY emp_id
在您的 INSERT
语句中,例如
INSERT INTO employee_dep(emp_id, emp_lfd, dep_name, dept_no)
SELECT emp_id, ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY 0), dep_name, dep_no
FROM central_dep
我已尝试在 Demo
内重新生成您的案例
我希望 table employee_dep
中的每个插入值 i 递增 1i := 1
For lh in
(SELECT DISTINCT z.emp_id
FROM employee z)
LOOP
INSERT INTO employee_dep
(emp_id, emp_lfd, dep_name, dept_no)
SELECT w.emp_id, i, w.dep_name, w.dep_no)
FROM
central_dep w
where w.emp_id= lh.emp_id;
i := i+1;
end loop;
但是如果有两行具有相同的 emp_id 那么这两行的 i 是相同的。 我希望 i 在下一行中增加 1。 (table 中每插入一个新内容,i 就会增加 1)
例如。 我希望这些列是
emp_id emp_lfd
1111 1
1111 2
1111 3
1122 1
1122 2
1122 3
1122 4
但我目前得到的是
emp_id emp_lfd
1111 3
1111 3
1111 3
1122 4
1122 4
1122 4
1122 4
你不想要一个 insert ... select
声明 row_number()
吗?
insert into employee_dep (emp_id, emp_lfd, dep_name, dept_no)
select emp_id, row_number() over(order by emp_id), dep_name, dep_no
from central_dep
或者,如果您正在练习 PL/SQL,那将是一个嵌套循环,例如
DECLARE
i NUMBER;
BEGIN
i := 1;
FOR lh IN (SELECT DISTINCT z.emp_id
FROM employee z)
LOOP
FOR cur_r IN (SELECT w.emp_id, w.dep_name, w.dep_no
FROM central_dep w
WHERE w.emp_id = lh.emp_id)
LOOP
INSERT INTO employee_dep (emp_id,
emp_lfd,
dep_name,
dept_no)
VALUES (cur_r.emp_id,
i,
cur_r.dep_name,
cur_r.dep_no);
i := i + 1;
END LOOP;
END LOOP;
END;
似乎您只需要 ROW_NUMBER()
分析函数和 PARTITION BY emp_id
在您的 INSERT
语句中,例如
INSERT INTO employee_dep(emp_id, emp_lfd, dep_name, dept_no)
SELECT emp_id, ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY 0), dep_name, dep_no
FROM central_dep
我已尝试在 Demo
内重新生成您的案例