Update for PL/SQL Cop and PL/SQL Analyzer


Some people asked me to announce the availability of new versions of products on my web site. 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 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 thru 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

    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)

    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.