Oracle中的存储过程给出错误PLS-00428

时间:2014-12-09 15:04:28

标签: oracle stored-procedures

我正在尝试在oracle中创建以下过程:

CREATE OR REPLACE PROCEDURE SPBILL (SPCLIENT_ID VARCHAR2) 
AS
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) AS 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;
END SPBILL;

我正在使用编译错误创建一个"过程"错误是PLS-00428,这需要一个INTO语句,但我不明白为什么以及我需要它在哪里,因为我的sql语句只是按照我想要的方式工作而没有程序。但我需要创建一个程序,以便我可以调用特定的客户端ID,并仅将其数据作为输出接收。

3 个答案:

答案 0 :(得分:3)

使用客户端(SQL Plus或SQL Developer或Toad)直接运行SQL时,会将数据返回给客户端。 当您在PL / SQL中运行相同的查询时,您需要告诉oracle如何处理该数据。通常程序将输出存储在Pl / SQL变量中以供进一步处理。

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); 

答案 1 :(得分:0)

也许您应该使用IS代替AS 创建或替换程序SPBILL(SPCLIENT_ID VARCHAR2) IS ....

答案 2 :(得分:0)

看起来你有使用MSSQL的经验,并期望Oracle会是一样的。如果是这样,那就不是真的。

看起来你试图像往常一样从MSSQL返回结果集。 Oracle根本没有隐式结果集。如果您希望这样做,您应该通过返回REF CURSOR(http://www.orafaq.com/wiki/REF_CURSOR)或通过TABLE FUNCTION(https://docs.oracle.com/cd/B19306_01/appdev.102/b14289/dcitblfns.htm)使用显式结果集eighter。

但首先,您应该考虑是否真的需要这个程序。通常,Oracle中的SELECT过程是可疑设计的一部分。