If statement 传递无效的用户id时,代码应显示消息,但dbms_输出为空

If statement 传递无效的用户id时,代码应显示消息,但dbms_输出为空,if-statement,plsql,cursor,If Statement,Plsql,Cursor,此过程应列出映射到活动用户的所有项目id,并且在传递无效用户id时,应打印用户无效。但是,没有显示任何消息 PROCEDURE get_pid_info (p_return_status_o OUT VARCHAR2, p_error_message_o OUT VARCHAR2, p_user_id IN VARCHAR2) IS CURSOR c

此过程应列出映射到活动用户的所有项目id,并且在传递无效用户id时,应打印用户无效。但是,没有显示任何消息

PROCEDURE get_pid_info (p_return_status_o      OUT VARCHAR2,
                        p_error_message_o      OUT VARCHAR2,
                        p_user_id           IN     VARCHAR2)
IS
  CURSOR c_pid
  IS
       SELECT DISTINCT xpppa.project_id,
                       papf.person_type_id,
                       xpppp.end_date_active,
                       papf.person_id,
                       COUNT (DISTINCT xpppa.project_id) pid_count
         FROM xxcas_prj_pa_projects_all xpppa,
              xxcas_prj_pa_project_players xpppp,
              per_all_people_f papf
        WHERE     xpppa.project_id = xpppp.project_id
              AND xpppp.person_id = papf.person_id
              AND papf.person_id = 61--p_user_id
              AND xpppp.project_role_type = 'PROJECT MANAGER'
              AND papf.person_type_id = 6
              and sysdate between xpppa.start_date and nvl(xpppa.completion_date,sysdate+1)
              and sysdate between xpppp.start_date_active and nvl(xpppp.end_date_active,sysdate+1)
              AND EXISTS
                     (SELECT 1
                        FROM pa_lookups
                       WHERE     lookup_type = 'XXCAS_PRJ_USER_DETAILS'
                             AND description=papf.email_address
                             AND enabled_flag = 'Y'
                             AND SYSDATE BETWEEN start_date_active
                                             AND NVL (end_date_active,
                                                      SYSDATE + 1))
     GROUP BY xpppa.project_id,
              papf.person_type_id,
              xpppp.end_date_active,
              papf.person_id;
BEGIN
  FOR l_rec IN c_pid
  LOOP
     IF l_rec.project_id IS NOT NULL
     THEN
        dbms_output.put_line (
              'The Projects mapped to the active user ID are : '
           || l_rec.project_id);
     ELSIF l_rec.end_date_active < SYSDATE
     THEN
        dbms_output.put_line (
           'The user has been end dated in the system on : ' || l_rec.end_date_active);
     ELSIF l_rec.pid_count = 0
     THEN
        dbms_output.put_line (
           'There are no projects mapped to the user having PM role');
     ELSE 
        dbms_output.put_line ('Please check the user ID passed');
     END IF;

     IF SQL%NOTFOUND 
     THEN
       dbms_output.put_line('Entered user id is not valid');
     end if;

  END LOOP;
EXCEPTION
  WHEN NO_DATA_FOUND
  THEN
    dbms_output.put_line ('Please provide valid user ID');
  WHEN OTHERS
  THEN
    dbms_output.put_line ('Error in get_pid' || SQLERRM);
END get_pid_info;

首先,如果没有要处理的行,则不会输入循环,因此不会执行循环中的任何检查

第二,应用于隐式游标,而不是像过程中的c_pid那样命名的游标。最简单的方法是在循环中声明一个布尔变量,将其初始化为FALSE并将其设置为TRUE;然后可以在循环后检查其值。或者,如果需要实际行数,请使用c_pid%rowcount并将其初始化为0


我假设这是实际过程的简化版本,因为dbms_输出在生产代码中通常不有用,除非调用者被设置为捕获它。

它需要检查游标循环是否找到任何要处理的行。sql%notfound不能这样做。
declare
    status varchar2(30);
    msg varchar2(30);
begin
    --DBMS_OUTPUT.ENABLE('20000000'); 
    XXCAS_PRJ_PROJECT_DTLS.GET_PID_INFO(status,msg,61);
end;