【发布时间】:2020-09-04 06:44:06
【问题描述】:
我在 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时间时间戳间隔日期管道
错误(528,3):PLS-00103:在预期以下之一时遇到符号“INNER”:, ;对于有相交减去顺序的组,在连接处开始联合
谁能告诉我我在哪里做错了,这里出了什么问题?
【问题讨论】:
-
您在滥用
open for语法。我宁愿写case when busyuserid = someid then open rc for select ...; when busyuserid = otherid then open cursor for otherselect; else open rc for anotherselect; end case;之类的东西 -
我不想总是在初学者中只打开一次 rc FOR。所以像这样
OPEN rc FOR IF condition THEN {SELECT} ELSE {SELECT} -
整个设计看起来有缺陷。你有busyUsersIDS,这意味着你可以有多个,但是你只传递一个INT输入类型。您是否在某个表中有忙碌的用户,最好只加入该表而不是创建可以实现加入逻辑的函数。