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"기호가 발생했습니다. (-+ case mod new not null continue avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval 날짜 파이프 <대체

오류 (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 절로 이동할 수 있습니다.

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 일 수있는 경우 null을 처리하기위한 약간의 변경 없이는 작동하지 않습니다.

(참고 : 귀하의 상태는 bussyUserID자신 과 비교할 때 의미가 없습니다 !)