Thêm trạng thái IF ELSE

Sep 04 2020

Tôi có một chức năng nào đó trong PHP như,

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

VẬY cho đến nay tôi dịch điều này thành hàm trong Oracle SQL và vấn đề chính bây giờ là thêm IF ELSEnó đối với tôi như người mới bắt đầu khá khó, bất cứ điều gì tôi cố gắng tôi luôn gặp lỗi

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;

Cho đến nay, có hai lỗi mà tôi nhận được

Lỗi (524,9): PLS-00103: Gặp phải biểu tượng "CHỌN" khi mong đợi một trong những điều sau: (- + trường hợp mod mới không null tiếp tục số trung bình hiện tại tồn tại tối đa trước sql stddev tổng phương sai thực hiện khoảng thời gian dấu thời gian hợp nhất forall dấu ngày tháng <an alternat

Lỗi (528,3): PLS-00103: Gặp phải biểu tượng "INNER" khi mong đợi một trong những điều sau:,; cho nhóm có giao nhau trừ đi thứ tự bắt đầu liên hiệp nơi kết nối

Có ai có thể cho tôi biết tôi đã làm sai ở đâu và sai ở đây là gì không?

Trả lời

WilliamRobertson Sep 04 2020 at 13:28

Về cách đối phó với loại vấn đề cú pháp này khi mới bắt đầu, tôi khuyên bạn nên thực hành đơn giản hóa nó xuống ví dụ nhỏ nhất có thể, để bạn không bị phân tâm bởi logic nối.

Ví dụ: bạn có thể nhanh chóng kiểm tra điều này và thấy rằng nó sẽ không hoạt động :

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

cái nào thất bại với

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

bởi vì open rc for selectcú pháp phải là một câu lệnh duy nhất và không thể được tách ra bằng logic có điều kiện.

Lưu ý cách không có create function, tham số hoặc kết hợp, v.v. để làm phức tạp mọi thứ. Bạn có thể thêm lại tất cả những thứ đó sau khi đã nắm rõ cú pháp. Các casecú pháp tuyên bố là ở đây . (Lưu ý rằng có một số loại khác nhau case.) Nó cần phải là

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

hoặc tương đương bằng cách sử dụng 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

Đó không phải là cú pháp hợp lệ. Bạn có thể làm điều này (như Florin Ghita đã đề xuất trong một bình luận):

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;

hoặc bạn có thể di chuyển điều kiện vào mệnh đề WHERE của một truy vấn đơn lẻ như:

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;

Tuy nhiên, nếu một trong hai bên của điều kiện bussyUserID != bussyUserIDcó thể là null thì điều này sẽ không hoạt động nếu không có một số thay đổi để xử lý null.

(Lưu ý: Tình trạng của bạn không có ý nghĩa như bạn đang so sánh bussyUserIDvới chính nó!)