sql >> Base de Datos >  >> RDS >> Oracle

Unión que causa un ORA-01790:la expresión debe tener el mismo tipo de datos que la expresión correspondiente

Creo que no puedes hacer tal conversión en SQL. Pero en PL/SQL puedes:

CREATE OR REPLACE TYPE STRARRAY AS TABLE OF VARCHAR2 (255)
/

DECLARE
  tab STRARRAY;
  cnt NUMBER:= 0;
BEGIN
 SELECT COUNT(*)
  INTO cnt
   FROM TABLE(CAST(tab AS strarray));
  dbms_output.put_line(cnt);
END;
/

Creo que me equivoqué en mis suposiciones anteriores. No eliminé eso ya que sigue siendo un ejemplo válido. A continuación, el ejemplo de conversión de una columna de tabla existente (tabla emp) con COLLECT como tipo de table_type:

CREATE OR REPLACE TYPE varchar2_ntt AS TABLE OF VARCHAR2(4000);
/

SELECT deptno
    , CAST(COLLECT(ename) AS varchar2_ntt) AS emps
  FROM   scott.emp
GROUP  BY deptno
/

-- This is dumb but works:

SELECT deptno
     , CAST(COLLECT(ename) AS varchar2_ntt) AS emps
  FROM   scott.emp
 GROUP  BY deptno
 UNION ALL
 SELECT deptno
     , CAST(COLLECT(ename) AS varchar2_ntt) AS emps
   FROM   scott.emp
  GROUP  BY deptno
 /