'Column not allowed' 将游标中的数据添加到 pl/sql 中的 table 时出错
'Column not allowed' error when adding data from cursor to table in pl/sql
我正在做一些练习题来帮助我学习 pl/sql。我需要使用游标将数据从一个 table 添加到另一个。我的代码如下。我已经使用 dbms_output.put_line
来确保游标中有数据,并且游标中的数据通过循环一次一行地进入变量 c_ename
和 c_salary
。问题好像是变量里的数据不能插入top_paid_emp
table。我收到 ORA-00984: column not allowed here 错误。我认为这是一个语法错误,但我不明白在哪里。非常感谢任何帮助。
DECLARE
c_ename VARCHAR2(20);
c_salary NUMBER(10);
CURSOR c_topfive IS
SELECT ename, salary
FROM (SELECT ename, salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM emp1)
WHERE rank <= 5;
BEGIN
OPEN c_topfive;
LOOP
FETCH c_topfive INTO c_ename, c_salary;
dbms_output.put_line(c_ename);
EXIT WHEN c_topfive%notfound;
INSERT INTO top_paid_emp (empname, salary) VALUES (c_name,c_salary);
END LOOP;
CLOSE c_topfive;
END;
如果您正在提取
FETCH c_topfive INTO c_ename, c_salary;
-------
那么你也应该在插入中使用它
INSERT INTO top_paid_emp (empname, salary) VALUES (c_name,c_salary);
------
请注意,您可以使用游标 FOR
循环完成它,例如
begin
for cur_r in (select ename, salary
from (select ename, salary,
rank() over (order by salary desc) as rank
from emp1)
where rank <= 5)
loop
insert into top_paid_emp (empname, salary) values (cur_r.ename, cur_r.salary);
end loop;
end;
如您所见,它为您节省了很多工作:您不必声明任何游标变量,打开游标,获取,注意何时退出循环,关闭游标 - Oracle为你做这一切。
我正在做一些练习题来帮助我学习 pl/sql。我需要使用游标将数据从一个 table 添加到另一个。我的代码如下。我已经使用 dbms_output.put_line
来确保游标中有数据,并且游标中的数据通过循环一次一行地进入变量 c_ename
和 c_salary
。问题好像是变量里的数据不能插入top_paid_emp
table。我收到 ORA-00984: column not allowed here 错误。我认为这是一个语法错误,但我不明白在哪里。非常感谢任何帮助。
DECLARE
c_ename VARCHAR2(20);
c_salary NUMBER(10);
CURSOR c_topfive IS
SELECT ename, salary
FROM (SELECT ename, salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM emp1)
WHERE rank <= 5;
BEGIN
OPEN c_topfive;
LOOP
FETCH c_topfive INTO c_ename, c_salary;
dbms_output.put_line(c_ename);
EXIT WHEN c_topfive%notfound;
INSERT INTO top_paid_emp (empname, salary) VALUES (c_name,c_salary);
END LOOP;
CLOSE c_topfive;
END;
如果您正在提取
FETCH c_topfive INTO c_ename, c_salary;
-------
那么你也应该在插入中使用它
INSERT INTO top_paid_emp (empname, salary) VALUES (c_name,c_salary);
------
请注意,您可以使用游标 FOR
循环完成它,例如
begin
for cur_r in (select ename, salary
from (select ename, salary,
rank() over (order by salary desc) as rank
from emp1)
where rank <= 5)
loop
insert into top_paid_emp (empname, salary) values (cur_r.ename, cur_r.salary);
end loop;
end;
如您所见,它为您节省了很多工作:您不必声明任何游标变量,打开游标,获取,注意何时退出循环,关闭游标 - Oracle为你做这一切。