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中的条件块。 大多数代码都会被转换,因为只有一个条件块,因此只需修改逻辑的一小部分。 属性 FOUNDIF @@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 ,然后再对游标执行任何操作。