Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Union verursacht ORA-01790:Der Ausdruck muss den gleichen Datentyp wie der entsprechende Ausdruck haben

Ich denke, Sie können ein solches Casting nicht in SQL durchführen. Aber in PL/SQL können Sie:

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

Ich glaube, ich habe mich in meinen obigen Annahmen geirrt. Ich habe das nicht gelöscht, da es immer noch ein gültiges Beispiel ist. Das folgende Beispiel konvertiert eine vorhandene Tabellenspalte (emp-Tabelle) mit COLLECT als Typ von 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
 /