Oracle 16/3 PL/SQL:SQL语句被忽略,16/3 PLS-00394:FETCH语句的INTO列表中的值数目错误

Oracle 16/3 PL/SQL:SQL语句被忽略,16/3 PLS-00394:FETCH语句的INTO列表中的值数目错误,oracle,plsql,Oracle,Plsql,当我尝试执行下面的代码时,我得到了上面的错误。这是我的密码 CREATE OR REPLACE PROCEDURE proc_ref_value(orderId IN orders.order_id%TYPE) IS ref_value NUMBER; CURSOR c2 (orderId orders.order_id%TYPE) IS SELECT order_id, CASE WHEN order_status='refunded' THEN total_ord

当我尝试执行下面的代码时,我得到了上面的错误。这是我的密码

CREATE OR REPLACE PROCEDURE proc_ref_value(orderId IN orders.order_id%TYPE)
IS
ref_value   NUMBER;
CURSOR c2 (orderId orders.order_id%TYPE) IS 
SELECT order_id,
    CASE 
    WHEN   order_status='refunded' THEN total_order*0.25
    WHEN   order_status='completed' THEN  total_order* 0
    WHEN   order_status='cancelled' THEN total_order*0
    END 
    FROM orders;

BEGIN
    OPEN c2(orderId);
    LOOP
        FETCH c2 INTO ref_value;
        EXIT WHEN c2%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(ref_value);
    END LOOP;
    CLOSE c2;
END;

错误似乎很明显,但这里有一个详细说明

您的光标定义为:

SELECT order_id,
       (CASE WHEN order_status='refunded' THEN total_order*0.25 
             WHEN order_status='completed' THEN total_order* 0 
             WHEN order_status='cancelled' THEN total_order*0 
        END)
FROM orders; 
FETCH c2 INTO ref_value;
这将返回两列--
order\u id
和表达式结果

您的
FETCH
定义为:

SELECT order_id,
       (CASE WHEN order_status='refunded' THEN total_order*0.25 
             WHEN order_status='completed' THEN total_order* 0 
             WHEN order_status='cancelled' THEN total_order*0 
        END)
FROM orders; 
FETCH c2 INTO ref_value;
这将尝试将结果放在一列中

将光标定义更改为删除
order\u id
,或将
FETCH
更改为包含两个参数

然后,在运行之后,您可能会得到一个错误,因为您的光标没有参数,但您正试图传入一个参数