# Code Style

Rules which enforce a specific coding style.

## AvoidTabCharacter

Since: PMD 6.13.0

Priority: Medium (3)

This rule checks, that there are no tab characters (`\t`) in the source file. It reports only the first occurrence per file.

Using tab characters for indentation is not recommended, since this requires that every developer uses the same tab with in their editor.

This rule is the PMD equivalent of checkstyle’s FileTabCharacter check.

This rule is defined by the following Java class: net.sourceforge.pmd.lang.plsql.rule.codestyle.AvoidTabCharacterRule

This rule has the following properties:

Name | Default Value | Description | Multivalued
--- | --- | --- | ---
eachLine | false | Whether to report each line with a tab character or only the first line | no

Use this rule with the default properties by just referencing it:

    <rule ref="category/plsql/codestyle.xml/AvoidTabCharacter" />

Use this rule and customize it:

    <rule ref="category/plsql/codestyle.xml/AvoidTabCharacter">
        <properties>
            <property name="eachLine" value="false" />
        </properties>
    </rule>

## CodeFormat

Since: PMD 6.9.0

Priority: Medium (3)

This rule verifies that the PLSQL code is properly formatted. The following checks are executed:

SQL Queries:

- The selected columns must be each on a new line
- The keywords (BULK COLLECT INTO, FROM) start on a new line and are indented by one level
- UNION should be on the same indentation level as SELECT
- Each JOIN is on a new line. If there are more than one JOIN conditions, then each condition should be on a separate line.

Parameter definitions for procedures:

- Each parameter should be on a new line
- Variable names as well as their types should be aligned

Variable declarations:

- Each variable should be on a new line
- Variable names as well as their types should be aligned

Calling a procedure:

- If there are more than 3 parameters
  - then named parameters should be used
  - and each parameter should be on a new line

This rule is defined by the following Java class: net.sourceforge.pmd.lang.plsql.rule.codestyle.CodeFormatRule

Example(s):

    BEGIN
      -- select columns each on a separate line
      SELECT cmer_id
            ,version
            ,cmp_id
        BULK COLLECT INTO v_cmer_ids
            ,v_versions
            ,v_cmp_ids
        FROM cmer;

      -- each parameter on a new line
      PROCEDURE create_prospect(
        company_info_in      IN    prospects.company_info%TYPE -- Organization
       ,firstname_in         IN    persons.firstname%TYPE      -- FirstName
       ,lastname_in          IN    persons.lastname%TYPE       -- LastName
      );

      -- more than three parameters, each parameter on a separate line
      webcrm_marketing.prospect_ins(
        cmp_id_in            => NULL
       ,company_info_in      => company_info_in
       ,firstname_in         => firstname_in
       ,lastname_in          => lastname_in
       ,slt_code_in          => NULL
      );

    END;

This rule has the following properties:

Name | Default Value | Description | Multivalued
--- | --- | --- | ---
indentation | 2 | Indentation to be used for blocks | no

Use this rule with the default properties by just referencing it:

    <rule ref="category/plsql/codestyle.xml/CodeFormat" />

Use this rule and customize it:

    <rule ref="category/plsql/codestyle.xml/CodeFormat">
        <properties>
            <property name="indentation" value="2" />
        </properties>
    </rule>

## ForLoopNaming

Since: PMD 6.7.0

Priority: Medium (3)

In case you have loops please name the loop variables more meaningful.

This rule is defined by the following XPath expression:

    //CursorForLoopStatement[
        $allowSimpleLoops = false() or
        (Statement//CursorForLoopStatement or ancestor::CursorForLoopStatement)
    ]
    /ForIndex[not(matches(@Image, $cursorPattern))]
    |
    //ForStatement[
        $allowSimpleLoops = false() or
        (Statement//ForStatement or ancestor::ForStatement)
    ]
    /ForIndex[not(matches(@Image, $indexPattern))]

Example(s):

    -- good example
    BEGIN
    FOR company IN (SELECT * FROM companies) LOOP
      FOR contact IN (SELECT * FROM contacts) LOOP
        FOR party IN (SELECT * FROM parties) LOOP
          NULL;
        END LOOP;
      END LOOP;
    END LOOP;
    END;
    /

    -- bad example
    BEGIN
    FOR c1 IN (SELECT * FROM companies) LOOP
      FOR c2 IN (SELECT * FROM contacts) LOOP
        FOR c3 IN (SELECT * FROM parties) LOOP
          NULL;
        END LOOP;
      END LOOP;
    END LOOP;
    END;
    /

This rule has the following properties:

Name | Default Value | Description | Multivalued
--- | --- | --- | ---
allowSimpleLoops | false | Ignore simple loops, that are not nested | no
cursorPattern | [a-zA-Z_0-9]{5,} | The pattern used for the curosr loop variable | no
indexPattern | [a-zA-Z_0-9]{5,} | The pattern used for the index loop variable | no

Use this rule with the default properties by just referencing it:

    <rule ref="category/plsql/codestyle.xml/ForLoopNaming" />

Use this rule and customize it:

    <rule ref="category/plsql/codestyle.xml/ForLoopNaming">
        <properties>
            <property name="allowSimpleLoops" value="false" />
            <property name="cursorPattern" value="[a-zA-Z_0-9]{5,}" />
            <property name="indexPattern" value="[a-zA-Z_0-9]{5,}" />
        </properties>
    </rule>

## LineLength

Since: PMD 6.13.0

Priority: Medium (3)

This rule checks for long lines. Please note that comments are not ignored.

This rule is the PMD equivalent of checkstyle’s LineLength check.

This rule is defined by the following Java class: net.sourceforge.pmd.lang.plsql.rule.codestyle.LineLengthRule

This rule has the following properties:

Name | Default Value | Description | Multivalued
--- | --- | --- | ---
maxLineLength | 80 | The maximum allowed line length | no
eachLine | false | Whether to report each line that is longer only the first line | no

Use this rule with the default properties by just referencing it:

    <rule ref="category/plsql/codestyle.xml/LineLength" />

Use this rule and customize it:

    <rule ref="category/plsql/codestyle.xml/LineLength">
        <properties>
            <property name="maxLineLength" value="80" />
            <property name="eachLine" value="false" />
        </properties>
    </rule>

## MisplacedPragma

Since: PMD 5.5.2

Priority: Medium (3)

Oracle states that the PRAQMA AUTONOMOUS_TRANSACTION must be in the declaration block, but the code does not complain, when being compiled on the 11g DB. https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/static.htm#BABIIHBJ

This rule is defined by the following XPath expression:

    //ProgramUnit/Pragma

Example(s):

    create or replace package inline_pragma_error is

    end;
    /

    create or replace package body inline_pragma_error is
      procedure do_transaction(p_input_token        in varchar(200)) is
      PRAGMA AUTONOMOUS_TRANSACTION; /* this is correct place for PRAGMA */
      begin
        PRAGMA AUTONOMOUS_TRANSACTION; /* this is the wrong place for PRAGMA -> violation */
        /* do something */
        COMMIT;
       end do_transaction;

    end inline_pragma_error;
    /

Use this rule by referencing it:

    <rule ref="category/plsql/codestyle.xml/MisplacedPragma" />