Last PL
HTML, CSS, and JavaScript tooling inside Oracle PL/SQL.
Last PL works entirely offline and adds highlighting, IntelliSense, diagnostics,
Emmet, and formatting to embedded web code. It layers onto your existing PL/SQL
grammar with no server, account, or build step.
Requirements
- VS Code 1.101 or newer.
- One PL/SQL grammar provider:
- Oracle SQL Developer Extension for VS Code (
oracle-sql), or
xyz.plsql-language (plsql).
If both providers claim the same files, disable one or configure
files.associations. Last PL layers onto whichever provider owns the document.
Supported regions
| PL/SQL construct |
Embedded language |
HTP.*, HTF.*, OWA_UTIL.* strings |
HTML |
APEX_JAVASCRIPT.ADD_INLINE_CODE / ADD_ONLOAD_CODE |
JavaScript |
ADD_REQUIREJS_DEFINE expression argument |
JavaScript |
ADD_LIBRARY.p_requirejs_js_expression |
JavaScript |
APEX_CSS.ADD |
CSS |
/*html*/, /*css*/, /*js*/ before a string |
Selected language |
Names, paths, keys, and other non-code APEX arguments remain PL/SQL. Regular,
national, paired q-quoted, symmetric, and Unicode-delimited literals are
supported, including concatenated strings and multiline call heads.
htp.p('<main class="card">Hello</main>');
apex_css.add('.card { padding: 1rem; }');
apex_javascript.add_inline_code('console.log("ready");');
l_fragment := /*html*/ q'[<button type="button">Save</button>]';
Features
- Accurate HTML/CSS/JavaScript highlighting without replacing the host PL/SQL
grammar. JavaScript colors follow Oracle's runtime
HTP.P/PRINT/PRN
output, and bracket colors restart at the same depth as a regular HTML script.
- Completion, hover, definitions, references, signature help, document symbols,
folding, linked tag editing, color previews, and selection expansion.
- HTMLHint, the VS Code CSS language service, and ESLint or Acorn diagnostics,
with squiggles mapped back to the original PL/SQL.
- Format Document support for PL/SQL and embedded HTML/CSS/JavaScript, with
string and q-quote safety checks.
- Emmet, HTML tag auto-close, and a status-bar region counter.
Configuration
Settings use the plsqlWebEmbedded prefix. Common options include:
detect.{htp,owaUtil,taggedComments}
diagnostics.{html,css,js,jsLinter}
diagnostics.{eslintRules,eslintGlobals,apexPreset}
formatter.{plsql,embedded,js}
autoCloseTags
normalizeBracketColors
Workspace ESLint and Prettier configuration is supported. JavaScript ESLint
configs execute only in trusted workspaces.
HTML, CSS, and JavaScript linting can each be switched off independently. All
three are enabled by default; JavaScript can use ESLint, Acorn, or no linter.
Commands
| Command |
Purpose |
PL/SQL: Show Embedded Regions |
List detected regions. |
PL/SQL: Diagnose Setup |
Check the active language, host grammar, settings, and region count. |
PL/SQL: Show Loaded Workspace ESLint Config |
Inspect resolved ESLint configuration. |
Limitations
- Detection is tokenizer-based, not a full PL/SQL parser. Raw strings inside
ordinary helpers such as
DECODE(...) are skipped; recognized HTP/HTF/OWA/APEX
calls nested inside those helpers are still detected.
- Bare string concatenations outside a recognized call need a language tag:
/*html*/ '<a>' || value || '</a>'.
- Runtime text produced by a variable or ordinary helper cannot be known until
PL/SQL executes; static fragments on either side remain supported.
- Browser-only virtual workspaces are not supported. Quoted/schema-qualified
calls and database-link-qualified calls are supported.
Privacy
Works entirely offline. No telemetry, network service, or account is required. See
CHANGELOG.md for release details.
Development
npm ci
npm run typecheck
npm run test:all
npm run test:integration
npm run check:oracle-web -- --require # optional local Oracle Docker check
npm run check:oracle-max -- --require # exhaustive Oracle byte differential
npm run check:oracle-ords # optional real ORDS HTTP stress gate
npm run package
The max-vision check also reads Oracle's supported preprocessing and PL/Scope
metadata. The ORDS gate temporarily deploys a locked-down test package to a
configured development pool and verifies real HTTP output, failures, state
reset, large responses, and concurrency. Oracle and ORDS are test-only; the
extension remains entirely offline and has no runtime service dependency.
Set security.maxEntries=0 on that test pool so allowlist changes are checked
on every request, as Oracle recommends for mod_plsql-compatible validation.
License
MIT. Third-party notices are included in
THIRD_PARTY_NOTICES.md.