Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用当前光标更改数据过程_Sql_Stored Procedures_Cursor_Oracle Sqldeveloper - Fatal编程技术网

Sql 使用当前光标更改数据过程

Sql 使用当前光标更改数据过程,sql,stored-procedures,cursor,oracle-sqldeveloper,Sql,Stored Procedures,Cursor,Oracle Sqldeveloper,我需要在SQLDeveloper中创建一个过程,可以将数据从一列移动到另一列。这些列位于不同的表中,因此我不知道如何编写代码 我假设使用游标将数据从一列传输到另一列,然后使用current of语句插入到另一列,尽管我不知道如何做,可能需要一些帮助。 我甚至不知道你是怎么做到的。 表1是使用customernumber、first namn、last namne和password构建的 表2只是customernumber和password。 我需要将密码从表2传输到表1 Cursor c_ne

我需要在SQLDeveloper中创建一个过程,可以将数据从一列移动到另一列。这些列位于不同的表中,因此我不知道如何编写代码

我假设使用游标将数据从一列传输到另一列,然后使用current of语句插入到另一列,尽管我不知道如何做,可能需要一些帮助。 我甚至不知道你是怎么做到的。 表1是使用customernumber、first namn、last namne和password构建的 表2只是customernumber和password。 我需要将密码从表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--
那么我应该在这里键入什么

在这之后,你开始这个过程,我不知道接下来要写什么,关于
更新密码
来自客户
其中c_newpass的当前值

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

更新: 由于您使用的是Oracle,因此此上的公认答案可能有助于您解决问题

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

我认为您使用的数据库管理系统与SQL Server不同,但概念应该相似。您将根据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

SQL只是一种查询语言——我们应该知道您使用的是什么具体的数据库(及其版本)——MySQL?博士后?IBM DB2?神谕SQL Server?跨数据库?完全是别的吗?它们都使用SQL,但许多功能都是特定于供应商的。请相应地更新您的标签!谢谢你的解释,我使用的是SQLDeveloper。我还应该使用“current of”语句来完成这项任务。我知道游标是如何工作的,但不知道当前的语句,这就是问题所在。这是一个大学的事情,我在课堂上落后了很多,因为我生病了>。检查我的最新答案。我想我所拥有的可能足以为你指明正确的方向。非常感谢你!我想我现在可以自己完成剩下的事情了:)