ORA-00920无效关系运算符错误排查求助
ORA-00920无效关系运算符错误排查
ORA-00920错误的核心是SQL中使用了无效的关系运算符,除了括号匹配问题,你这段SQL里有几个明确的问题点:
EXTRACT函数与LIKE运算符不兼容:EXTRACT(YEAR FROM DELIVERY_DATE)和EXTRACT(MONTH FROM DELIVERY_DATE)返回的是数值类型,而LIKE是专门用于字符串匹配的运算符,数值与字符串直接用LIKE会触发无效关系运算符的错误。
解决办法有两种:
- 如果年份/月份参数是确定值,改用等于判断,同时保留NVL的默认逻辑:
AND EXTRACT(YEAR FROM DELIVERY_DATE) = NVL('$YEAR$', EXTRACT(YEAR FROM DELIVERY_DATE)) AND EXTRACT(MONTH FROM DELIVERY_DATE) = NVL('$MONTH$', EXTRACT(MONTH FROM DELIVERY_DATE)) - 如果需要支持模糊匹配(比如年份传'202%'),先把日期转成字符串再用LIKE:
AND TO_CHAR(DELIVERY_DATE, 'YYYY') LIKE NVL('$YEAR$', '%') AND TO_CHAR(DELIVERY_DATE, 'MM') LIKE NVL('$MONTH$', '%')
- 如果年份/月份参数是确定值,改用等于判断,同时保留NVL的默认逻辑:
绑定变量替换验证:检查
SYSDATE-$DAYS$中的$DAYS$是否被正确替换为数值,如果替换后是非数值内容,会导致语法错误;另外所有$XXX$形式的绑定变量,替换后要确保格式合法,比如字符串参数是否带引号。API调用语法检查:确认
&AO.COMPANY_SITE_API.GET_COMPANY(CONTRACT)这类API调用的拼写和参数传递是否符合Oracle的规范,比如函数名是否正确、参数类型是否匹配。
附上你提供的原SQL代码(格式化后):
(SOURCE_REF1, SOURCE_REF2, SOURCE_REF3, RECEIPT_NO) IN ( SELECT ORDER_NO, LINE_NO, RELEASE_NO, RECEIPT_NO FROM &AO.PURCHASE_RECEIPT_STATISTICS WHERE order_line_objstate IN ('Arrived', 'Received', 'Closed') AND qty_arrived > 0 AND rental_db = 'FALSE' AND NVL(&AO.COMPANY_SITE_API.GET_COMPANY(CONTRACT),'%') LIKE NVL('$COMPANY$','%') AND NVL(CONTRACT,'%') LIKE NVL('$SITE$','%') AND NVL(VENDOR_NO,'%') LIKE NVL('$SUPPLIER_ID$','%') AND NVL(&AO.PURCHASE_ORDER_API.GET_BUYER_CODE(ORDER_NO),'%') LIKE NVL('$PERSON_BUYER$','%') AND REAL_ARRIVAL_DATE >= SYSDATE-$DAYS$ ) AND &AO.Purchase_Stat_Util_API.Get_Max_Days_Late (SOURCE_REF1, SOURCE_REF2, SOURCE_REF3, RECEIPT_NO) = 0 AND &AO.Purchase_Stat_Util_API.Get_Max_Days_Early (SOURCE_REF1, SOURCE_REF2, SOURCE_REF3, RECEIPT_NO) = 0 AND EXTRACT(YEAR FROM DELIVERY_DATE) LIKE NVL('$YEAR$','%') AND EXTRACT(MONTH FROM DELIVERY_DATE) LIKE NVL('$MONTH$','%')
内容的提问来源于stack exchange,提问作者Tompa
相关产品推荐
相关产品推荐

