Khi bạn đang chạy SQL trực tiếp bằng máy khách (SQL Plus hoặc SQL Developer hoặc Toad), dữ liệu được trả lại cho máy khách. Khi bạn chạy cùng một truy vấn bên trong PL / SQL, bạn cần cho oracle biết phải làm gì với dữ liệu đó. Thông thường các chương trình lưu trữ kết quả đầu ra trong các biến Pl / SQL để xử lý thêm.
https://docs.oracle.com/cd/B19306_01 /appdev.102/b14261/selectinto_statement.htm
Vì vậy, trong trường hợp của bạn, bạn có thể cần một cái gì đó dọc theo những dòng này ..
CREATE OR REPLACE PROCEDURE SPBILL (SPCLIENT_ID VARCHAR2)
AS
l_client_name clients.client_name%type;
l_room_id rooms.room_id%type;
...
l_invoice number(5,2);
BEGIN
SELECT C.CLIENT_NAME, B.ROOM_ID, R.ROOM_COST, T.TREAT_NAME, T.TREAT_COST, (ROOM_COST*(B_END_DATE-B_START_DATE)+TREAT_COST)
into l_client_name, l_room_id...l_invoice
FROM CLIENTS C, ROOMS R, TREATMENTS T, BOOKING B, PRESCRIPTION P
WHERE C.CLIENT_ID=B.CLIENT_ID
AND R.ROOM_ID=B.ROOM_ID
AND B.CLIENT_ID=P.CLIENT_ID
AND P.TREAT_ID=T.TREAT_ID
AND C.CLIENT_ID=SPCLIENT_ID;
--further processing here based on variables above.
dbms_output.put_line(l_invoice);
END SPBILL;
Khi bạn biên dịch mà không có lỗi, bạn có thể chạy quy trình ..
set serveroutput on;
SPBILL(100);