SQL ORA 935: отсутствует выражение - PullRequest
0 голосов
/ 29 апреля 2020

Я перебрал SQL в течение часа и не могу найти причину возникновения ошибки. Я проверил все основные причины, по которым эта ошибка может возникнуть, и ничего не нашел. Я с подозрением отношусь к заявлению CASE, но оно кажется правильным. Может кто-нибудь определить проблему или указать мне направление? Спасибо

INSERT INTO RPT_HOUSEHLDBATCH
         (CUSTOMERKEY,HOUSEHOLDNBR,CUSTOMERTYPE,LASTNAME,FIRSTNAME,ADDRNBR,AddressLine1,AddressLine2,AddressLine3,
         CITYNAME, STATECD, ZIPCD, SCORE, DATECREATED, RUNDATE, TYPECD, PREVIOUSHHLDNBR)
         SELECT CustomerKey,' || in_HHNbr || ', 
         CASE SUBSTR(CUSTOMERKEY,1,1)
    WHEN ''P'' THEN ''I''
    WHEN ''O'' THEN ''B''
   END CASE,
   a.LastName, 
   a.FirstName, 
   AddrNbr, 
   AddressLine1, 
   AddressLine2, 
   AddressLine3,
   Cityname, 
   StateCd,
   ZipCd, 
   2, b.AddDate, SYSDATE, ''' || in_NewUpd || ''', HouseHoldNbr
   FROM rpt_HouseHldBatchwrk a
JOIN PERS b
ON SUBSTR(a.CUSTOMERKEY,2) = b.PersNbr 
   WHERE CUSTOMERKEY = ''P' || in_PersNbr || '''
UNION 
SELECT CustomerKey,' || in_HHNbr || ', 
         CASE SUBSTR(CUSTOMERKEY,1,1)
    WHEN ''P'' THEN ''I''
    WHEN ''O'' THEN ''B''
   END CASE,
   a.LastName, 
   a.FirstName, 
   AddrNbr, 
   AddressLine1, 
   AddressLine2, 
   AddressLine3,
   Cityname, 
   StateCd,
   ZipCd, 
   2, b.AddDate, SYSDATE, ''' || in_NewUpd || ''', HouseHoldNbr
   FROM rpt_HouseHldBatchwrk a
JOIN ORG b
ON SUBSTR(a.CUSTOMERKEY,2) = b.OrgNbr 
   WHERE CUSTOMERKEY = ''O' || in_OrgNbr || '''

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Оказывается, in_HHNbr в некоторых случаях входил как ноль. Конкатенация null создает отсутствующее выражение.

Что касается структуры кода, я унаследовал этот код и не могу вносить существенные изменения. Меня отправили на исправление ошибки.

0 голосов
/ 30 апреля 2020

Хорошая стратегия для отладки такого утверждения - сократить его, как предложила @OldProgrammer.

В вашем случае я бы попытался проигнорировать INSERT и запустить SELECT первым.

Поскольку это UNION из двух SELECT с, я ' Я также разделил их на отдельные операторы.

in_NewUpd и in_PersNbr выглядят странно, как параметры в процедуре. Я бы заменил их фиксированными известными значениями, такими как WHERE CUSTOMERKEY LIKE ''P1234''

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...