Compartir a través de


O2SS0334: cláusula BULK COLLECT INTO no convertida (error)

En este artículo se describen algunos de los motivos por los que SQL Server Migration Assistant (SSMA) para Oracle no puede convertir una instrucción que contenga la BULK COLLECT INTO cláusula (una consulta de categoría de colección).

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 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 ruta de acceso para una migración de colecciones de Oracle, sin embargo, cuando el recuento de listas no coincide con el BULK COLLECT INTO conjunto de recopilación, SSMA no puede realizar la conversión y genera un mensaje de error.

Ejemplo

En el ejemplo siguiente, la dept tabla tiene dos columnas (deptno y dname) en ella y la SELECT instrucción usa un asterisco:

DECLARE
    TYPE test_deptno IS TABLE OF number;
    var_deptno test_deptno;
BEGIN
    SELECT
        *
    BULK COLLECT INTO
        var_deptno
    FROM
        dept;
END;

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

O2SS0334: cláusula BULK COLLECT INTO no convertida

Posibles soluciones

La solución consiste en normalizar el número de columnas enumeradas en la SELECT cláusula con el número de variables usadas en la BULK COLLECT INTO cláusula . En el ejemplo, el asterisco se expande en dos columnas de la dept tabla, mientras que solo hay una variable en la BULK COLLECT INTO cláusula .

Para migrar correctamente el ejemplo, capture solo la deptno columna de la dept tabla o agregue otra variable en BULK COLLECT INTO la cláusula , según sus necesidades.

En el ejemplo siguiente se agrega una variable a BULK COLLECT INTO la cláusula :

DECLARE
    TYPE test_deptno IS TABLE OF number;
    TYPE test_dname IS TABLE OF varchar2(20);
    var_deptno test_deptno;
    var_dname test_dname;
BEGIN
    SELECT
        deptno,
        dname
    BULK COLLECT INTO
        var_deptno,
        var_dname
    FROM
        dept;
END;