首页 > 解决方案 > 在 pl/sql 中将数据从游标添加到表时出现“不允许列”错误

问题描述

我正在研究一些练习题来帮助我学习 pl/sql。我需要使用游标将数据从一个表添加到另一个表。我的代码如下。我曾经dbms_output.put_line确保游标中有数据,并且游标中的数据通过循环一次将其放入变量c_enamec_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;

标签: sqloracleplsqlrdbms

解决方案


如果你在取

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 为您完成所有这些你。


推荐阅读