使用光标电流更改数据过程



我需要在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

真的不知道,但我知道我写的例子不起作用。但是我想可以使用循环来更新每一行,因为我假设您不能同时更新整列。如果有人可以编写整个过程,至少是一个示例,以便我知道该怎么做,我将不胜感激。感谢您的任何帮助!

更新:由于您使用的是 Oracle,因此此链接上接受的答案可能有助于为您澄清问题......

创建游标时,您将在拥有的两个表之间联接,并指定要更新的 (要更新的列)。 从那里,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 服务器示例:它可能不是您需要的,但它可以向您展示光标的工作原理以及它们如何完成您需要的功能。 我有 2 个表,我需要将 Foo 中的名称传输/复制到 Bar 中的名称,因为 Bar 表具有 NULL 名称。 我创建了 2 个变量,一个用于 ID,一个用于名称,它们将用于保存光标 (someCursor) 当前所在位置的内容。 设置光标后,您需要从中获取项目,这是 FETCH NEXT 语句并使用 INTO@ID@Name 设置变量。 我通过检查@@Fetch_Status来启动 while 循环,以确保上一个语句成功。如果是这样,我使用刚刚设置为更新 Bar 表的变量,匹配 ID 并使用 @Name 的内容更新 Name 列。 完成后,我再次使用FETCH NEXT在光标中获取下一项。假设光标中有另一个项目,并且它成功了,它将重新执行。

我认为您使用的DBMS与SQL Server不同,但概念应该是相似的。 您将基于客户安全表创建游标,选择 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

最新更新