Reputation: 70
I need to display Customer, Bill Date, Description and Vehicle from the following tables: CUSTOMER, BILLING, DELIVERY_ITEMS, VEHICLE
I do not understand the error that I get when I try to compile the code.
Here's my code:
DECLARE
FNAME VARCHAR2(20);
SNAME VARCHAR2(20);
BILLDATE DATE;
DESCRIP VARCHAR2(50);
VEH VARCHAR2(30);
BEGIN
SELECT FIRST_NAME, SURNAME, BILL_DATE, DESCRIPTION, VEHICLE_TYPE
INTO FNAME, SNAME, BILLDATE, DESCRIP, VEH
FROM CUSTOMER, BILLING, DELIVERY_ITEMS, VEHICLE
WHERE BILL_DATE ('10/NOV/16', 'DD/MM/YY')<DATE;
DBMS_OUTPUT.PUT_LINE('CUSTOMER : '|| FNAME ||','|| SNAME);
DBMS_OUTPUT.PUT_LINE('BILL DATE: '|| BILLDATE);
DBMS_OUTPUT.PUT_LINE('DESCRIPTION: '|| DESCRIP);
DBMS_OUTPUT.PUT_LINE('VEHICLE: '|| VEH);
END;
/
I am getting the following error report:
Error report -
ORA-06550: line 12, column 51:
PL/SQL: ORA-00936: missing expression
ORA-06550: line 9, column 7:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action
Thanks in advance!
Upvotes: 0
Views: 159
Reputation: 3303
Very first question that has to be asked is are you expecting singular resultset or multi row resultset? If singular result set is expected then the WHERE condition has to be modifed as illustrated below
DECLARE
FNAME VARCHAR2(20);
SNAME VARCHAR2(20);
BILLDATE DATE;
DESCRIP VARCHAR2(50);
VEH VARCHAR2(30);
BEGIN
SELECT FIRST_NAME,
SURNAME,
BILL_DATE,
DESCRIPTION,
VEHICLE_TYPE
INTO FNAME,
SNAME,
BILLDATE,
DESCRIP,
VEH
FROM CUSTOMER,
BILLING,
DELIVERY_ITEMS,
VEHICLE
WHERE BILL_DATE = TO_DATE('10/NOV/16', 'DD/MON/YY');
DBMS_OUTPUT.PUT_LINE('CUSTOMER : '|| FNAME ||','|| SNAME);
DBMS_OUTPUT.PUT_LINE('BILL DATE: '|| BILLDATE);
DBMS_OUTPUT.PUT_LINE('DESCRIPTION: '|| DESCRIP);
DBMS_OUTPUT.PUT_LINE('VEHICLE: '|| VEH);
END;
And if you are expexcting multiple results then should always go with BULK Collect. In this case as just for illustration purpose i am using row by row processing. Hope this helps
BEGIN
FOR I IN
(SELECT FIRST_NAME,
SURNAME,
BILL_DATE,
DESCRIPTION,
VEHICLE_TYPE
FROM CUSTOMER,
BILLING,
DELIVERY_ITEMS,
VEHICLE
WHERE BILL_DATE = TO_DATE('10/NOV/16', 'DD/MON/YY')
)
LOOP
DBMS_OUTPUT.PUT_LINE('CUSTOMER : '|| I.FIRST_NAME ||','|| I.SURNAME);
DBMS_OUTPUT.PUT_LINE('BILL DATE: '|| I.BILL_DATE);
DBMS_OUTPUT.PUT_LINE('DESCRIPTION: '|| I.DESCRIPTION);
DBMS_OUTPUT.PUT_LINE('VEHICLE: '|| I.VEHICLE_TYPE);
END LOOP;
END;
Upvotes: 0
Reputation: 9335
Try for loop
if your select
statement returns more than one row
BEGIN
for i in (
SELECT FIRST_NAME, SURNAME, BILL_DATE, DESCRIPTION, VEHICLE_TYPE
FROM CUSTOMER, BILLING, DELIVERY_ITEMS, VEHICLE
WHERE TO_DATE('10/NOV/16', 'DD/MM/YY') < BILL_DATE
) loop
DBMS_OUTPUT.PUT_LINE('CUSTOMER : '|| i.FIRST_NAME ||','|| i.SURNAME);
DBMS_OUTPUT.PUT_LINE('BILL DATE: '|| i.BILL_DATE);
DBMS_OUTPUT.PUT_LINE('DESCRIPTION: '|| i.DESCRIPTION);
DBMS_OUTPUT.PUT_LINE('VEHICLE: '|| i.VEHICLE_TYPE);
end loop;
END;
/
Upvotes: 0
Reputation: 22949
You have a problem in
WHERE BILL_DATE ('10/NOV/16', 'DD/MM/YY')<DATE
Assuming that you have a date field in one of your tables (let's name it DATE_FIELD), you can apply a condition (= for example) on it with:
WHERE DATE_FIELD = TO_DATE ('10/NOV/16', 'DD/MM/YY')
or, given that you have a variable BILL_DATE
, you can do:
WHERE DATE_FIELD = BILL_DATE
Of course, before using the variable BILL_DATE
, you need an assignment, for example:
BILL_DATE := TO_DATE ('10/NOV/16', 'DD/MM/YY')
Besides, if your query returns more than one row, you have to choose:
AND ROWNUM = 1
for a testUpvotes: 1