簡體   English   中英

通過存儲過程插入和檢查數據

[英]Inserting and checking data via stored procedure

我試圖將新數據插入表中,同時根據其中一個表中的“沖突”屬性檢查是否有任何數據(處理)是否相互沖突。 我不太確定我的PL / SQL是否完全正確,但是當我嘗試插入新數據時說“精確獲取返回的行數超過請求的行數”時,我目前遇到錯誤。 我無法弄清楚這到底意味着什么。 我的程序:

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

這是我要插入的數據的示例:

 EXEC FPRESC ('P00011', 'T016', 'C00017', 'D006', '28-NOV-14');

本示例插入沖突的數據,因此我可以測試該過程是否能夠識別沖突。

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;

由於INTO子句,因此該選擇應該只獲取一條記錄才能使邏輯起作用。由於出現錯誤,因為您的選擇正在獲取多於1行。 修正您的邏輯,它應該可以工作。

要繼續使用@Shankar,您將擁有的連接返回表中的每一行。 您需要將結果過濾到特定行。 大概是這樣的:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM