Compartir a través de


O2SS0352: cláusula BULK COLLECT INTO en la instrucción SELECT no convertida (error)

En este artículo se explica por qué SQL Server Migration Assistant (SSMA) para Oracle no convierte los bloques PL/SQL cuando SELECT se usa la instrucción con BULK COLLECT INTO la cláusula y DISTINCT la cláusula .

Fondo

Una colección es un grupo ordenado de elementos, todo el mismo tipo. Es un concepto general que abarca listas, matrices y otros tipos de datos conocidos. Cada elemento tiene un subíndice único que determina su posición en la colección. La DISTINCT cláusula especifica que solo puede aparecer un valor único en el conjunto de resultados. La BULK COLLECT INTO cláusula enlaza la salida de la consulta a la colección, lo que produce menos comunicación entre los motores PL/SQL y SQL.

SSMA proporciona una ruta de migración para las colecciones de Oracle. Sin embargo, si la SELECT instrucción usada para rellenar la colección usa una DISTINCT cláusula , SSMA genera el mensaje de error.

Ejemplo

En el ejemplo siguiente, se usa una SELECT instrucción con una DISTINCT cláusula y BULK COLLECT INTO una cláusula :

CREATE OR REPLACE PROCEDURE BULK_COLLECT_WITH_DISTINCT
AS
BEGIN
    DECLARE
        TYPE tbl_type_DNAME IS TABLE OF varchar2(14);
        var_dname tbl_type_DNAME;
    BEGIN
        SELECT DISTINCT DNAME
        BULK COLLECT INTO var_dname
        FROM dept;

        IF var_dname.COUNT = 0 THEN
            DBMS_OUTPUT.PUT_LINE('No results!');
        ELSE
            DBMS_OUTPUT.PUT_LINE('Results:');

            FOR i IN var_dname.FIRST..var_dname.LAST LOOP
                DBMS_OUTPUT.PUT_LINE(' DEPT NAME #' || var_dname(i));
            END LOOP;
        END IF;
    END;
END;

Al intentar convertir el código anterior en SSMA, genera el siguiente mensaje de error:

O2SS0352: cláusula BULK COLLECT INTO en la instrucción SELECT no convertida

Posibles soluciones

Para convertir el bloque PL/SQL anterior, reemplace DISTINCT la cláusula por UNIQUE (un sinónimo de DISTINCT) como se indica a continuación:

CREATE OR REPLACE PROCEDURE BULK_COLLECT_WITH_DISTINCT
AS
BEGIN
    DECLARE
        TYPE tbl_type_DNAME IS TABLE OF varchar2(14);
        var_dname tbl_type_DNAME;
    BEGIN
        SELECT UNIQUE DNAME
        BULK COLLECT INTO var_dname
        FROM dept;

        IF var_dname.COUNT = 0 THEN
            DBMS_OUTPUT.PUT_LINE('No results!');
        ELSE
            DBMS_OUTPUT.PUT_LINE('Results:');

            FOR i IN var_dname.FIRST..var_dname.LAST LOOP
                DBMS_OUTPUT.PUT_LINE(' DEPT NAME #' || var_dname(i));
            END LOOP;
        END IF;
    END;

END;