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

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İ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:24:51