Лишняя запятая должна быть =
вместо :=
, отсутствует точка с запятой, отсутствуют одинарные кавычки для ИНТЕРВАЛА.
Кроме того, вы не можете выделить столько столбцов в один VARCHAR2
переменная, и вы не можете GROUP BY
ни одного столбца. Вместо этого рассмотрите возможность возврата курсора ref:
CREATE OR REPLACE FUNCTION GETALLPROJECTS (currentUserID IN INT)
RETURN SYS_REFCURSOR
IS
rc SYS_REFCURSOR;
BEGIN
OPEN rc FOR
SELECT p.*
FROM projects p
LEFT JOIN project_users_schedule_dates pusd
ON pusd.ProjectID = p.ProjectID
AND pusd.UserID = currentUserID
LEFT JOIN responsible_persons rp
ON rp.ProjectID = p.ProjectID
AND rp.UserID = currentUserID
LEFT JOIN users u ON u.UserID = currentUserID
WHERE u.User_roleID = 1
OR ( ( p.Responsible_person_id = currentUserID
OR p.Delivery_contact = currentUserID
OR rp.UserID = currentUserID
OR ( pusd.ProjectID = p.ProjectID
AND pusd.UserID = currentUserID
AND NOW () BETWEEN pusd.StartDate
AND pusd.EndDate + INTERVAL '1' DAY
AND NOW () BETWEEN p.StartDate
AND p.EndDate + INTERVAL '1' DAY)
AND p.status = 2))
ORDER BY p.ProjectID;
RETURN rc;
END GETALLPROJECTS;
Так как у меня нет ваших таблиц, вот пример, созданный по образцу схемы Скотта, просто чтобы проиллюстрировать, что вы могли сделать:
SQL> create or replace function getallemp (par_deptno in number)
2 return sys_refcursor
3 is
4 rc sys_refcursor;
5 begin
6 open rc for
7 select e.*
8 from emp e
9 where e.deptno = par_deptno
10 order by e.ename;
11 return rc;
12 end;
13 /
Function created.
SQL>
SQL> select getallemp(10) from dual;
GETALLEMP(10)
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09.06.81 2450 10
7839 KING PRESIDENT 17.11.81 10000 10
7934 MILLER CLERK 7782 23.01.82 1300 10
SQL>