PL / SQL Статус игнорируется - PullRequest
0 голосов
/ 07 августа 2020

Я новичок в PL/SQL и хочу создать функцию для извлечения AllProject. Итак, что я создаю, это

          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
(
    (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;

Когда я компилирую, я получаю две ошибки, которые я не понимаю, что это за ошибки:

Первая ошибка:

Error(6,1): PL/SQL: SQL Statement ignored

И Вторая ошибка:

Error(27,24): PL/SQL: ORA-00933: SQL command not properly ended

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Лишняя запятая должна быть = вместо :=, отсутствует точка с запятой, отсутствуют одинарные кавычки для ИНТЕРВАЛА.

Кроме того, вы не можете выделить столько столбцов в один 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>
0 голосов
/ 07 августа 2020

Используйте этот запрос и сначала проверьте, работает ли запрос независимо, передав жестко запрограммированное значение в запросе:

CREATE OR REPLACE FUNCTION GETALLPROJECTS(currentUserID in INT)
   RETURN SYS_REFCURSOR
IS 
   rc  SYS_REFCURSOR;
BEGIN
OPEN rc FOR
        SELECT p.ProjectID,
            p.CustomName,
            p.Name,
            p.Responsible_person_id,
            p.Delivery_contact,
            p.StartDate,
            p.EndDate,
            p.TehnicReview,
            p.status
        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
(
    (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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...