You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AquaData创建Oracle存储过程遇ORA-00900及ORA-00905报错求助

解决Oracle存储过程返回游标时的语法错误问题

首先针对你遇到的两个错误,逐个分析解决:

1. AquaData报错"FAILED to execute EXPLAIN plan: ORA-00900: invalid SQL statement"

这是工具本身的问题,EXPLAIN PLAN仅适用于SELECT、INSERT这类DML语句,无法对CREATE PROCEDURE这类DDL语句生成执行计划。执行存储过程创建语句时,关闭AquaData自动生成执行计划的功能,直接执行CREATE语句即可。

2. 执行存储过程时报错"00905 - missing keyword"

检查代码后,有几个可能的问题点:

(1)WHERE子句条件写法错误

如果mm.fld5是数字类型,mm.fld5 = '44,53'不仅会触发隐式转换,还无法实现匹配44或53的需求,应改为:

mm.fld5 IN (44, 53)

如果mm.fld5是字符类型,且实际需求是匹配两个独立值,同样要改成:

mm.fld5 IN ('44', '53')

(2)变量与字段间的空格缺失

虽然Oracle语法允许无空格的写法,但部分工具或解析器可能对此敏感,建议添加空格:

mm.fld1 = p_id

(3)表名的大小写与权限问题

如果DB.tbl1或db2.tbl2是创建时用双引号指定了大小写的对象(比如"DB"."tbl1"),直接写DB.tbl1会导致Oracle无法识别,需要改为带双引号的格式:

FROM "DB"."tbl1" mm
INNER JOIN "db2"."tbl2" loa ON mm.fld1 = loa.fld1

同时要确保当前用户拥有这两个表的SELECT权限,否则也可能引发类似语法错误的提示。

修正后的完整存储过程代码

CREATE OR REPLACE PROCEDURE P_MyProc (
    p_id IN NUMBER,
    prc OUT SYS_REFCURSOR
)
IS
BEGIN
    OPEN prc FOR
        SELECT mm.fld1, mm.fld2, mm.fld3, mm.fld4, mm.fld5, 
               mm.fld6, mm.fld7, mm.fld8, mm.fld9, loa.fld1 
        FROM DB.tbl1 mm
        INNER JOIN db2.tbl2 loa ON mm.fld1 = loa.fld1
        WHERE mm.fld5 IN ('44', '53') AND mm.fld1 = p_id; -- 根据fld5实际类型调整IN的内容
END P_MyProc;

内容的提问来源于stack exchange,提问作者Ross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:40:00