Thêm trạng thái IF ELSE
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
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;
Đó 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ó!)