Skip to main content

Oracle Dev Gym 2.2 Release: faster, simpler and fun, new workouts!

We upgraded the Oracle Dev Gym site this past weekend to 2.2. Why should you care? Because the Dev Gym offers a great active learning complement to reading doc and blogs, and watching videos. We help you deepen and broaden your expertise through exercise: taking quizzes that reinforce newly gained knowledge.


At the heart of the Dev Gym is a library of over 2,400 quizzes on SQL, PL/SQL, Oracle Application Express, Database Design and Logic. Almost all these quizzes were first played as part of our daily and then weekly tournaments - which means they've been reviewed by experts and taken by hundreds and in some cases thousands of developers. They are usually code-based quizzes that strengthen you ability to read and understand code (rather than "try it and see" by running the code).

The Dev Gym home page offers a selection of favorite quizzes hand-picked each week by our quizmasters from this library. But that's just the tip of the iceberg. Looking to strengthen you skill at Oracle's powerful analytic functions? Type in "analytic" in the search bar, press Enter and scroll through the dozens of quizzes on LAG, LEAD, LISTAGG and more.

You can search within specific technologies, like PL/SQL, specify the Oracle Database version in which you are interested, filter by difficulty, and more.

Check out this video on Dev Gym quizzes:


Workouts have undergone a major overhaul.

We now offer a set of pre-defined workouts for you to take. These might consist of a set of quizzes on a given feature, or a video followed by quizzes. These workouts are not parts of classes. They allow you to do a concentrated lesson in a given area of the technology, without having to sign up or attend classes.

You can also create your own customized workout. This feature also serves as a replacement for the  PL/SQL Challenge Practices feature. Simply press the Create Custom Workout button and off you go.

The Practice Autotunes feature is also now a part of Workouts; they are now called Daily Workouts. With a single click, you can sign up to receive a daily workout consisting of one quiz for the selected technology. They expire each day.

The "old way" of taking workouts via our Personal Trainer, with four sets of weekly workouts aligned around monthly goals, is still available but only by clicking on the Classic Workouts button on the Workouts page. It will create a new set of workouts for you one month at a time (not two, as happened previously). And you will not be able to change the topic or exercises. If that's frustrating, please check out Create Custom Workout.

Check out this video on Dev Gym workouts:


We've reorganized the Classes page. Scheduled and on-demand classes all appear under Current Classes. If the class is part of a series, such as Database for Developers, only one card appears in the list. It will take you to the current class automatically.

Check out this video on our classes:

Open Tournaments and the Library

The PL/SQL Challenge Library page is available on the Dev Gym under the Tournaments tab. Just lick on the Library link at the top of the page. You can then view past tournaments and other scheduled quizzes by clicking on Tournaments and then the Library link at the top of the page.

Yes, that's right: we offer weekly Open Tournaments. Brand new quizzes each week.Anyone can play, and you can choose to play competitively or simply to learn. The top 50 ranked players in each technology then qualify for the annual championship.

For an overview of our Open Tournaments:

Deja Vu Quizzes are now Featured Quizzes

Deja Vu quizzes are now presented on the home page of the Dev Gym as Featured Quizzes.

They also will continue to be available at the PL/SQL Challenge, but will no longer contain the words "Deja Vu".

Player Settings

You can now set your primary technology on the Preferences tab of the Settings page.

This preference is used on the Leaderboards page, as well as for reviewers and domain administrators, but will be extended to other players over time.

Some Under the Cover Thoughts

Since users of our site are developers, we thought you'd like to hear about some of the changes "under the cover."

The most important work we did for 2.2 was to change the data model for workouts. Someone (his first name is Steven, but we cannot disclose his full identity) made some very poor data model decisions, in too much of a hurry, without sufficient review by other humans when workouts and classes were first added to the site.

One result was that we ended up copying data from another system into the Dev Gym schema. Gee, that sounds like a bad idea, right? How do you keep them in synch? D'oh.

Another result was an unnecessary explosion of rows of data in several tables, and with it increased code complexity, the likelihood (and then reality) of bad data, and way too many hours lost applying fixes.

With 2.2, the data model is cleaned up, the code is simplified, the performance is improved, and once again Steven can sleep well at night.

Steven also now has two reminders attached to his monitor:


Wish Steven luck.

PS - A big thanks and salute to Eli Feuerstein, the lead APEX developer for the Dev Gym. Steven handles most of the backend work, but the UI is all Eli, all the time. It's gotten so much better in this release, and you will soon see even more - and more exciting - improvements.


Popular posts from this blog

Get rid of mutating table trigger errors with the compound trigger

When something mutates, it is changing. Something that is changing is hard to analyze and to quantify. A mutating table error (ORA-04091) occurs when a row-level trigger tries to examine or change a table that is already undergoing change (via an INSERT, UPDATE, or DELETE statement). In particular, this error occurs when a row-level trigger attempts to read or write the table from which the trigger was fired. Fortunately, the same restriction does not apply in statement-level triggers.

In this post, I demonstrate the kind of scenario that will result in an ORA-04091 errors. I then show the "traditional" solution, using a collection defined in a package. Then I demonstrate how to use the compound trigger, added in Oracle Database 11g Release1,  to solve the problem much more simply.

All the code shown in this example may be found in this LiveSQL script.
How to Get a Mutating Table ErrorI need to implement this rule on my employees table:
Your new salary cannot be more than 25x th…

How to Pick the Limit for BULK COLLECT

This question rolled into my In Box today:
In the case of using the LIMIT clause of BULK COLLECT, how do we decide what value to use for the limit? First I give the quick answer, then I provide support for that answer

Quick Answer
Start with 100. That's the default (and only) setting for cursor FOR loop optimizations. It offers a sweet spot of improved performance over row-by-row and not-too-much PGA memory consumption.Test to see if that's fast enough (likely will be for many cases).If not, try higher values until you reach the performance level you need - and you are not consuming too much PGA memory. Don't hard-code the limit value: make it a parameter to your subprogram or a constant in a package specification.Don't put anything in the collection you don't need. [from Giulio Dottorini]Remember: each session that runs this code will use that amount of memory.Background

When you use BULK COLLECT, you retrieve more than row with each fetch, reducing context switchi…

Quick Guide to User-Defined Types in Oracle PL/SQL

A Twitter follower recently asked for more information on user-defined types in the PL/SQL language, and I figured the best way to answer is to offer up this blog post.

PL/SQL is a strongly-typed language. Before you can work with a variable or constant, it must be declared with a type (yes, PL/SQL also supports lots of implicit conversions from one type to another, but still, everything must be declared with a type).

PL/SQL offers a wide array of pre-defined data types, both in the language natively (such as VARCHAR2, PLS_INTEGER, BOOLEAN, etc.) and in a variety of supplied packages (e.g., the NUMBER_TABLE collection type in the DBMS_SQL package).

Data types in PL/SQL can be scalars, such as strings and numbers, or composite (consisting of one or more scalars), such as record types, collection types and object types.

You can't really declare your own "user-defined" scalars, though you can define subtypes from those scalars, which can be very helpful from the perspective…