เพิ่ม IF ELSE statment
ฉันมีฟังก์ชันใน 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" เมื่อคาดหวังอย่างใดอย่างหนึ่งต่อไปนี้:; สำหรับกลุ่มที่มีการตัดกันลบคำสั่งเริ่มต้นสหภาพที่เชื่อมต่อ
ใครช่วยบอกทีว่าฉันทำผิดพลาดตรงไหนและมีอะไรผิดปกติ?
คำตอบ
เกี่ยวกับวิธีรับมือกับปัญหาไวยากรณ์ประเภทนี้ในฐานะผู้เริ่มต้นฉันขอแนะนำให้คุณฝึกฝนการทำให้ง่ายขึ้นเป็นตัวอย่างที่เล็กที่สุดเท่าที่จะเป็นไปได้เพื่อที่คุณจะไม่ถูกรบกวนจากตรรกะการเข้าร่วม
ตัวอย่างเช่นคุณสามารถทดสอบได้อย่างรวดเร็วและพบว่ามันใช้ไม่ได้ :
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;
นั่นไม่ใช่ไวยากรณ์ที่ถูกต้อง คุณสามารถทำได้ (ตามที่ 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กับตัวเอง!)