เพิ่ม IF ELSE statment

Sep 04 2020

ฉันมีฟังก์ชันใน PHP บางอย่างเช่น

if (  $busyUsersIDS ) {
 SELECT statment 
ELSE {
SELECT statment
 }

จนถึงตอนนี้ฉันแปลสิ่งนี้เป็นฟังก์ชั่นใน Oracle SQL และปัญหาหลักตอนนี้คือการเพิ่มIF ELSEซึ่งสำหรับฉันเหมือนมือใหม่ค่อนข้างยากสิ่งที่ฉันพยายามฉันมักจะได้รับข้อผิดพลาด

FUNCTION GET_MOMENT_PROJECT_USERS(p_busyUsersID IN INT)
   RETURN SYS_REFCURSOR IS 
    rc  SYS_REFCURSOR;
    /*getBusyUsersIDS*/
 BEGIN
  OPEN rc FOR
    CASE bussyUserID WHEN bussyUserID THEN
        SELECT u.*,
                ur.Roles 
        FROM 
                users u 
        INNER JOIN 
                user_roles ur 
        ON 
                u.User_roleID = ur.id 
        WHERE 
                u.UserID NOT IN (p_busyUsersID) 
        AND 
                u.Surname IS NOT NULL
        AND 
                u.Lastname IS NOT NULL 
        ORDER BY
                u.ProjectPlanSortIndex;

        ELSE  
                            
        SELECT  u.*, 
                ur.Roles 
        FROM 
                users u 
        INNER JOIN 
                user_roles ur 
        ON 
                u.User_roleID = ur.id 
        WHERE 
                u.Surname IS NOT NULL 
        AND 
                u.Lastname IS NOT NULL 
        ORDER BY 
                u.ProjectPlanSortIndex;
     END;
  RETURN rc;
END GET_BUSY_USERS_IDS;

จนถึงตอนนี้มีข้อผิดพลาดสองข้อที่ฉันได้รับ

ข้อผิดพลาด (524,9): PLS-00103: พบสัญลักษณ์ "SELECT" เมื่อคาดหวังอย่างใดอย่างหนึ่งต่อไปนี้: (- + case mod new not null ต่อการนับค่าเฉลี่ยปัจจุบันมีอยู่สูงสุดนาทีก่อนหน้าผลรวมผลรวม sql stddev เรียกใช้ช่วงเวลาการรวมเวลาการผสาน ไปป์วันที่ <an alternat

ข้อผิดพลาด (528,3): PLS-00103: พบสัญลักษณ์ "INNER" เมื่อคาดหวังอย่างใดอย่างหนึ่งต่อไปนี้:; สำหรับกลุ่มที่มีการตัดกันลบคำสั่งเริ่มต้นสหภาพที่เชื่อมต่อ

ใครช่วยบอกทีว่าฉันทำผิดพลาดตรงไหนและมีอะไรผิดปกติ?

คำตอบ

WilliamRobertson Sep 04 2020 at 13:28

เกี่ยวกับวิธีรับมือกับปัญหาไวยากรณ์ประเภทนี้ในฐานะผู้เริ่มต้นฉันขอแนะนำให้คุณฝึกฝนการทำให้ง่ายขึ้นเป็นตัวอย่างที่เล็กที่สุดเท่าที่จะเป็นไปได้เพื่อที่คุณจะไม่ถูกรบกวนจากตรรกะการเข้าร่วม

ตัวอย่างเช่นคุณสามารถทดสอบได้อย่างรวดเร็วและพบว่ามันใช้ไม่ได้ :

declare
    rc sys_refcursor;
begin
    open rc for
        case
            when 1 = 1 then select * from dual  -- not valid
        end;
end;

ซึ่งล้มเหลวด้วย

ORA-06550: line 6, column 29:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following: ...

เนื่องจากopen rc for selectไวยากรณ์ต้องเป็นคำสั่งเดียวและไม่สามารถแยกออกด้วยตรรกะเงื่อนไข

สังเกตว่าไม่มีcreate functionพารามิเตอร์หรือการรวม ฯลฯ เพื่อทำให้สิ่งต่างๆซับซ้อน คุณสามารถเพิ่มสิ่งเหล่านั้นกลับเข้าไปได้เมื่อคุณปรับไวยากรณ์ให้ตรงแล้ว caseไวยากรณ์คำสั่งที่นี่ (สังเกตว่ามีสองประเภทที่แตกต่างกันcase) จำเป็นต้องเป็นอย่างใดอย่างหนึ่ง

declare
    rc sys_refcursor;
begin
    case
        when 1 = 1 then
            open rc for select * from dual;
    end case;
end;

หรือเทียบเท่าโดยใช้if:

declare
    rc sys_refcursor;
begin
    if 1 = 1 then
        open rc for select * from dual;
    end if;
end;
TonyAndrews Sep 04 2020 at 08:05

นั่นไม่ใช่ไวยากรณ์ที่ถูกต้อง คุณสามารถทำได้ (ตามที่ Florin Ghita แนะนำในความคิดเห็น):

FUNCTION GET_MOMENT_PROJECT_USERS(p_busyUsersID IN INT)
   RETURN SYS_REFCURSOR IS 
    rc  SYS_REFCURSOR;
    /*getBusyUsersIDS*/
 BEGIN
  CASE bussyUserID WHEN bussyUserID THEN
    OPEN rc FOR
        SELECT u.*,
                ur.Roles 
        FROM 
                users u 
        INNER JOIN 
                user_roles ur 
        ON 
                u.User_roleID = ur.id 
        WHERE 
                u.UserID NOT IN (p_busyUsersID) 
        AND 
                u.Surname IS NOT NULL
        AND 
                u.Lastname IS NOT NULL 
        ORDER BY
                u.ProjectPlanSortIndex;

  ELSE  
     OPEN rc FOR
        SELECT  u.*, 
                ur.Roles 
        FROM 
                users u 
        INNER JOIN 
                user_roles ur 
        ON 
                u.User_roleID = ur.id 
        WHERE 
                u.Surname IS NOT NULL 
        AND 
                u.Lastname IS NOT NULL 
        ORDER BY 
                u.ProjectPlanSortIndex;
  END CASE;
  RETURN rc;
END GET_BUSY_USERS_IDS;

หรือคุณสามารถย้ายเงื่อนไขไปที่ WHERE clause ของแบบสอบถามเดียวเช่น:

FUNCTION GET_MOMENT_PROJECT_USERS(p_busyUsersID IN INT)
   RETURN SYS_REFCURSOR IS 
    rc  SYS_REFCURSOR;
    /*getBusyUsersIDS*/
 BEGIN
  CASE bussyUserID WHEN bussyUserID THEN
    OPEN rc FOR
        SELECT u.*,
                ur.Roles 
        FROM 
                users u 
        INNER JOIN 
                user_roles ur 
        ON 
                u.User_roleID = ur.id 
        WHERE 
                (bussyUserID != bussyUserID
                 OR u.UserID NOT IN (p_busyUsersID))
        AND 
                u.Surname IS NOT NULL
        AND 
                u.Lastname IS NOT NULL 
        ORDER BY
                u.ProjectPlanSortIndex;

  END CASE;
  RETURN rc;
END GET_BUSY_USERS_IDS;

อย่างไรก็ตามหากด้านใดด้านหนึ่งของเงื่อนไขbussyUserID != bussyUserIDเป็นโมฆะสิ่งนี้จะไม่ทำงานหากไม่มีการเปลี่ยนแปลงเพื่อจัดการกับ null

(หมายเหตุ: อาการของคุณไม่สมเหตุสมผลเมื่อเปรียบเทียบbussyUserIDกับตัวเอง!)