我正在尝试执行以下代码:
DECLARE
CURSOR select_grupos IS SELECT * FROM grupo_musical;
grupo grupo_musical%ROWTYPE;
contador NUMBER;
TYPE ciudades IS TABLE OF VARCHAR2(30);
capitales_vascas ciudades;
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE GRUPO_MUSICAL ADD ciudad_origen VARCHAR2(30)';
capitales_vascas := ciudades('Bilbao', 'Donostia', 'Gasteiz');
contador := 0;
FOR grupo IN select_grupos LOOP
grupo.ciudad_origen := capitales_vascas(MOD(contador, 3) + 1);
UPDATE grupo_musical SET ROW=grupo WHERE id_grupo=grupo.id_grupo;
contador := contador + 1;
END LOOP;
END;
/它说我必须声明'ciudad_origen‘。我理解这是因为当我创建游标时,Alter table还没有完成。有没有其他方法可以让我编程呢?
谢谢。
发布于 2021-10-19 08:02:20
我理解这是因为当我创建游标时,Alter table还没有完成
一点儿没错。这就是为什么动态SQL是邪恶的。为什么要更改PL/SQL中的表?在SQL级别更改它,然后编写“普通”代码有什么错?
如果您坚持这样做,那么您将不得不将everything转换为dynamic SQL,因为您已经注意到,您不能引用还不存在的列。
那么,为什么它是邪恶的呢?因为动态SQL很难调试和维护。注意你必须转义的所有单引号(或使用q-quoting机制),格式不佳的代码(没有GUI内置格式化程序会接触引号中的代码,就其而言,引号只是一个字符串)等。
我建议您先修改table,然后编写PL/SQL代码。
https://stackoverflow.com/questions/69626968
复制相似问题