Sql 尝试更新值时出错(光标)

Sql 尝试更新值时出错(光标),sql,plsql,Sql,Plsql,我正在尝试编写一个代码来更新基于表2的表 表1包含如下列:第1列、第2列、第3列 表2包含第2列: -第一列包含表1中应更新的列的名称 -第二个包含应设置的值 因此,表2输出: columnname,value ---------------- COLUMN1 , 'sometext' COLUMN2 , 'somethingelse' set serveroutput on; declare cursor doupdate is select columnname,value from T

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

表1包含如下列:第1列、第2列、第3列

表2包含第2列: -第一列包含表1中应更新的列的名称 -第二个包含应设置的值

因此,表2输出:

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:“纳兹瓦”:尼波普拉尼身份证明人 ORA-06550:linia 12,kolumna 1: PL/SQL:SQL语句被忽略

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


EDIT2。我对它进行了编辑,效果很好。我使用了动态SQL,所以它看起来像是:立即执行“updateaccset”| | nazwa | |“=”| | wartosc。有人能解释一下原因吗?:)

表1中有一个名为“nazwa”的专栏吗

如果你没有,那就是问题所在

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


编辑:可能您缺少更新中的WHERE子句。

这是
动态sql
,您必须使用
立即执行
命令执行它:

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
循环和
使用
子句将使事情变得更简单

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
变量(
executeimmediate/using
)将解决您的
smth,smth2
'smth,smth2'

您好,我编辑了我的帖子。我使用动态SQL:)现在我明白了,我误解了您想要实现的目标。抱歉:)嘿,Praveen,是的,几分钟后我意识到我应该使用动态SQL。我现在还有一个问题。当table2.value中的数据看起来像:smth,smth2时,我收到一条错误消息。当数据显示为“smth”和“smth2”时,一切正常,因此有倒逗号。有没有办法在不改变表2中数据的情况下处理这个问题?