2016-10-20 10 views
0

У меня возникает ошибка при попытке запустить скрипт функции. Я попытался добавить N перед строкой, но это не сработало. Возможно, я сделал это неправильно.PL/SQL: ORA-12704: несоответствие набора символов при создании функции

Я пытаюсь создать функцию ниже, но получаю ошибку при ее запуске.

create or replace FUNCTION Get_Per_Address_For_Register(PERSON_CODE_PARAM IN NUMBER, 
    ADDR_TYPE_PARAM IN NUMBER, 
    lang IN NUMBER) RETURN VARCHAR2 
    as 
    addressval VARCHAR2(1000); 
    BEGIN 
    begin 
     SELECT * INTO addressval FROM(SELECT 
     case when tai.ADDRESS_LINE_1 IS NULL 
     or tai.ADDRESS_LINE_1 = ' ' 
     then '' 
     -- Error block Start ------------ 
     else CONCAT(tai.ADDRESS_LINE_1,',') end || case when 
     tai.ADDRESS_LINE_2 = ' ' 
     or tai.ADDRESS_LINE_2 = ' ' 
     then '' 
     else CONCAT(tai.ADDRESS_LINE_2,',') end || case when 
     tai.ADDRESS_LINE_3 IS NULL 
     or tai.ADDRESS_LINE_3 = ' ' 
     then '' 
     else CONCAT(tai.ADDRESS_LINE_3,',') end || case when tai.VILLAGE 
     IS NULL or tai.VILLAGE = ' ' 
     then '' 
     else CONCAT(tai.VILLAGE,',') end || case when mps.ps IS NULL 
     or mps.ps = ' ' 
     then '' 
     else CONCAT(mps.ps,',') end || case when md.district IS NULL 
     or md.district = ' ' 
     then '' 
     else CONCAT(md.district,',') end || case when ms.state IS NULL 
     or ms.state = ' ' 
     then '' 
     else CONCAT(ms.state,',') end || case when mn.nationality IS NULL 
     or mn.nationality = ' ' 
     then '' 
     else CONCAT(mn.nationality,',') end || case when tai.pincode IS 
     NULL or tai.pincode = '0' 
     then '' 
     -- Error Block End--------------- 
     else ',' || tai.pincode || '.' end FROM 
     t_person_address tai 
     LEFT JOIN m_nationality mn 
     ON mn.NATIONALITY_CD = tai.COUNTRY_CD 
     and mn.LANG_CD = tai.LANG_CD 
     LEFT JOIN m_state ms 
     ON ms.STATE_CD = tai.STATE_CD 
     and ms.LANG_CD = tai.LANG_CD 
     LEFT JOIN m_district md 
     ON md.DISTRICT_CD = tai.DISTRICT_CD 
     and md.LANG_CD = tai.LANG_CD 
     LEFT JOIN m_police_station mps 
     ON mps.PS_CD = tai.PS_CD 
     and mps.LANG_CD = tai.LANG_CD WHERE tai.lang_cd = lang 
     and tai.PERSON_CODE = PERSON_CODE_PARAM 
     and tai.ADDR_TYPE = ADDR_TYPE_PARAM ORDER BY tai.ADDRESS_CD 
     DESC) WHERE ROWNUM <= 1; 

     EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
     NULL; 
    end; 
    RETURN addressval; 
END; 

При попытке запуска получить, я получаю следующее сообщение об ошибке:

PL/SQL: ORA-12704: character set mismatch

+1

Каковы типы данных всех этих компонентов? –

ответ

0

его внешний вид, как вопрос с п NVARCHAR2. Не могли бы вы заменить

CONCAT(tai.ADDRESS_LINE_1,'N'',') 

в

CONCAT(tai.ADDRESS_LINE_1,n'N'',') 

и другие.

+0

Я пробовал ваше решение, но все же оно не работает, такая же ошибка снова –

0

Предполагаю, что , должен быть указан как NVARCHAR2. Вы можете сделать ваше подробное выражение CASE THEN ELSE более удобным для чтения:

NVL2(NULLIF(tai.ADDRESS_LINE_1, ' '), tai.ADDRESS_LINE_1||n',', NULL) 
||NVL2(NULLIF(tai.ADDRESS_LINE_2, ' '), tai.ADDRESS_LINE_2||n',', NULL) 
||NVL2(NULLIF(tai.ADDRESS_LINE_3, ' '), tai.ADDRESS_LINE_3||n',', NULL) 
... 
||NVL2(NULLIF(tai.pincode, ' '), tai.pincode||n'.', NULL) 
+0

это не помогло мне, пожалуйста, объясните это правильно –

Смежные вопросы