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 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;