rspec/rules/S3874/plsql/rule.adoc
2022-02-04 16:28:24 +00:00

84 lines
2.0 KiB
Plaintext

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[]