PL/SQL Oracle programming



我正试图将数据从Towns表(第列(输入到F表(第b列(。我想在光标中使用(select*fromTowns(,但它抛出了一个错误。相反,如果我使用(从城镇中选择一个地方(,我的程序会起作用。我想合并(从城镇中选择*(。

DECLARE
z_towns towns.place%TYPE;
CURSOR abc IS
(SELECT place FROM towns);
BEGIN
OPEN abc;
LOOP
FETCH abc INTO z_towns;
EXIT WHEN abc%NOTFOUND;
INSERT INTO F
(b)
VALUES(z_towns);
END LOOP;
CLOSE abc;
END;

您必须声明一个不同的"目标";变量-不仅适用于place列,还适用于towns表中的所有列。或者,更好的是,一个游标变量,它继承了整个游标返回值(abc%rowtype(的类型:

DECLARE
CURSOR abc IS
SELECT * FROM towns;
abc_r abc%rowtype;
BEGIN
OPEN abc;
LOOP
FETCH abc INTO abc_r;
EXIT WHEN abc%NOTFOUND;
INSERT INTO F (b) VALUES(abc_r.place);
END LOOP;
CLOSE abc;
END;

如果您使用光标FOR循环,那么它可以缩短,因为在这种情况下,Oracle为您完成了大部分工作:

BEGIN
FOR abc IN (SELECT * FROM towns) LOOP
INSERT INTO F (b) VALUES(abc.place);
END LOOP;
END;

当然,最简单(也是最快的,因为游标的逐行操作速度慢,如果您要处理大量数据,性能会受到影响(的选项是直接将行插入目标表:

INSERT INTO F (b) SELECT place FROM towns;

最新更新