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

时间:2015-10-09 09:06:32

标签: sql plsql

我正在尝试编写一个代码,用于在table2上更新我的表格。

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

表2包含第2列: -First列包含table1中应该更新的列的名称 -Second包含应设置的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看起来像:执行立即&更新acc SET' || nazwa ||' =' || wartosc; 。任何人都可以解释为什么吗?:)

2 个答案:

答案 0 :(得分:1)

你有一个名为' nazwa'在table1?

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

如果你有,我猜这会混淆Oracle服务器,因为它无法决定你是否考虑代码中的那一列或名为nazwa的变量。在这种情况下,您应该为变量选择另一个名称。

编辑:也许您正在从您的UPDATE中删除WHERE子句。

答案 1 :(得分: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)将解决您的问题[{1}}和smth, smth2