Как найти ошибку столбца из-за ошибки оракула ORA-12704 - PullRequest
1 голос
/ 16 мая 2019

Я поддерживаю продукт, который использует базу данных Oracle.Один из наших запросов создает ошибку «ORA-12704: ошибка несоответствия набора символов».

Я попросил их dba посмотреть на журналы оракула, и он сказал мне, что не может определить столбец и что онВы можете найти в журналах оракула следующее:

Trace file /opt/oracle/oradata/PRESC/diag/rdbms/presc_s_v1/PRESC/trace/PRESC_ora_123128.trc
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning and Real Application Testing options
ORACLE_HOME = /opt/oracle/product/12.1.0/dbhome_1
System name:    Linux
Node name:      ******
Release:        3.10.0-514.2.2.el7.x86_64
Version:        #1 SMP Tue Dec 6 23:06:41 UTC 2016
Machine:        x86_64
Instance name: PRESC
Redo thread mounted by this instance: 1
Oracle process number: 64
Unix process pid: 123128, image: oracle@******


*** 2019-05-15 13:54:23.960
*** SESSION ID:(83.13298) 2019-05-15 13:54:23.960
*** CLIENT ID:() 2019-05-15 13:54:23.960
*** SERVICE NAME:(SYS$USERS) 2019-05-15 13:54:23.960
*** MODULE NAME:(mtxagent@****** (TNS V1-V3)) 2019-05-15 13:54:23.960
*** CLIENT DRIVER:() 2019-05-15 13:54:23.960
*** ACTION NAME:() 2019-05-15 13:54:23.960

ORA-12704(1):  dty=1 typ=0 flg=00000000 xfl=000A0000 bfl=128 bfc=64 csfm=2 csid=2000
ORA-12704(2):  dty=1 typ=3 flg=00030300 xfl=00000100 bfl=0 bfc=0 csfm=1 csid=31 styp=0

Это ошибка, которую мы получаем в наших журналах продукта:

24/04/2019 15:59:12 Vision64Database                 ERR [46975217760576] SQL Error: ORA-12704: character set mismatch
24/04/2019 15:59:12 Vision64Database                 ERR [46975217760576] Query: SELECT a.ApplicationName, a.ApplicationVersion, COUNT (a.ApplicationName) FROM Applications a INNER JOIN SoftwareInventory s ON ((s.Version IS NULL) AND (a.ApplicationVersion = '') AND (a.ApplicationName = Name)) GROUP BY a.ApplicationName, a.ApplicationVersion UNION SELECT /*+ dynamic_sampling(11) */ a.ApplicationName, a.ApplicationVersion, COUNT (a.ApplicationName) FROM Applications a INNER JOIN SoftwareInventory s ON ((s.Version IS NOT NULL) AND (a.ApplicationVersion = s.Version) AND (a.ApplicationName = CONCAT (CONCAT (Name, ' '), Version))) GROUP BY a.ApplicationName, a.ApplicationVersion

Отвечающий требованиям SQL-запрос, соответствующим образом отформатированный (не добавляет информацию!):

    SELECT a.ApplicationName
         , a.ApplicationVersion
         , COUNT (a.ApplicationName)
      FROM Applications a 
INNER JOIN SoftwareInventory s 
        ON ((s.Version IS NULL) 
       AND (a.ApplicationVersion = '')
       AND (a.ApplicationName = Name))
  GROUP BY a.ApplicationName
         , a.ApplicationVersion
     UNION
    SELECT /*+ dynamic_sampling(11) */ 
           a.ApplicationName
         , a.ApplicationVersion
         , COUNT (a.ApplicationName)
      FROM Applications a
INNER JOIN SoftwareInventory s
        ON ((s.Version IS NOT NULL)
       AND (a.ApplicationVersion = s.Version)
       AND (a.ApplicationName = CONCAT (CONCAT (Name, ' '), Version)))
  GROUP BY a.ApplicationName
         , a.ApplicationVersion
         ;

Скорее всего, я найду неверное имя столбца вручную, но это будет спешка, и я бы хотел найти способ получить его из журналов оракула в следующий раз.происходит с любым запросом.

Есть ли у кого-нибудь подсказка?

...