我正在尝试编写一个代码,用于在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; 。任何人都可以解释为什么吗?:)
答案 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