O2SS0265:无法转换条件 (错误)
本文介绍了为什么 SQL Server 迁移助手 (SSMA) for Oracle 不转换具有CURSOR
任何条件运算符的属性的语句。
背景
是 CURSOR
一种机制,可用于为 SELECT
语句分配名称并操作该 SQL 语句中的信息。 数据库程序员使用游标来处理数据库系统查询返回的单个行。
尽管 SSMA 有助于模拟各种游标属性,但它在遇到具有某些条件逻辑(如 )的 IS NULL
游标语句时会生成错误消息。
示例
请考虑以下示例,该示例旨在检查是否CURSOR
提取值。 此外,下面的代码将提供表中整个员工编号 EMP
的列表。
DECLARE
emp_no emp.empno%TYPE;
CURSOR c1 IS select empno from emp;
BEGIN
OPEN c1;
IF (c1%FOUND IS NULL) THEN
DBMS_OUTPUT.PUT_LINE('Cursor Is Not Found');
ELSE
DBMS_OUTPUT.PUT_LINE('Cursor Found');
END IF;
LOOP
FETCH c1 INTO emp_no;
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(emp_no);
END LOOP;
CLOSE c1;
END;
尝试在 SSMA 中转换上述代码时,会生成以下错误消息:
O2SS0265:无法转换条件
可能的补救措施
上述错误的解决方案是在使用 SSMA 转换代码后重写SQL Server中的条件块。 大多数代码都会被转换,因为只有一个条件块,因此只需修改逻辑的一小部分。 属性 FOUND
将 IF @@FETCH_STATUS = 0
转换为 , NOTFOUND
属性将 IF @@FETCH_STATUS <> 0
转换为 。 下面是手动转换的代码:
BEGIN
DECLARE
@emp_no numeric(4, 0)
DECLARE
c1 CURSOR LOCAL
FOR
SELECT EMP.EMPNO
FROM dbo.EMP
OPEN c1
IF (@@FETCH_STATUS) = 0
BEGIN
PRINT 'Cursor Found'
END
ELSE
PRINT 'Cursor Is Not Found'
WHILE 1 = 1
BEGIN
FETCH c1 INTO @emp_no
IF @@FETCH_STATUS <> 0
BREAK
PRINT @emp_no
END
CLOSE c1
DEALLOCATE c1
END
注意
一般情况下,在对 CURSOR
属性执行任何操作之前,应提取游标。 因此,对于上面的示例,请确保先执行 FETCH c1 INTO @emp_no
,然后再对游标执行任何操作。