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

Plsql 将新列添加到现有表中,并使用PL/SQL中游标的值更新它们,plsql,sql-update,cursor,alter,Plsql,Sql Update,Cursor,Alter,图中有一个我拥有的表和我需要创建的表的示例 我必须使用表测试计算一些值,然后向其中添加一些新列(Id2x和Id3x),并使用我计算的值更新这些列。我发现问题在于试图创建列,然后更改它们。如果我的表中已经有id2x和id3x列,只要我注释行executeimmediate'Alter table Testing add(id2x NUMBER,id3x NUMBER)”,我就可以更新表 错误: ORA-06550:第10行第33列: PL/SQL:ORA-00904:“ID3X”:无效标识符 O

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

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

错误:

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


如果只是一次性执行块,只需将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;

如果只是一次性执行块,只需将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;

如果只是一次性执行块,只需将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;

如果只是一次性执行块,只需将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;


嗨,我想你忘了说你想让我们帮你解决什么问题了。你在运行这个程序块时遇到了什么错误吗?错误代码是葡萄牙语的,所以我没有在这里发布,但是我试着翻译,现在是这样了。你打算把这个块变成一个过程吗?还是这是一个一次性执行块?我只需要执行上面的一次脚本。我发现,如果我的表中已经有id2x和id3x列,我可以更新表,只要我注释行execute IMMEDIATE“Alter table Testing add”(id2X号码,id3X号码)’;嗨,我想你忘了说你想让我们帮你解决什么问题了。当你运行这个程序块时,你遇到了什么错误吗?错误代码是葡萄牙语的,这就是为什么我没有在这里发布它,但我试着翻译,现在它就在那里了。你打算让这个程序块成为一个过程吗?还是这是一个一次性执行的程序块?我需要重新编译执行上面的脚本一次我发现如果我的表中已经有id2x和id3x列,我可以更新表,只要我注释行EXECUTE IMMEDIATE'Alter table Testing add(id2x NUMBER,id3x NUMBER)’;嗨,我想你忘了说你想让我们帮你解决什么问题了。当你运行这个程序块时,你遇到了什么错误吗?错误代码是葡萄牙语的,这就是为什么我没有在这里发布它,但我试着翻译,现在它就在那里了。你打算让这个程序块成为一个过程吗?还是这是一个一次性执行的程序块?我需要重新编译执行上面的脚本一次我发现如果我的表中已经有id2x和id3x列,我可以更新表,只要我注释行EXECUTE IMMEDIATE'Alter table Testing add(id2x NUMBER,id3x NUMBER)’;嗨,我想你忘了说你想让我们帮你解决什么问题了。当你运行这个程序块时,你遇到了什么错误吗?错误代码是葡萄牙语的,这就是为什么我没有在这里发布它,但我试着翻译,现在它就在那里了。你打算让这个程序块成为一个过程吗?还是这是一个一次性执行的程序块?我需要重新编译执行上面的脚本一次我发现如果我的表中已经有id2x和id3x列,我可以更新表,只要我注释行executeimmediate“altertablettestingadd(id2x NUMBER,id3x NUMBER)”;