Я попытался выполнить запрос и дал мне ошибку, и я не могу понять, почему? - PullRequest
0 голосов
/ 20 октября 2018
DROP FUNCTION IF EXISTS top_5(customers.customerid%TYPE, products.prod_id%TYPE, orderlines.quantity%TYPE) CASCADE;

CREATE OR REPLACE FUNCTION top_5(c_id customers.customerid%TYPE, p_id products.prod_id%TYPE, quant orderlines.quantity%TYPE)

RETURNS orders.orderid%TYPE AS $$
DECLARE

top_prod CURSOR IS 

SELECT inv.prod_id 
  FROM inventory AS inv, products AS prod 
 WHERE inv.prod_id=prod.prod_id
 ORDER BY inv.quan_in_stock desc, inv.sales
limit 5;

ord_id orders.orderid%TYPE;
ord_date orders.orderdate%TYPE:= current_date;
ordln_id orderlines.orderlineid%TYPE:=1;

BEGIN
  SELECT nova_orderid() INTO ord_id;

  INSERT INTO orders(orderid, orderdate,customerid,netamount,tax,totalamount) VALUES(ord_id,ord_date,c_id,0,0,0);

  PERFORM compra(c_id, p_id, 1::smallint, ord_id, ordln_id, ord_date);

  IF (p_id  = top_prod) THEN 
    UPDATE orders 
       SET totalamount = totalamount - (totalamount*0.2)
     WHERE ord_id = (SELECT MAX(ord_id) FROM orders);
  END IF;
END;
$$ LANGUAGE plpgsql;

У меня есть следующий код, и когда я пытаюсь выполнить это

SELECT top_5(1,1,'2');

у меня появляется эта ошибка

ОШИБКА: оператор не существует: целое число = refcursor LINE 1:SELECT (p_id = top_prod)

1 Ответ

0 голосов
/ 20 октября 2018

Вам нужно получить значение 'prod_id' из курсора 'top_prod'.Вы не можете сравнить два типа.Попробуйте это,

DECLARE
top_prod_id top_prod%ROWTYPE;

    BEGIN
    OPEN top_prod;

    LOOP
        FETCH top_prod INTO top_prod_id;
        EXIT WHEN top_prod %NOTFOUND;

        IF (p_id  = top_prod_id) THEN 
          UPDATE orders 
          SET totalamount = totalamount - (totalamount*0.2)
          WHERE ord_id = (SELECT MAX(ord_id) FROM orders);
        END IF;
    END LOOP;

    CLOSE top_prod;
END;
...