Skip to main content

Posts

Showing posts from May, 2026

Describe tables to your AI with APEX_DB_DICTIONARY

A APEX 26.1 shipped a small package called APEX_DB_DICTIONARY , and at first glance you might ignore it. We already have DBMS_METADATA for pulling object definitions, right? Well, these two solve different problems, and once I saw the difference I started reaching for the new one a lot. Here is the short version. DBMS_METADATA gives you DDL meant to recreate an object. APEX_DB_DICTIONARY gives you a description meant to be read, by a human or by an LLM. Noisy old way Say you want to hand the structure of EMP to your AI, so it can write you some queries. The reflex is GET_DDL. SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMP') FROM dual; And what you get back is a wall of storage clauses, tablespace names, segment attributes and other junk you don't care about. To make it readable you have to do a lof of transformations first. BEGIN DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE); DBMS_METADATA...

I built a Devil's Advocates skill

W When you decide alone, your strongest critic is missing. Friends are busy or too polite, and the AI you ask just agrees with whatever you already lean toward, or the push back is very soft. So the brain settles into "this feels right" the moment you have half-committed to a direction. That is how I end up shipping things I should have killed and killing things I should have shipped. So I built a Claude Code skill that provides this honest feedback. It is called Devil's Advocates . You bring it a real decision and before it argues with you, it ask you few claryfing questions. One of them always forces you to say out loud what could go wrong, what you would lose if this call is the wrong one. Half the time that round alone is the value, because most bad decisions are just badly framed ones. A vague question gets you vague answer. Once the question is sharp, it dispatches five adversarial sub-agents in parallel. Parallel matters: each one answers without seeing th...

APEXlang is here

A APEX 26.1 ships tomorrow. After 2 years of massive team effort, we have Oracle APEX Special Update office hours scheduled for Thursday May 14th, 16:00 CEST, and the marquee feature is finally coming out of the oven. Six new icons! The feature is APEXlang , an open application specification language, and it's the biggest change to APEX since its introduction in 2004. APEXlang in one paragraph APEXlang is a new export/import format for APEX apps. Instead of a single ".sql" script with environment-specific numeric IDs, you get a zipped package of ".apx" files (one per page, one per shared component, one at app level) plus native ".sql", ".css", ".png", ".js" files living at proper paths. It is something like ".yaml" files, but on steroids and editable. Human readable, diffable, mergeable, Git-friendly. Same IDs across environments (static and non-numeric). The classic SQL script export isn't goin...

Making Claude Code insights actionable

C Claude Code ships a "/insights" command that generates a usage report. It covers which sessions succeeded, where things broke, tool usage patterns, cost distribution. It is a HTML file and extracting anything useful from it is just enough friction to lose the habit. The big issue There's a bigger problem though. By default, "/insights" generates a report from the past 30 days. That's a huge window. I don't want feedback once per month, I want it once per week. At that point most of the recommendations there are for things you may have solved two or three weeks ago. The report feels stale before you even open it. I found a solution by manipulating the source data. Claude Code reads "~/.claude/projects/*/*.jsonl" to compute the report. The skill temporarily moves JSONL files older than 7 days out of that directory before running "/insights", then restores them immediately after regardless of success or failure. This constra...

Mario sounds in Claude Code

W When Claude finishes a long task, you get silence. That's fine, but there's a better option. Claude Code supports hooks, which are commands that fire on specific events. So I wired up Mario sounds you might know from my APEX Deployment Tool , and now I get a little coin chime when Claude is done, a warning tone when it's waiting for me, and a dying-mushroom sound right before it compacts the conversation. Here's how to set it up. Install chime The chime Python library does all the work. One install, no system dependencies. pip install chime The script Save this anywhere stable. I keep mine at "~/.claude/scripts/play_sound.py". #!/usr/bin/env python3 import argparse import chime SOUNDS = { 'success' : chime.success, 'error' : chime.error, 'warning' : chime.warning, 'info' : chime.info, } def main(): parser = argparse.ArgumentParser() parser.add_argument('sound', ...

Oracle formatting skills, and how to build your own

S So I just published two Claude Code plsql-formatter and sql-formatter skills. The first one handles packages, procedures, functions, and triggers. The second handles the SQL side: standalone queries, any SQL embedded inside PL/SQL and views. Together they cover everything that lands in a real project. I split them into two skills because that is how Claude routes, by intent. Two skills, two trigger sets, no token waste on rules that don't apply. The Problem SQL Developer's built-in formatter is configurable, but every developer has a slightly different preferences and not everything can be customized there as you want. The result on a shared repo is a diff full of whitespace noise, columns realigned three different ways, WHERE clauses re-indented on every commit. So you spend time in code review fixing formatting instead of logic. Eventually you settle with a style which you don't really like. A skill fixes this differently. Instead of running a tool that rew...