SQL ORA 935:缺少表达式

SQL ORA 935:缺少表达式,sql,oracle,Sql,Oracle,我已经检查了SQL一个小时,找不到引发错误的原因。我已经检查了发生此错误的所有基本原因,但没有发现任何问题。我对案件陈述表示怀疑,但它似乎是正确的。有人能发现问题或给我指个方向吗?谢谢 INSERT INTO RPT_HOUSEHLDBATCH (CUSTOMERKEY,HOUSEHOLDNBR,CUSTOMERTYPE,LASTNAME,FIRSTNAME,ADDRNBR,AddressLine1,AddressLine2,AddressLine3, CIT

我已经检查了SQL一个小时,找不到引发错误的原因。我已经检查了发生此错误的所有基本原因,但没有发现任何问题。我对案件陈述表示怀疑,但它似乎是正确的。有人能发现问题或给我指个方向吗?谢谢

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 || '''

调试这样一个语句的一个好策略是缩减它,正如@OldProgrammer所建议的那样

在您的情况下,我会尝试忽略
INSERT
,并首先运行
SELECT

由于这是一个由两个
SELECT
s组成的
UNION
,我也将它们拆分为单独的语句

_NewUpd中的
和_PersNbr中的
看起来很奇怪,就像过程中的参数一样。我会用固定的已知值替换它们,比如
WHERE CUSTOMERKEY,比如“P1234”


请不要将SQL存储在变量中,并根据条件执行它。其语法是在SQL中使用类似于
的占位符,而不是字符串串联
|
。如果你做得不对,你将淹没游标缓存。

在某些情况下,in_HHNbr是以空值的形式输入的。串联null将抛出缺少的表达式


至于代码的结构,我继承了这段代码,无法进行重大更改。我被派去修复bug。

下面是解决这个问题的方法-将查询还原为基本内容,然后开始添加部分,直到得到错误,然后您就会知道错误在哪里。这不是为了检查语法。为什么你有这样的“P”(前后两个引号)这个sql存储在一个变量中,并根据一个条件执行。所以整个东西都存在于“”中,这就是引号被转义的原因。每次使用引号或它们的组合都是不正确的。我建议您首先让查询独立运行,然后使用,这样就不必使用双引号将其分配给变量。我很好奇您使用了什么调试方法,因为您“检查了SQL一个小时,找不到引发错误的原因”。我可以在几秒钟内清楚地看到这些额外的引文。嗯,我不认为把查询字符串更改为一个大的变化,因为你必须改正它。我强烈建议使用占位符,如stmt:=“INSERT INTO t SELECT CustomerKey,:in_hhnbr,CASE…”在_hhnbr中执行即时stmt USING;此外,您花一个小时检查SQL语句,没有发现空值,这证明了为什么不应该连接SQL语句。我去过太多次了。。。