# G-7170: Avoid using an IN OUT parameter as IN or OUT only.

Major

Efficiency, Maintainability

Unsupported in PL/SQL Cop Validators

We cannot determine the usage of an in out parameter in a reliable way, especially when other units are involved which are maintained in another file.

## Reason

Avoid using parameter mode in out unless you actually use the parameter both as input and output. If the code body only reads from the parameter, use in; if the code body only assigns to the parameter, use out. If at the beginning of a project you expect a parameter to be both input and output and therefore choose in out just in case, but later development shows the parameter actually is only in or out, you should change the parameter mode accordingly.

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 create or replace package body employee_up is procedure rcv_emp (io_first_name in out employees.first_name%type ,io_last_name in out employees.last_name%type ,io_email in out employees.email%type ,io_phone_number in out employees.phone_number%type ,io_hire_date in out employees.hire_date%type ,io_job_id in out employees.job_id%type ,io_salary in out employees.salary%type ,io_commission_pct in out employees.commission_pct%type ,io_manager_id in out employees.manager_id%type ,io_department_id in out employees.department_id%type ,in_wait in integer) is l_status pls_integer; co_dflt_pipe_name constant string(30 char) := 'MyPipe'; co_ok constant pls_integer := 1; begin -- Receive next message and unpack for each column. l_status := sys.dbms_pipe.receive_message(pipename => co_dflt_pipe_name ,timeout => in_wait); if l_status = co_ok then sys.dbms_pipe.unpack_message (io_first_name); sys.dbms_pipe.unpack_message (io_last_name); sys.dbms_pipe.unpack_message (io_email); sys.dbms_pipe.unpack_message (io_phone_number); sys.dbms_pipe.unpack_message (io_hire_date); sys.dbms_pipe.unpack_message (io_job_id); sys.dbms_pipe.unpack_message (io_salary); sys.dbms_pipe.unpack_message (io_commission_pct); sys.dbms_pipe.unpack_message (io_manager_id); sys.dbms_pipe.unpack_message (io_department_id); end if; end rcv_emp; end employee_up; / 
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 create or replace package body employee_up is procedure rcv_emp (out_first_name out employees.first_name%type ,out_last_name out employees.last_name%type ,out_email out employees.email%type ,out_phone_number out employees.phone_number%type ,out_hire_date out employees.hire_date%type ,out_job_id out employees.job_id%type ,out_salary out employees.salary%type ,out_commission_pct out employees.commission_pct%type ,out_manager_id out employees.manager_id%type ,out_department_id out employees.department_id%type ,in_wait in integer) is l_status pls_integer; co_dflt_pipe_name constant string(30 char) := 'MyPipe'; co_ok constant pls_integer := 1; begin -- Receive next message and unpack for each column. l_status := sys.dbms_pipe.receive_message(pipename => co_dflt_pipe_name ,timeout => in_wait); if l_status = co_ok then sys.dbms_pipe.unpack_message (out_first_name); sys.dbms_pipe.unpack_message (out_last_name); sys.dbms_pipe.unpack_message (out_email); sys.dbms_pipe.unpack_message (out_phone_number); sys.dbms_pipe.unpack_message (out_hire_date); sys.dbms_pipe.unpack_message (out_job_id); sys.dbms_pipe.unpack_message (out_salary); sys.dbms_pipe.unpack_message (out_commission_pct); sys.dbms_pipe.unpack_message (out_manager_id); sys.dbms_pipe.unpack_message (out_department_id); end if; end rcv_emp; end employee_up; /