2013-12-17 42 views
0

我需要在SQL Developer中創建一個可以將數據從一列移動到另一列的過程。這些列在不同的表中,所以我不知道如何編寫代碼。使用遊標當前值更改數據過程

我想要使用光標從一列轉移數據,然後插入到其他列使用當前的聲明,雖然我不知道如何做,並可以使用一些幫助。 我甚至不知道你如何做到這一點。 表1是用客戶編號,第一個namn,最後一個namne和密碼構建的 表2只是客戶編號和密碼。 我需要從表2的轉移口令表1

Cursor c_newpass is 
select */passwd/cnumbr/cnmbr,passwd -- dont know what to select here -- 
from customersecurity 
for update of --passwd, which is in a column in another table called customer-- 

我怎麼輸入^ ^在這裏呢?

在此之後,你開始的程序,我沒有任何想法,接下來寫什麼,東西長約 update passwd from customer where current of c_newpass

我真的不知道,但我知道我已經寫不工作的例子。但我想一個循環可以用來更新每一行,因爲我認爲你不能同時更新整個列。 我很感激,如果有人可以寫整個程序,至少是一個例子,所以我知道該怎麼做。 感謝您的幫助!

+0

SQL只是查詢語言 - 我們應該知道什麼**具體數據庫**(以及它的哪個版本) - MySQL? Postgres的? IBM DB2?甲骨文? SQL Server? Interbase的?還有其他的東西嗎?他們都使用SQL - 但許多功能都是針對特定供應商的。請相應地更新您的標籤! –

回答

1

UPDATE: 由於您使用的甲骨文,在接受的答案這link可以幫助你弄明白你...

當你創建你的光標,你會之間加入兩個表,並指定更新(要更新的列)。從那裏,WHERE CURRENT OF c_newpass只是指由與c_newpass關聯的FETCH語句處理的最新行。

這只是我認爲它會起作用的粗略想法。

Cursor c_newpass IS 
select customersecurity.password, customersecurity.cnumbr, table1.cnumbr, table1.password 
from customersecurity, table1 
for update of table1.password 

然後,您應該能夠遍歷c_newpass,獲取下一行並更新表1

Update table1 
Set password = password 
WHERE CURRENT OF c_newpass 

SQL SERVER例如: 它可能不是你所需要的,但它可以顯示你如何運行遊標以及如何完成你所需要的。我有2個表,我需要將Foo中的名稱傳輸/複製到Bar中的名稱,因爲Bar表具有NULL名稱。我創建了兩個變量,一個用於ID和一個用於保存當前遊標(someCursor)所在位置的名稱。一旦設置了光標,您需要從中獲取FETCH NEXT聲明中的項目,並使用INTO設置@ID@Name的變量。我通過檢查@@Fetch_Status開始一段時間循環,以確保前面的語句成功。如果是這樣,我使用剛設置的變量來更新Bar表,匹配ID並使用@Name的內容更新Name列。一旦完成,我再次使用FETCH NEXT獲得光標中的下一項。假設光標中有另一個項目,並且它已成功完成,它將再次完成。

我認爲你使用的是與SQL Server不同的DBMS,但這個概念應該是類似的。您將基於customersecurity表創建遊標,選擇ID和密碼,然後根據這些列更新新表。

Create Table Foo(
ID int identity primary key, 
Name varchar(20) 
) 

Create Table Bar(
ID int identity primary key, 
Name varchar(20) 
) 

Insert Into Foo Values('ABC') 
Insert Into Foo Values('XYZ') 
Insert Into Foo Values('JMK') 

Insert Into Bar Values(NULL) 
Insert Into Bar Values(NULL) 
Insert Into Bar Values(NULL) 

declare @ID int, @name varchar(20) 

Declare someCursor CURSOR FOR 
Select ID, Name From Foo order by ID 

OPEN someCursor 

FETCH NEXT FROM someCursor 
INTO @ID, @name 

WHILE @@Fetch_Status = 0 
BEGIN 
    Update Bar 
    Set Name = @Name 
    Where ID = @ID 

    FETCH NEXT FROM someCursor 
    INTO @ID, @name 
END 

Close someCursor 
Deallocate someCursor 

select * from Foo 
select * from Bar 
+0

謝謝你的探索,即時通訊使用SQL開發人員。我也想爲這項任務使用「當前」聲明。我知道遊標是如何工作的,但不知道遊戲目前的問題。 這是一件大學的事情,在課堂上我很落後,因爲我生病了。< – user2064844

+0

檢查我更新的答案。我認爲我所擁有的可能足以讓你指向正確的方向。 – JMK

+0

非常感謝!我想我現在可以自己完成剩下的工作:) – user2064844

相關問題