Каждый раз, когда я запускаю оператор объявления, он говорит, что встретил символ конца файла - PullRequest
0 голосов
/ 11 июля 2020
SET SERVEROUTPUT ON;

--VARIABLE DECLARATION
DECLARE
c_name VARCHAR(30); (Here it gives the end to file error)
p_purchaed VARCHAR2(30);
BEGIN
CURSOR( c_CustProd IS SELECT (C.cust_fName ||',' || C.cust_lName) AS "CUSTOMER", P.product_name (and then the select statement it says it was expecting a not null statment)
FROM Billing B
JOIN Product_Billing PB ON B.bill_ID = PB.bill_ID,
JOIN Customer C on B.cust_ID = C.cust_ID,
JOIN Product P on PB.product_ID = P.product_ID,
WHERE P.product_price > 10000
ORDER BY P.product_name DESC, P.product_price DESC);



OPEN c_CustProd;
LOOP
FETCH c_CustProd into c_name, p_purchaed

DBMS_OUTPUT.PUT_LINE('CUSTOMER:    '||c_name);
DBMS_OUTPUT.PUT_LINE('PRODUCT:     '||p_purchaed );
DBMS_OUTPUT.PUT_LINE('-------------------------------');
\
END LOOP
CLOSE c_CustProd;
END;

Я еще новичок в oracle. но мне нужно просто отображать имя клиентов и то, что они купили. Я вставил все переменные ранее в код, и все работает, но этот оператор, и я не знаю, где все ошибки

Ответы [ 2 ]

4 голосов
/ 11 июля 2020

Довольно много ошибок, я постараюсь упомянуть их все:

  • используйте varchar2, а не varchar
  • курсор должен быть объявлен внутри declare раздел, а не после begin
  • убрать лишние скобки с курсора
  • не использовать двойные кавычки при именовании чего-либо в Oracle (не ошибка, но ... тоже не польза. Скорее боль , позже)
  • вы никогда не выходили из l oop
  • что это за бэксла sh \ в вашем коде?
  • операторы должны заканчиваться точкой с запятой ;

Сравните этот код с вашим.

SQL> DECLARE
  2    c_name VARCHAR2(30);
  3    p_purchaed VARCHAR2(30);
  4
  5    CURSOR c_CustProd IS
  6      SELECT C.cust_fName ||',' || C.cust_lName AS CUSTOMER,
  7             P.product_name
  8      FROM Billing B
  9      JOIN Product_Billing PB ON B.bill_ID = PB.bill_ID
 10      JOIN Customer C on B.cust_ID = C.cust_ID
 11      JOIN Product P on PB.product_ID = P.product_ID
 12      WHERE P.product_price > 10000
 13      ORDER BY P.product_name DESC, P.product_price DESC;
 14  BEGIN
 15    OPEN c_CustProd;
 16    LOOP
 17      FETCH c_CustProd into c_name, p_purchaed;
 18      EXIT when c_custprod%notfound;
 19
 20      DBMS_OUTPUT.PUT_LINE('CUSTOMER:    '||c_name);
 21      DBMS_OUTPUT.PUT_LINE('PRODUCT:     '||p_purchaed );
 22      DBMS_OUTPUT.PUT_LINE('-------------------------------');
 23    END LOOP;
 24    CLOSE c_CustProd;
 25  END;
 26  /

PL/SQL procedure successfully completed.

SQL>
0 голосов
/ 12 июля 2020

В большинстве случаев вам не нужен явно названный курсор или переменные, предпочтительнее использовать более компактный синтаксис:

begin
    for r in (
        select c.cust_fname || ',' || c.cust_lname as customer_name
             , p.product_name as product_purchased
        from   billing b
               join product_billing pb on pb.bill_id = b.bill_id
               join customer c on c.cust_id = b.cust_id
               join product p on p.product_id = pb.product_id
        where  p.product_price > 10000
        order  by p.product_name  desc, p.product_price desc
    )
    loop
        dbms_output.put_line('CUSTOMER:    ' || r.customer_name);
        dbms_output.put_line('PRODUCT:     ' || r.product_purchased);
        dbms_output.put_line('--------------------------------');
    end loop;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...