Oracle存储过程编译报错求助:存在ORA-00907等错误
排查Oracle存储过程编译错误的解决方案
咱们一步步拆解你遇到的两个编译错误,再给出修正后的代码:
1. 解析ORA-00907: missing right paren错误
这个报错的根源是你给表和别名套了多余的括号。Oracle里定义表别名时,不需要用括号包裹表名和别名,比如你写的(SUBASTA AS s)、(PUJA AS p)都是错误写法,直接去掉外层括号就能解决这个语法问题。
2. 解析PL/SQL: SQL Statement ignored错误
这个错误是因为你在OPEN outi FOR语句里混用了INTO var1。OPEN ... FOR是用来打开游标并返回结果集的,而INTO是用来把单行查询结果赋值给变量的,这俩语法不能同时使用。既然你的输出参数是sys_refcursor,直接让游标返回查询结果就行,完全不需要额外的变量赋值操作。
修正后的存储过程
CREATE OR REPLACE procedure getPrecioMayorActual( PAR_ID_SUBASTA DECIMAL, outi out sys_refcursor ) IS BEGIN open outi for SELECT p.MONTO_OFRECIDO FROM SUBASTA s INNER JOIN PUJA p ON s.ID_PUJA_MAYOR = p.ID_PUJA WHERE s.ID_SUBASTA = PAR_ID_SUBASTA; END getPrecioMayorActual; /
额外补充
如果你的实际需求是获取单个数值而非游标,那需要把输出参数类型改成DECIMAL,再用SELECT ... INTO语法赋值,但根据当前的参数定义,用游标返回结果是更合理的选择。另外Oracle里表别名的AS关键字是可选的,写SUBASTA s和SUBASTA AS s都没问题,核心是别加多余括号。
内容的提问来源于stack exchange,提问作者looker




