Functions with ``++OUT++`` parameters are complex to understand. Indeed, it is impossible to tell, just by looking at the function call, whether an argument is a input or output. Moreover, functions with ``++OUT++`` parameters cannot be called from SQL. It is better to either break such functions up into smaller ones, which each return a single value, or to return several values at once, by combining them in a collection, record, type, or table row. == Noncompliant Code Example [source,sql] ---- SET SERVEROUTPUT ON CREATE TABLE employee( firstName VARCHAR2(42), name VARCHAR2(42), phone VARCHAR2(42) ); INSERT INTO employee VALUES ('John', 'Smith', '+1'); DECLARE firstName VARCHAR2(42); name VARCHAR2(42); phone VARCHAR2(42); -- This DOES NOT return the employee name FUNCTION getEmployeeInfos(firstName OUT VARCHAR2, phone OUT VARCHAR2) RETURN VARCHAR2 AS -- Non-Compliant, confusing name VARCHAR2(42); BEGIN SELECT firstName, name, phone INTO firstName, name, phone FROM employee; RETURN name; END; BEGIN name := getEmployeeInfos(firstName, phone); DBMS_OUTPUT.PUT_LINE('firstName: ' || firstName); DBMS_OUTPUT.PUT_LINE('name: ' || name); DBMS_OUTPUT.PUT_LINE('phone: ' || phone); END; / ---- == Compliant Solution [source,sql] ---- SET SERVEROUTPUT ON CREATE TABLE employee( firstName VARCHAR2(42), name VARCHAR2(42), phone VARCHAR2(42) ); INSERT INTO employee VALUES ('John', 'Smith', '+1'); DECLARE emp employee%ROWTYPE; FUNCTION getEmployeeInfos RETURN employee%ROWTYPE AS -- Compliant emp employee%ROWTYPE; BEGIN SELECT * INTO emp FROM employee; RETURN emp; END; BEGIN emp := getEmployeeInfos; DBMS_OUTPUT.PUT_LINE('firstName: ' || emp.firstName); DBMS_OUTPUT.PUT_LINE('name: ' || emp.name); DBMS_OUTPUT.PUT_LINE('phone: ' || emp.phone); END; / DROP TABLE employee; ---- ifdef::env-github,rspecator-view[] ''' == Implementation Specification (visible only on this page) include::message.adoc[] include::../highlighting.adoc[] endif::env-github,rspecator-view[]