第九十章 SQL命令 WHERE CURRENT OF

文章目录

第九十章 SQL命令 WHERE CURRENT OF

使用游标指定当前行的UPDATE/DELETE子句。

大纲

WHERE CURRENT OF cursor

参数

  • cursor - 指定在光标的当前位置执行操作,光标是指向表的光标。

描述

WHERE CURRENT OF子句可用于基于游标的嵌入式SQL UPDATEDELETE语句,以指定位于要更新或删除记录上的游标。
例如:

   &sql(DELETE FROM Sample.Employees WHERE CURRENT OF EmployeeCursor)

删除最后一个FETCH命令从“EmployeeCursor”游标获得的行。

嵌入式SQL UPDATEDELETE可以使用WHERE子句(不带游标)或WHERE CURRENT OF(带声明游标),但不能同时使用两者。
如果指定的UPDATEDELETE既不带WHERE也不带WHERE CURRENT OF,则会更新或删除表中的所有记录。

更新的限制

当使用WHERE CURRENT OF子句时,不能使用当前字段值更新字段以生成更新的值。
例如,SET Salary=Salary+100SET Name=UPPER(Name)
尝试这样做会导致SQLCODE -69错误:SET <field> = <value expression> not allowed with WHERE CURRENT OF <cursor>

示例

下面的嵌入式SQL示例显示了使用WHERE CURRENT OFUPDATE操作:

ClassMethod WhereCurrentOf()
{
	n %ROWCOUNT,%ROWID
	&sql(
		DECLARE WPCursor CURSOR FOR 
			SELECT Lang FROM SQLUser.WordPairs
			WHERE Lang='Sp'
	)
	&sql(OPEN WPCursor)
	q:(SQLCODE '= 0)
	for { 
		&sql(FETCH WPCursor)
		q:SQLCODE 
		&sql(
			UPDATE SQLUser.WordPairs SET Lang='Es'
			WHERE CURRENT OF WPCursor
		)
		if SQLCODE = 0 {
			w !,"Update succeeded"
			w !,"Row count=",%ROWCOUNT," RowID=",%ROWID 
		} else {
			w !,"Update failed, SQLCODE=",SQLCODE 
		}
	}
	&sql(CLOSE WPCursor)
}

下面的嵌入式SQL示例显示了使用WHERE CURRENT OFDELETE操作:

ClassMethod WhereCurrentOf1()
{
	n %ROWCOUNT,%ROWID
	&sql(
		DECLARE WPCursor CURSOR FOR 
		SELECT Lang FROM SQLUser.WordPairs
		WHERE Lang='En'
	)
	&sql(OPEN WPCursor)
	q:(SQLCODE'=0)
	for { 
		&sql(FETCH WPCursor)
		q:SQLCODE 
		&sql(
			DELETE FROM SQLUser.WordPairs
			WHERE CURRENT OF WPCursor
		)
		if SQLCODE=0 {
			w !,"Delete succeeded"
			w !,"Row count=",%ROWCOUNT," RowID=",%ROWID 
		} else {
			w !,"Delete failed, SQLCODE=",SQLCODE 
		}
	}
	&sql(CLOSE WPCursor)
}
### 如何在 SQL 中执行赋值操作 #### 使用 `SET` 语句进行变量赋值 在存储过程或批处理脚本中,可以使用 `SET` 或者 `SELECT INTO` 来给局部变量赋值。对于单个值的简单赋值通常推荐使用 `SET`。 ```sql DECLARE @myVariable INT; SET @myVariable = 10; ``` 此方法适用于大多数数据库管理系统,包括 MySQL 和 Microsoft SQL Server[^3]。 #### 利用子查询为变量赋值 当需要从表中获取数据并将其赋予一个变量时,则可以通过带有 `INTO` 的 `SELECT` 语句来实现: ```sql DECLARE @address VARCHAR(255); SELECT TOP 1 @address = addr FROM chinadba1 WHERE userid = 4; ``` 这段代码展示了如何通过子查询的方式把符合条件的第一条记录中的地址字段值存入到名为 `@address` 的变量里。 #### 结合条件逻辑进行动态赋值 为了更灵活地控制程序流程,在某些情况下可能希望基于特定条件来进行不同的赋值动作。这时就可以借助于 `CASE WHEN THEN ELSE END` 表达式完成这一目标: ```sql SELECT name, score, CASE WHEN score >= 90 THEN '优秀' WHEN score >= 80 THEN '良好' WHEN score >= 70 THEN '及格' ELSE '不及格' END AS grade FROM students; ``` 上述例子说明了怎样利用 `CASE` 构造新的列内容作为成绩等级评定的结果[^2]。 #### 创建新对象的同时初始化属性 除了单独设置现有实体上的某个特性外,还可以在定义结构化组件(比如表格)的过程中直接指定初始状态或者默认行为。这涉及到诸如 `CREATE TABLE` 命令下的列级约束和触发器等功能[^1]。 ```sql CREATE TABLE employees ( id INT PRIMARY KEY AUTO_INCREMENT, first_name VARCHAR(50), last_name VARCHAR(50), hire_date DATE DEFAULT CURRENT_DATE() ); ``` 这里展示了一个自动增长主键以及雇佣日期缺省取当前系统的做法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yaoxin521123

谢谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值