IF ELSE 구문 추가
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"기호를 발견했습니다.,; 교차 마이너스 순서가있는 그룹의 경우 연결 위치 결합 시작
누가 내가 어디에서 실수를했고 여기서 무엇이 잘못되었는지 말해 줄 수 있습니까?
답변
초보자로서 이러한 종류의 구문 문제에 대처하는 방법과 관련하여 가능한 한 가장 작은 예제로 단순화하여 조인 논리에 산만 해지지 않도록 연습하는 것이 좋습니다.
예를 들어이를 빠르게 테스트하고 작동하지 않는지 확인할 수 있습니다 .
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 절로 이동할 수 있습니다.
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자신 과 비교할 때 의미가 없습니다 !)