将新列添加到现有表中并使用 PL/SQL 中游标中的值更新它们

Posted

技术标签:

【中文标题】将新列添加到现有表中并使用 PL/SQL 中游标中的值更新它们【英文标题】:Add new columns into an existing table and Update them using values from a cursor in PL/SQL 【发布时间】:2015-10-05 00:49:30 【问题描述】:

在图片中有一个我拥有的表和我需要创建的表的示例。

我必须使用表测试计算一些值,然后向其中添加一些新列(Id2x 和 Id3x),并使用我计算的值更新这些列。我发现问题在于尝试创建列并更改它。如果我的表中已经有 id2x 和 id3x 列,我可以更新表,只要我注释行 EXECUTE IMMEDIATE 'Alter table Testing add (id2X NUMBER, id3X NUMBER)';

SET SERVEROUTPUT ON
DECLARE
  CURSOR cursorP IS
        SELECT id, (2*id) as id2X, (3*id)as id3X
        FROM Testing
        FOR UPDATE OF id2X, id3X;
BEGIN          
  EXECUTE IMMEDIATE 'Alter table Testing add (id2X NUMBER, id3X NUMBER)';

  FOR line IN cursorP LOOP
    UPDATE Testing 
    SET id2X = line.id2X,
        id3X = line.id3X
    WHERE current of cursorP;
  END LOOP;
END;

错误:

ORA-06550:第 10 行,第 33 列: PL/SQL:ORA-00904:“ID3X”:无效标识符 ORA-06550:第 9 行,第 5 列: PL/SQL:忽略 SQL 语句 06550. 00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译

【问题讨论】:

您好,我想您忘了说您希望我们帮助您解决什么问题。您在运行此块时遇到任何错误吗? 错误代码是葡萄牙语,这就是为什么我没有在这里发布它,但我尝试翻译它现在就在那里 你打算把这个块变成一个过程吗?还是一次性执行块? 我只需要执行一次上面的脚本 我发现如果我的表中已经有 id2x 和 id3x 列,我可以更新表,只要我注释行 EXECUTE IMMEDIATE 'Alter table Testing add (id2X NUMBER, id3X NUMBER) '; 【参考方案1】:

如果它只是一个一次性执行块,只需将 alter 语句移到块之外。试试这个

SET SERVEROUTPUT ON
Alter table Testing add (id2X NUMBER, id3X NUMBER);

DECLARE
  CURSOR cursorP IS
        SELECT id, (2*id) as id2X, (3*id)as id3X
        FROM Testing
        FOR UPDATE OF id2X, id3X;
BEGIN          


  FOR line IN cursorP LOOP
    UPDATE Testing 
    SET id2X = line.id2X,
        id3X = line.id3X
    WHERE current of cursorP;
  END LOOP;
END;

【讨论】:

以上是关于将新列添加到现有表中并使用 PL/SQL 中游标中的值更新它们的主要内容,如果未能解决你的问题,请参考以下文章

在迁移中向现有表添加新列

Phpmyadmin - 将新列导入现有记录

将新列添加到 Oracle 表后生成主键值

sql [ALTER TABLE ADD COLUMN]将新列添加到现有表#SQL

如何在 PL/SQL 代码的 for 循环中创建游标并将结果批量收集到表中

PL/SQL 仅使用游标将 2 个表中的数据检索到新表中