2017-01-24 209 views
2

ループ内に表TBLを移入しようとしています。サブクエリでORA-12704: character set mismatchを取得します。ここで は、クエリは、私が使用している:PL/SQL:ORA-12704:varchar2をnvarchar2に挿入すると文字セットが一致しない

BEGIN 
    FOR i IN (SELECT t.Stuff FROM STUFF_TABLE t ORDER BY t.Name ASC) 
    LOOP 
    INSERT INTO TBL(StuffId, StuffName) 
      VALUES(
      i.Stuff, 
      (SELECT TempStuffName FROM 
       (SELECT COALESCE(st.StuffName, i.Stuff) as TempStuffName FROM STUFFDEFINITION st WHERE st.Stuff = i.Stuff ORDER BY st.Version DESC) 
      WHERE ROWNUM = 1) 
     ); 
    END LOOP; 
END; 

列タイプは以下のとおりです。

STUFF_TABLE.Stuff nvarchar2(30) 
TBL.StuffId nvarchar2(30) 
TBL.StuffName nvarchar2(50) 
STUFFDEFINITION.Stuff varchar2(255) 
STUFFDEFINITION.StuffName varchar2(255) 

問題、私はそれを理解し、(VARCHAR2(255)から、すなわち型鋳造NVARCHAR2にあります50)。 CAST、Translate関数を使用しようとしましたが、役に立たなかった。 ORA-12704: character set mismatchがまだ発生します。

私はそれをやってみるとループにTBLを取り込む方法はありますか?以下は

試験データは、私はについて話すの問題を再現することである。

CREATE TABLE STUFF_TABLE 
(
    Stuff nvarchar2(30), 
    Name nvarchar2(50) 
); 

CREATE TABLE TBL 
(
    StuffId nvarchar2(30), 
    StuffName nvarchar2(50) 
); 

CREATE TABLE STUFFDEFINITION 
(
    Stuff varchar2(255), 
    StuffName varchar2(255), 
    Version number(19) 
) 

INSERT INTO STUFF_TABLE(Stuff, Name) VALUES('First', 'Name1'); 
INSERT INTO STUFF_TABLE(Stuff, Name) VALUES('Second', 'Name2'); 
INSERT INTO STUFF_TABLE(Stuff, Name) VALUES('Third', 'Name3'); 

INSERT INTO STUFFDEFINITION(Stuff, StuffName, Version) VALUES('First', 'First Stuff', 1); 
INSERT INTO STUFFDEFINITION(Stuff, StuffName, Version) VALUES('First', 'First Stuff', 2); 
INSERT INTO STUFFDEFINITION(Stuff, StuffName, Version) VALUES('Second', 'Second Stuff', 1); 
INSERT INTO STUFFDEFINITION(Stuff, StuffName, Version) VALUES('Third', 'Third Stuff', 1); 
+0

おそらくあなたは 'to_nchar'の後にいますか? – Boneist

答えて

2

をあなたはnvarchar2varchar2列に参加してにvarchar2列を挿入していることをその明らかにnvarchar2カラム。まず変換を行う必要があります。これを試してみてください:

BEGIN 
    FOR i IN (SELECT t.Stuff FROM STUFF_TABLE t ORDER BY t.Name ASC) 
    LOOP 
    INSERT INTO TBL(StuffId, StuffName) 
      VALUES(
       i.Stuff, 
        (SELECT to_nchar(TempStuffName) 
         FROM 
         (SELECT COALESCE(to_nchar(st.StuffName), i.Stuff) as TempStuffName 
         FROM STUFFDEFINITION st 
         WHERE to_nchar(st.Stuff) = i.Stuff 
         ORDER BY st.Version DESC) 
        WHERE ROWNUM = 1) 
       ); 
    END LOOP; 
END; 
+0

私はTO_NCHARを試してみました。しかし、今私は間違っていたことを理解しました - 私はst.StuffNameとst.Stuffもキャストしなければなりませんでした。それは期待どおりに動作します。私の間違いの説明に感謝します。 – Dragon

1

あなたがPL/SQLを使用する必要はありません。

INSERT INTO TBL (StuffId, StuffName) 
SELECT TO_NCHAR(t.stuff), 
     TO_NCHAR(
     COALESCE(
      MAX(d.StuffName) KEEP (DENSE_RANK LAST ORDER BY d.version), 
      t.stuff 
     ) 
     ) 
FROM StuffTable t 
     LEFT OUTER JOIN StuffDefinition d 
     ON (t.stuff = TO_NCHAR(d.stuff)) 
GROUP BY t.stuff; 
+0

この例は、実際のクエリの単純なバージョンです。また、実際のクエリで別のテーブルにエントリを作成すると、TBLにも格納されている変数に新しく作成されたエントリIDが格納されます。多分それを指摘しなければならなかったかもしれません。 – Dragon

+1

テーブルの列は異なるデータ型です。上記のものはまだエラーをスローします。 – XING

+0

@XING - コンバージョンを追加しました。 – MT0

0

Oracleはそのエラーについては、これを言う:「A INSERT文のVALUES句の文字列式に、値が挿入される列と同じ文字セットがありません。 '

NLS_DATABASE_PARAMETERSから選択し、これらの値が何であるかを教えてください: NLS_CHARACTERSET NLS_NCHAR_CHARACTERSETあなたの文から NLS_RDBMS_VERSION NLS_LENGTH_SEMANTICS

関連する問題