I am trying to insert new data into a table and at the same time check if any of the data(treatments) is conflicting with each other according to a 'conflict' attribute in one of the tables. I'm not quite sure if my PL/SQL is actually fully correct, but i am currently getting an error when i try to insert new data saying "exact fetch returns more than requested number of rows". I cant quite figure out what this means exactly. My procedure:
CREATE OR REPLACE PROCEDURE FPRESC (
FP_ID VARCHAR2,
FTREAT_ID VARCHAR2,
FCLIENT_ID VARCHAR2,
FDOC_ID VARCHAR2,
FP_DATE DATE)
AS
V_CLIENT_ID PRESCRIPTION.CLIENT_ID%TYPE;
V_CONFLICT TREATMENTS.CONFLICT%TYPE;
V_P_DATE PRESCRIPTION.P_DATE%TYPE;
V_TREAT_ID TREATMENTS.TREAT_ID%TYPE;
BEGIN
SELECT P.CLIENT_ID, T.CONFLICT, P.P_DATE, T.TREAT_ID
INTO V_CLIENT_ID, V_CONFLICT, V_P_DATE, V_TREAT_ID
FROM PRESCRIPTION P, TREATMENTS T
WHERE P.TREAT_ID=T.TREAT_ID;
IF FP_DATE = V_P_DATE AND FCLIENT_ID = V_CLIENT_ID AND FTREAT_ID = V_TREAT_ID AND V_CONFLICT != NULL THEN
DBMS_OUTPUT.PUT_LINE('CONFLICT');
ELSE
INSERT INTO PRESCRIPTION (P_ID, TREAT_ID, CLIENT_ID, DOC_ID, P_DATE)
VALUES (FP_ID, FTREAT_ID, FCLIENT_ID, FDOC_ID, FP_DATE);
END IF;
END FPRESC;
/
and here is an example of the data i am inserting:
EXEC FPRESC ('P00011', 'T016', 'C00017', 'D006', '28-NOV-14');
This example inserts conflicting data, so i can test if the procedure will be able to identify the conflict.
SELECT P.CLIENT_ID, T.CONFLICT, P.P_DATE, T.TREAT_ID
INTO V_CLIENT_ID, V_CONFLICT, V_P_DATE, V_TREAT_ID
FROM PRESCRIPTION P, TREATMENTS T
WHERE P.TREAT_ID=T.TREAT_ID;
This select should fetch only one record for the logic to work, because of the INTO clause.. You're getting the error because your select is fetching more than 1 row. Fix your logic and it should work..
To follow on with @Shankar, what you have will return every row in the tables where a join exists. You need to filter the results down to a specific row. Probably something like this:
CREATE OR REPLACE PROCEDURE FPRESC (
FP_ID VARCHAR2,
FTREAT_ID VARCHAR2,
FCLIENT_ID VARCHAR2,
FDOC_ID VARCHAR2,
FP_DATE DATE)
AS
V_ROWCOUNT NUMBER;
V_CLIENT_ID PRESCRIPTION.CLIENT_ID%TYPE;
V_CONFLICT TREATMENTS.CONFLICT%TYPE;
V_P_DATE PRESCRIPTION.P_DATE%TYPE;
V_TREAT_ID TREATMENTS.TREAT_ID%TYPE;
BEGIN
SELECT COUNT(*)
INTO V_ROWCOUNT
FROM PRESCRIPTION P, TREATMENTS T
WHERE P.TREAT_ID=T.TREAT_ID
AND P.CLIENT_ID = FCLIENT_ID
AND P.P_DATE = FP_DATE
AND T.TREAT_ID = FTREAT_ID
AND V_CONFLICT != NULL;
IF (V_ROWCOUNT > 0) THEN
DBMS_OUTPUT.PUT_LINE('CONFLICT');
ELSE
INSERT INTO PRESCRIPTION (P_ID, TREAT_ID, CLIENT_ID, DOC_ID, P_DATE)
VALUES (FP_ID, FTREAT_ID, FCLIENT_ID, FDOC_ID, FP_DATE);
END IF;
END FPRESC;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.