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