IF ELSE क़ानून जोड़ें

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" का एनकाउंटर किया: (- + mod mod new not null जारी रखें avg count करंट मौजूद है अधिकतम मिनट पूर्व sql stddev sum भिन्नता के लिए forall मर्ज समय टाइमस्टैम्प अंतराल तारीख पाइप <एक वैकल्पिक

त्रुटि (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

यह मान्य सिंटैक्स नहीं है। आप ऐसा कर सकते हैं (जैसा कि फ्लोरिन घिता ने एक टिप्पणी में सुझाया है):

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;

या आप किसी एक प्रश्न के कुछ शर्त जैसे कि शर्त में स्थानांतरित कर सकते हैं:

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अशक्त हो सकती है, तो यह नल को संभालने के लिए कुछ बदलाव के बिना काम नहीं करेगा।

(नोट: आपकी हालत समझ में नहीं आती क्योंकि आप bussyUserIDखुद से तुलना कर रहे हैं !)