2015-10-09 53 views
1

我在嘗試編寫更新我在table2上的表基的代碼。嘗試更新值時出現錯誤(光標)

表1包含列,如:COLUMN1,COLUMN2,欄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: 「由...」:niepoprawny identyfikator ORA-06550:linia 12,kolumna 1: PL/SQL:SQL語句忽略

我做錯了什麼?相同類型的列 - Varchar2(200字節) 編輯。只有與NAME的一個問題...任何人都知道該如何解決?...

EDIT2。我知道它,它工作正常。我使用動態SQL,因此它看起來像:執行立即'更新acc SET'|| nazwa ||'='|| wartosc; 。任何人都可以解釋,爲什麼呢?:)

回答

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'

+0

嗨Praveen,是的,幾分鐘後我意識到我應該使用動態SQL。我現在有其他問題。當table2.value中的數據如下所示時,我收到了一條錯誤消息:smth,smth2。當數據看起來一切正常時:'smth','smth2',所以有引號。有沒有辦法在不改變table2數據的情況下如何處理? – maciek2791

+0

看到編輯..... – Praveen

1

你有一個table1中名爲「由...」列?

如果您沒有,那將是問題所在。

如果你有,我想這混淆了Oracle服務器,因爲它不能決定你是否認爲有關列或在你的代碼命名變量由...。在這種情況下,您應該爲變量選擇另一個名稱。

編輯:也許你缺少你的WHERE子句更新。

+0

你好,我編輯我的職務問題。我通過動態SQL來實現:) – maciek2791

+0

現在我明白了,我誤解了你想實現的目標。對不起,:) –

相關問題