ORA-00907 Missing Right Parenthesis 缺失右括号子查询报错问题
ORA-00907错误排查及解决方法
错误根因
- 核心语法错误:Oracle调用存储函数的命名参数必须使用
参数名 => 参数值的固定格式,你在P_ORDER_LOCATION_ID参数后直接写in (SELECT DESCRIPTION FROM DEFINITIOS.DEPARTMENT)不符合参数传递规则,Oracle解析到此处无法识别合法语法结构,因此抛出缺失右括号错误。 - 潜在笔误:子查询中的表名
DEFINITIOS大概率是DEFINITIONS的拼写错误,后续调试时请注意校验。
解决方案
1. 单值参数场景(P_ORDER_LOCATION_ID仅支持传入单个值)
如果函数设计时该参数仅接受单个字符/数值,你需要将该参数的赋值逻辑改为合法的=>格式,先传入单个测试值验证其余逻辑无错:
SELECT DESCRIPTION, TOTAL_ADMISSION, EMERGENCY, NORMAL FROM TABLE (ORDERENTRY.PKG_S04REP00031.ADMISSION_SUMMARY (P_START_DATE => to_date('01/08/2021', 'dd/mm/yyyy'), P_END_DATE => to_date('01/09/2021', 'dd/mm/yyyy'), P_ADMISSION_TYPE => 'N', P_ORDER_LOCATION_ID => '替换为实际需要传入的单个部门描述值', P_LOCATION_ID => 'K01'));
2. 多值参数场景(P_ORDER_LOCATION_ID支持传入集合类型)
如果函数的该参数设计为可接收多个值的集合类型,你需要将子查询结果转为对应集合类型后再传入,不能直接写in子句,示例如下(假设集合类型为PKG_S04REP00031.STR_ARR,即包内定义的字符串数组类型):
SELECT DESCRIPTION, TOTAL_ADMISSION, EMERGENCY, NORMAL FROM TABLE (ORDERENTRY.PKG_S04REP00031.ADMISSION_SUMMARY (P_START_DATE => to_date('01/08/2021', 'dd/mm/yyyy'), P_END_DATE => to_date('01/09/2021', 'dd/mm/yyyy'), P_ADMISSION_TYPE => 'N', P_ORDER_LOCATION_ID => CAST(MULTISET(SELECT DESCRIPTION FROM DEFINITIONS.DEPARTMENT) AS ORDERENTRY.PKG_S04REP00031.STR_ARR), P_LOCATION_ID => 'K01'));
3. 函数不支持多值入参的替代方案
如果函数没有设计多值入参,你有两种选择:
- 修改存储函数内部逻辑,把
P_ORDER_LOCATION_ID的匹配逻辑改为in子查询,子查询直接写在函数体内 - 在外层通过表关联+遍历的方式,批量调用函数后合并结果集
内容的提问来源于stack exchange,提问作者xajid
相关产品推荐
相关产品推荐

