当您使用客户端(SQL Plus 或 SQL Developer 或 Toad)直接运行 SQL 时,数据将返回到客户端。
当您在 PL/SQL 中运行相同的查询时,您需要告诉 Oracle 如何处理该数据。通常程序将输出存储在 Pl/SQL 变量中以供进一步处理。
https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/selectinto_statement.htm https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/selectinto_statement.htm
所以,就你而言,你可能需要一些类似的东西......
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;
一旦编译没有错误,就可以运行该程序了。
set serveroutput on;
SPBILL(100);