Update for PL/SQL Cop and PL/SQL Analyzer


Some people asked me to announce the availability of new versions of products on my website. I guess a blog entry and a Twitter announcement should do the job. Today I’ve released the following three updates:

These products are always affected by a  grammar change to SQL*Plus, SQL or PL/SQL. The goal is to process all valid SQL*Plus, SQL and PL/SQL code, however, some limitations are documented here (e.g. a table alias named “inner” is not supported).

The links on the products above will show the associated changelog. The latest entries are mostly about bug fixing. If you are using the trial/preview version of PL/SQL Cop or PL/SQL Analyzer you might be glad to hear, that the included license is valid through April 30 2016.

Download the newest version from here.


  1. blank Ivan Kovalenko says:

    Philipp, i’d like to submit a question about PLSQL/Cop. I’ve discovered that it reports an error “Syntax error. Please contact the author if code compiles successfully in your environment.” on the following sample code

    create or replace function me (i IN number) return number as
    version_id versions.version_id%type;
     return i + version_id;

    Our developers use table “versions” for keeping versions (surprise) for something. So the following code doesn’t reports an error when executed in database (9,10,11)

    create table versions 
    (Version_id number);

    Is it intended due to keyword “versions” reservation (i could not find it is oracle reserved).

    • blank Ivan Kovalenko says:

      I found that “versions” keyword is taken from flashback query syntax.

    • Hello Ivan,

      VERSIONS is a keyword. It is used in the flashback_query_clause. See limitations regarding keywords on https://www.salvis.com/blog/faq/what-are-the-limitions/.

      Our PL/SQL parser version 1.0.17 (used in PL/SQL Cop 1.0.16, PL/SQL Cop for SQL Developer 1.0.12 and SQL Analyzer 1.0.7) handles the following (197) keywords:

      a, accessible, agent, aggregate, analyze, any, apply, array, ascii, at, auto, batch, bequeath, block, boolean, breadth, c, call, cascade, charset, clone, close, collect, comment, commit, compatibility, conditional, constraints, content, context, continue, copy, cost, cross, current_user, cursor, database, date, day, ddl, dec, default, deferrable, deferred, delete, dense_rank, depth, desc, disable, document, editionable, element, empty, enable, encoding, error, errors, escape, evalname, except, execute, exists, exit, false, final, first, force, foreign, format, forward, found, full, function, grouping, hash, hour, id, identifier, immediate, indent, inner, interface, interval, invisible, join, json, keep, key, language, last, lax, left, level, limit, local, locked, log, loop, main, map, match, match_recognize, matched, member, minute, mod, mode, model, month, name, nested, new, next, no, noneditionable, null, nulls, offset, oid, old, open, out, outer, package, parameters, parent, path, pattern, per, percent, permute, pipe, plan, pluggable, precision, pretty, primary, raise, range, read, record, ref, reference, rename, replace, result, return, reverse, right, row, rows, rowtype, rules, running, sample, save, schema, search, second, seed, segment, self, set, size, skip, statement, statement_id, statistics, strict, suspend, ties, time, timestamp, timezone_region, transaction, true, truncate, trust, type, unconditional, unplug, updated, use, validate, value, version, visible, wait, within, without, wrapper, write, xml, xmltype, year, yes, zone.

      However, this does not mean that these keywords may be used as identifier in every context. There are exceptions, namely for cursor, full, function, inner, join, left, model, outer, right, type, rowtype. All other keywords such as versions are currently not handled at all.

      If you use another name for the versions table or use the quoted syntax “VERSIONS” then PL/SQL Cop is capable to process the code. It should be possible to support this keyword in a future release.

      Best Regards,

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.