sql - 在 pl/sql 中将数据从游标添加到表时出现“不允许列”错误
问题描述
我正在研究一些练习题来帮助我学习 pl/sql。我需要使用游标将数据从一个表添加到另一个表。我的代码如下。我曾经dbms_output.put_line
确保游标中有数据,并且游标中的数据通过循环一次将其放入变量c_ename
和c_salary
一行。问题似乎是变量中的数据无法插入top_paid_emp
表中。我收到 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 为您完成所有这些你。
推荐阅读
- java - 与时间窗口聚合的 Kafka KStreams 问题
- javascript - Iframe 层次结构之间的 PostMessage
- firebase-authentication - 如何使用 REST API 使用 Google Provider 自动执行 Firebase 的身份验证流程?
- html - 如何在网站上设置下拉框,以便选择选项并抓取数据
- machine-learning - 如何使用小数据集提高我的 convnet 性能
- aws-api-gateway - 使用集成类型 Kinesis 测试 API Gateway 时出现 UnrecognizedClientException
- html - 尽管只指定了一种颜色,但线性渐变显示两种颜色
- java - 如何在弹性搜索中聚合“非关键字”字段?
- reactjs - 如何根据 Redux Store 条目加载 Material UI Theme
- angular - 有没有办法同步 ngx-chart 折线图,这样当悬停在一个图表上时,它会以相同的 x 值悬停在其他图表上?