If statement 传递无效的用户id时,代码应显示消息,但dbms_输出为空
此过程应列出映射到活动用户的所有项目id,并且在传递无效用户id时,应打印用户无效。但是,没有显示任何消息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
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;