ORACLE APEX PL SQL 过程错误

Posted

技术标签:

【中文标题】ORACLE APEX PL SQL 过程错误【英文标题】:ORACLE APEX PL SQL Procedure Error 【发布时间】:2015-05-26 13:06:42 【问题描述】:

我不断收到错误:编译错误成功。我的代码做错了什么?我在 sqlfiddle 中尝试过,但我得到一个无效的 SQL 语句错误。据我所知,这是 PL/SQL 的正确语法

create or replace PROCEDURE PRC_CALC
    (W_ORDERID_IN IN NUMBER)
    AS
    W_PARTSERVICEID VARCHAR2(10);
    W_EXIST_FLAG NUMBER(1) :=0;
    W_SUBTOTAL NUMBER(9) :=0;
    W_TAX NUMBER(9) :=0.07;
    W_DISCOUNT NUMBER(9) :=0;
    W_TOTAL NUMBER(9) :=0;

    BEGIN

        SELECT COUNT(*)
        INTO W_EXIST_FLAG
        FROM tblJobOrders
        WHERE fldOrderId = W_ORDERID_IN;

        IF W_EXIST_FLAG = 1 THEN

            CURSOR CUR_ORDERCHARGES IS
            SELECT fldPartServiceId
            FROM tblOrderCharges
            WHERE fldOrderId = W_ORDERID_IN;

            OPEN CUR_ORDERCHARGES;
            LOOP
                FETCH CUR_ORDERCHARGES
                INTO W_PARTSERVICEID
                EXIT WHEN CUR_ORDERCHARGES%NOTFOUND;

                SELECT fldPartServiceAmount, fldDiscountPercent
                INTO W_SUBTOTAL, W_DISCOUNT
                FROM tblPartsServices
                WHERE fldPartServiceId = W_PARTSERVICEID;

                W_DISCOUNT := (W_SUBTOTAL*(W_DISCOUNT*.01));
                W_TAX := (W_TOTAL*W_TAX);

                W_TOTAL := W_SUBTOTAL - W_DISCOUNT;
                W_TOTAL := W_TOTAL + W_TAX;

                htp.prn('Your subtotal is: $' ||W_SUBTOTAL||'<br>');
                htp.prn('Your Discount is: $' ||W_DISCOUNT||'<br>');
                htp.prn('Your Tax is: $' ||W_TAX||'<br>');
                htp.prn('Your Total is: $' ||W_TOTAL||'<br>');

            END LOOP;
            CLOSE CUR_ORDERCHARGES;

        ELSE
            htp.prn('The Order Id: '||W_ORDERID_IN||' does not exist in the database');

        END IF;

    END;

【问题讨论】:

您可以在 SQLPlus 中编译您的过程后使用SHOW ERR 以获取有关错误的更多信息。 【参考方案1】:

你的变量声明需要工作

W_PARTSERVICEID VARCHAR2;应该有一个大小,例如 W_PARTSERVICEID VARCHAR2(250);

你的数字声明会起作用,但最好也指定一个大小

W_EXIST_FLAG NUMBER;应该是 W_EXIST_FLAG NUMBER(9);

W_EXIST_ORDER_FLAG 未声明,也应该声明。

作为超出您的问题的编程实践,您应该检查进入过程和光标中的值是否不为空或零。

CURSOR CUR_ORDERCHARGES 应与其他声明一起声明或放入新的 DECLARE BEGIN END 块中

你在you FETCH the cursor时少了一个分号,应该是

FETCH CUR_ORDERCHARGES
        INTO W_PARTSERVICEID;
 EXIT WHEN CUR_ORDERCHARGES%NOTFOUND;

【讨论】:

根据您指定的更改,我仍然收到相同的错误ORA-24344: success with compilation error 【参考方案2】:

第一个查询中使用的 W_EXIST_ORDER_FLAG 未定义。也许,你的意思是 W_EXIST_FLAG?

【讨论】:

以上是关于ORACLE APEX PL SQL 过程错误的主要内容,如果未能解决你的问题,请参考以下文章

Oracle APEX - 处理 APEX 内部错误

Oracle APEX PL/SQL 错误

PL/SQL 中的问题 = 错误堆栈:ORA-01403:Oracle Application Express (APEX) 中没有数据

从 apex 页面进程调用 pl/sql 函数

调用程序 Oracle apex

在 Oracle APEX PL/SQL 中传递变量