2012-11-13 21 views
8

ich Abfrage mit mir zu folgen habe, dass ich versuche zu laufen:Zeichensatz Mismatch Fehler bei Oracle

SELECT Script from (

SELECT 9 as ColOrder, ' INSERT INTO PROJ VALUES(' || ID || ',''' || Name || ''', ''' || Version || ''', ''ABCD'', sysdate , ''ABCD'', sysdate);' as Script FROM PROJ where Name like '%[Param.1]%' 

union 

SELECT 11 as ColOrder,' INSERT INTO PROJMOD VALUES(' || ID || ', ' || ProjID || ', ' || ModID || ', ' || ObjID || ', ''ABCD'', sysdate, ''ABCD'', sysdate);' as Script FROM PROJMOD where ProjID in (select ID from PROJ where Name like '%[Param.1]%') 

) x 

Order by ColOrder 

Aber es gibt mir ORA-12704: character set mismatch error.

Wenn ich sowohl die Select-Anweisung einzeln ausführen, gibt es mir korrekte Ausgabe, aber wenn ich Vereinigung von beiden mache, gibt es den Unterschied zwischen den Zeichensatzfehlern.

Was kann hier falsch sein?

+0

Als colorder ist nicht mergable try Union alle statt der Union. Verfügt eine der Spalten über die Datentypen nvarchar oder nchar? – DazzaL

+0

Ja, 'ABCD' Spalte ist von NVARCHAR2. Ich habe versucht, UNION ALL zu verwenden, aber es gibt mir denselben Fehler. –

+0

es wird nicht das wörtliche ABCD aber eine Spalte (ID projid oder Name usw.) siehe meine Antwort für Details. – DazzaL

Antwort

1
SELECT Script from (

SELECT 9 as ColOrder, ' INSERT INTO PROJ VALUES(' || to_char(ID) || ',''' || to_char(Name) || ''', ''' || to_char(Version) || ''', ''ABCD'', sysdate , ''ABCD'', sysdate);' as Script FROM PROJ where Name like '%[Param.1]%' 

union 

SELECT 11 as ColOrder,' INSERT INTO PROJMOD VALUES(' || to_char(ID) || ', ' || to_char(ProjID) || ', ' || to_char(ModID) || ', ' || to_char(ObjID) || ', ''ABCD'', sysdate, ''ABCD'', sysdate);' as Script FROM PROJMOD where ProjID in (select ID from PROJ where Name like '%[Param.1]%') 

) x 

Order by ColOrder 

Ich habe TO_CHAR Funktionen hinzugefügt, und das wird funktionieren. Offenbar haben Sie Felder mit Zeichendatentypen, die von Oracle nicht implizit umgewandelt werden können, Sie müssen sie also nur explizit selbst umsetzen, vermeiden Sie jedoch, dass Zeichen aufgrund von Cast verloren gehen.

+1

Sie brauchen nicht und sollten in diesem Fall nicht Union verwenden. benutze "union all" – DazzaL

10

wie Sie einige Dinge bestätigt haben, sind NVARchar'd ..cast der nvarchar verkohlen zB

SQL> create table tab(a nvarchar2(2)); 

Table created. 

SQL> insert into tab values ('a'); 

1 row created. 

SQL> select 1, 'hi' from dual 
    2 union all 
    3 select 2, a from tab; 
select 1, 'hi' from dual 
      * 
ERROR at line 1: 
ORA-12704: character set mismatch 

nicht als "A" NVARCHAR ist. so TO_CHAR es:

SQL> select 1, 'hi' from dual 
    2 union all 
    3 select 2, to_char(a) from tab; 

     1 'HI' 
---------- ---- 
     1 hi 
     2 a 

oder werfen die Stringliteral ‚hallo‘ zu einem Nvarchar

SQL> select 1, n'hi' from dual 
     2 union all 
     3 select 2, a from tab; 

      1 N' 
    ---------- -- 
      1 hi 
      2 a 
0

Wenn Sie diesen Fehler nehmen, sollten Sie an zwei Bedingungen aussehen.

  1. Alle Spaltenname oder Alias ​​muss für alle Tabellen gleich sein
  2. Alle Spalte gleichen Typs TableA (col NVARCHAR2) sein müssen, TableB (col NVARCHAR2)