Oracle
 sql >> Base de données >  >> RDS >> Oracle

Union provoquant un ORA-01790 :l'expression doit avoir le même type de données que l'expression correspondante

Je pense que vous ne pouvez pas faire un tel casting en SQL. Mais en PL/SQL, vous pouvez :

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

Je pense que je me suis trompé dans mes hypothèses ci-dessus. Je ne l'ai pas supprimé car il s'agit d'un exemple toujours valable. Ci-dessous, l'exemple de conversion d'une colonne de table existante (table emp) avec COLLECT comme type 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
 /