oracle sql процедура с ошибкой параметров входа и выхода - PullRequest
1 голос
/ 30 мая 2020

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

мой код,

Basi c база данных клиентов, таблицы бронирования и обслуживания ниже:

CREATE TABLE CUSTOMER
       (CUSTOMER_ID NUMBER(4) NOT NULL,
        CUSTOMER_NAME VARCHAR2(10),
        GENDER VARCHAR(10),
        ADDRESS VARCHAR(50),
        EMAIL VARCHAR(50),
        DISCOUNT FLOAT(10),
        PRIMARY KEY(CUSTOMER_ID)
        );

CREATE TABLE SERVICE
        (SERVICE_ID NUMBER(4) NOT NULL,
        SERVICE_NAME VARCHAR(100),
        CHARGE FLOAT(10),   
        PRIMARY KEY(SERVICE_ID)             
        );

CREATE TABLE RESERVATION
        (RESERVATION_ID NUMBER(4) NOT NULL,
        RESERVATION_DATE DATE,
        CUSTOMER_ID NUMBER(4),
        SERVICE_ID NUMBER(4),
        EMPLOYEE_ID NUMBER(4),
        PRIMARY KEY(RESERVATION_ID),
        FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER(CUSTOMER_ID),
        FOREIGN KEY (SERVICE_ID) REFERENCES SERVICE(SERVICE_ID),
        FOREIGN KEY (EMPLOYEE_ID) REFERENCES EMPLOYEE(EMPLOYEE_ID)              
        );

Мне нужно получить некоторые суммы из таблицы бронирования, таблицы услуг и таблицы клиентов. моя процедура ниже,

SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE GET_RECEIPT(
    RES_ID IN RESERVATION.RESERVATION_ID%TYPE,
    C_NAME OUT CUSTOMER.CUSTOMER_NAME%TYPE,
    S_NAME OUT SERVICE.SERVICE_NAME%TYPE,
    CHARGE_VAL OUT FLOAT(10),
    DISCOUNT_VAL OUT FLOAT(10),
    TOTAL_VAL OUT FLOAT(10)
    ) 
AS
BEGIN
    SELECT 
        c.CUSTOMER_NAME AS CUS_NAME INTO C_NAME,
        s.SERVICE_NAME AS SER_NAME INTO S_NAME,
        s.CHARGE AS CHAR_VAL INTO CHARGE_VAL,
        c.DISCOUNT INTO DISCOUNT_VAL,
        (s.CHARGE-c.DISCOUNT)AS TOTAL INTO TOTAL_VAL 
    FROM RESERVATION r LEFT OUTER JOIN CUSTOMER c ON r.CUSTOMER_ID=c.CUSTOMER_ID LEFT OUTER JOIN SERVICE s ON r.SERVICE_ID=s.SERVICE_ID 
    WHERE r.RESERVATION_ID=RES_ID;  
END;
/

Но эта процедура не может быть скомпилирована. он говорит, что компиляция не удалась. как я могу это исправить?

1 Ответ

2 голосов
/ 30 мая 2020

Исправлено, это выглядит так:

SQL> create or replace procedure get_receipt(
  2      res_id in reservation.reservation_id%type,
  3      c_name out customer.customer_name%type,
  4      s_name out service.service_name%type,
  5      charge_val out float,
  6      discount_val out float,
  7      total_val out float
  8      )
  9  as
 10  begin
 11      select c.customer_name, s.service_name, s.charge, c.discount, s.charge - c.discount
 12      into c_name, s_name, charge_val, discount_val, total_val
 13      from reservation r left outer join customer c on r.customer_id=c.customer_id
 14      left outer join service s on r.service_id=s.service_id
 15      where r.reservation_id=res_id;
 16  end;
 17  /

Procedure created.

SQL>

Что вы сделали не так?

  • параметры не имеют размера (это не float(10), а просто float)
  • в PL / SQL, select должно иметь предложение into - это то, что вы сделали, но неправильно. Должно быть как в моем примере.
...