Oracle存储过程创建报错求助:首次编写存储过程遇问题
Oracle存储过程创建错误排查
以下是针对你提供的存储过程代码的错误分析及修正方案:
核心错误点
- 参数定义错误:你需要创建带1个参数的存储过程,但原代码用
IS开头未定义参数,且错误地写了BELGE TYPE;(未指定具体数据类型,且参数应在过程名后的括号内定义)。 - SELECT语句位置错误:裸写的SELECT语句不能放在声明部分,必须置于
BEGIN...END执行块内,且需要通过INTO子句将查询结果存入变量。 - 缺少变量声明:查询返回多个字段,需提前声明对应变量或自定义记录类型来接收结果。
- 逻辑矛盾:原代码在
BEGIN中给BELGE赋值为0,但如果它是参数,应该由调用方传入,而非在过程内赋值。 - 语法疏漏:SELECT语句末尾、GROUP BY语句末尾缺少分号,导致语法不完整。
修正后的示例代码
假设BELGE为VARCHAR2类型(可根据实际表中BELGENO字段类型调整),同时声明变量接收查询结果,修正后的代码如下:
CREATE OR REPLACE PROCEDURE OZET (BELGE IN VARCHAR2) -- 定义输入参数 IS -- 声明变量接收查询结果,字段类型需与查询返回类型匹配 V_HAT E_HDFTKP_FORM_TABLO1.HAT%TYPE; V_OEE NUMBER; V_AR NUMBER; V_PR NUMBER; V_QR NUMBER; V_ADET NUMBER; V_D1 NUMBER; V_D2 NUMBER; V_D3 NUMBER; V_D4 NUMBER; V_D5 NUMBER; V_D6 NUMBER; V_D7 NUMBER; V_D8 NUMBER; V_D9 NUMBER; V_D10 NUMBER; V_HATATOPLAM NUMBER; V_H1 NUMBER; V_H2 NUMBER; V_H3 NUMBER; V_H4 NUMBER; V_H5 NUMBER; V_H6 NUMBER; V_H7 NUMBER; V_H8 NUMBER; V_H9 NUMBER; V_H10 NUMBER; BEGIN -- 将查询结果存入声明的变量中 SELECT F.HAT, (ROUND((ROUND((((1440 - SUM(F.PLNSZ)) - SUM(F.PLNLI)) / (1440 - SUM(F.PLNLI))), 2)) * (ROUND(SUM(F.FIILI) / (1440 - (SUM(F.PLNLI) + SUM(F.PLNSZ))), 2)) * (ROUND(((1 - (SUM(F.H1) + SUM(F.H2) + SUM(F.H3) + SUM(F.H4) + SUM(F.H5) + SUM(F.H6) + SUM(F.H7) + SUM(F.H8) + SUM(F.H9) + SUM(F.H10))) / SUM(F.TOPLAM)), 2)), 2)) OEE, (ROUND((((1440 - SUM(F.PLNSZ)) - SUM(F.PLNLI)) / (1440 - SUM(F.PLNLI))), 2)) AR, (ROUND(SUM(F.FIILI) / (1440 - (SUM(F.PLNLI) + SUM(F.PLNSZ))), 2)) PR, (ROUND(((1 - (SUM(F.H1) + SUM(F.H2) + SUM(F.H3) + SUM(F.H4) + SUM(F.H5) + SUM(F.H6) + SUM(F.H7) + SUM(F.H8) + SUM(F.H9) + SUM(F.H10))) / SUM(F.TOPLAM)), 2)) QR, SUM(F.TOPLAM) ADET, SUM(F.D1) D1, SUM(F.D2) D2, SUM(F.D3) D3, SUM(F.D4) D4, SUM(F.D5) D5, SUM(F.D6) D6, SUM(F.D7) D7, SUM(F.D8) D8, SUM(F.D9) D9, SUM(F.D10) D10, ((ROUND(((SUM(F.H1) * 100) / SUM(F.TOPLAM)), 2)) + (ROUND(((SUM(F.H2) * 100) / SUM(F.TOPLAM)), 2)) + (ROUND(((SUM(F.H3) * 100) / SUM(F.TOPLAM)), 2)) + (ROUND(((SUM(F.H4) * 100) / SUM(F.TOPLAM)), 2)) + (ROUND(((SUM(F.H5) * 100) / SUM(F.TOPLAM)), 2)) + (ROUND(((SUM(F.H6) * 100) / SUM(F.TOPLAM)), 2)) + (ROUND(((SUM(F.H7) * 100) / SUM(F.TOPLAM)), 2)) + (ROUND(((SUM(F.H8) * 100) / SUM(F.TOPLAM)), 2)) + (ROUND(((SUM(F.H9) * 100) / SUM(F.TOPLAM)), 2)) + (ROUND(((SUM(F.H10) * 100) / SUM(F.TOPLAM)), 2))) HATATOPLAM, (ROUND(((SUM(F.H1) * 100) / SUM(F.TOPLAM)), 2)) H1, (ROUND(((SUM(F.H2) * 100) / SUM(F.TOPLAM)), 2)) H2, (ROUND(((SUM(F.H3) * 100) / SUM(F.TOPLAM)), 2)) H3, (ROUND(((SUM(F.H4) * 100) / SUM(F.TOPLAM)), 2)) H4, (ROUND(((SUM(F.H5) * 100) / SUM(F.TOPLAM)), 2)) H5, (ROUND(((SUM(F.H6) * 100) / SUM(F.TOPLAM)), 2)) H6, (ROUND(((SUM(F.H7) * 100) / SUM(F.TOPLAM)), 2)) H7, (ROUND(((SUM(F.H8) * 100) / SUM(F.TOPLAM)), 2)) H8, (ROUND(((SUM(F.H9) * 100) / SUM(F.TOPLAM)), 2)) H9, (ROUND(((SUM(F.H10) * 100) / SUM(F.TOPLAM)), 2)) H10 INTO V_HAT, V_OEE, V_AR, V_PR, V_QR, V_ADET, V_D1, V_D2, V_D3, V_D4, V_D5, V_D6, V_D7, V_D8, V_D9, V_D10, V_HATATOPLAM, V_H1, V_H2, V_H3, V_H4, V_H5, V_H6, V_H7, V_H8, V_H9, V_H10 FROM E_HDFTKP_FORM_TABLO1 F INNER JOIN E_HDFTKP_FORM S ON F.FORMID = S.ID INNER JOIN FLOWDOCUMENTS FD ON S.ID = FD.FILEPROFILEID INNER JOIN LIVEFLOWS LF ON FD.PROCESSID = LF.ID INNER JOIN FLOWSTATUSES FL ON LF.FLOWVERSION = FL.VERSION AND FL.STATUS = LF.STATUS AND FL.PROCESS = LF.PROCESS WHERE F.HAT = 'M26' AND BELGENO = BELGE GROUP BY F.HAT; -- 此处可添加逻辑,比如输出变量值或处理结果 DBMS_OUTPUT.PUT_LINE('OEE值:' || V_OEE); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('未找到匹配数据'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('错误代码:' || SQLCODE || ',错误信息:' || SQLERRM); RAISE; END OZET; /
额外说明
- 若查询可能返回多行结果,需改用游标(
CURSOR)遍历,避免TOO_MANY_ROWS错误。 - 变量数据类型需与表字段类型严格匹配,可使用
%TYPE引用表字段类型,提升代码兼容性。 - 可根据实际需求调整参数的
IN/OUT/IN OUT属性,示例中使用IN表示输入参数。
内容的提问来源于stack exchange,提问作者Anıl ÇELEBİ
相关产品推荐
相关产品推荐

