【问题标题】:Error while trying to update values (cursor)尝试更新值时出错(光标)
【发布时间】:2025-12-15 13:50:02
【问题描述】:

我正在尝试编写一个基于 table2 更新我的表的代码。

Table1 包含如下列:COLUMN1,COLUMN2,COLUMN3...

Table2 包含第 2 列: - 第一列包含 table1 中应该更新的列的名称 -第二个包含应该设置的VALUE

所以 Table2 输出:

columnname,value
----------------
COLUMN1 , 'sometext'
COLUMN2 , 'somethingelse'


set serveroutput on;
declare cursor doupdate
is
select columnname,value from TABLE2;
nazwa TABLE2.columnname%type;
wartosc TABLE2.value%type;
begin
open doupdate;
loop
fetch doupdate into nazwa,wartosc;
exit when doupdate%notfound;
update table1 set nazwa=wartosc;
end loop;
end;

在尝试运行该代码时,我收到一条错误消息:

PL/SQL: ORA-00904: "NAZWA": niepoprawny identyfikator ORA-06550: linia 12, kolumna 1: PL/SQL:忽略 SQL 语句

我做错了什么?相同类型的列 - Varchar2(200 字节) 编辑。只有NAME有问题...有人知道解决方案吗?...

EDIT2。我做了它,它工作正常。我使用了动态 SQL,所以它看起来像:execute immediate 'update acc SET '||nazwa||'='||wartosc; .谁能解释一下为什么?:)

【问题讨论】:

    标签: sql plsql


    【解决方案1】:

    这是dynamic sql,你必须用Execute immediate命令执行它:

    declare 
        cursor doupdate
        is
        select columnname,value from TABLE2;
        nazwa TABLE2.columnname%type;
        wartosc TABLE2.value%type;
        dyn_sql varchar2(500);
    begin
        open doupdate;
        loop
            fetch doupdate into nazwa,wartosc;
            exit when doupdate%notfound;
            dyn_sql := 'update table1 set ' || nazwa || '=' ||wartosc;
            execute immediate dyn_sql
        end loop;
    end;
    

    编辑
    for 循环和using 子句将使事情变得更简单。

    declare 
        dyn_sql varchar2(500);
    begin
        for i in (select columnname,value from TABLE2) loop
            dyn_sql := 'update table1 set ' || i.columnname || ' = :a';
            execute immediate dyn_sql using i.value
        end loop;
    end;
    

    bind 变量 (execute immediate/using) 将解决您的smth, smth2'smth, smth2' 问题

    【讨论】:

    • 嘿 Praveen,是的,几分钟后我意识到我应该使用动态 SQL。我现在有其他问题。当 table2.value 中的数据看起来像:smth,smth2 时,我收到一条错误消息。当数据看起来一切正常:'smth','smth2' 所以有逗号。有什么方法可以在不更改 table2 中的数据的情况下处理它?
    【解决方案2】:

    table1 中有名为“nazwa”的列吗?

    如果你没有,那就是问题。

    如果有,我想这会使 Oracle 服务器感到困惑,因为它无法决定您是考虑该列还是代码中名为 nazwa 的变量。在这种情况下,您应该为变量选择另一个名称。

    编辑:也许您在 UPDATE 中缺少 WHERE 子句。

    【讨论】:

    • 你好,我编辑了我的帖子。我通过使用动态 SQL 做到了:)
    • 现在我明白了,我误解了您想要实现的目标。对此感到抱歉:)