Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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;
Mensajes de conversión relacionados
- O2SS0334: cláusula BULK COLLECT INTO no convertida (error)
- O2SS0351: no se admite la conversión del método de recopilación (error)
- O2SS0407: tipo de clave de colección no compatible