Skip to content

Tutorial: Oracle

This tutorial walks you through connecting an Oracle database (12c through 26ai) to Faucet and querying it via the REST API.

Prerequisites

  • Faucet installed and running (faucet serve) — see Getting Started
  • An admin account created (faucet admin create)
  • An Oracle Database instance (12c through 26ai) with at least one table
  • No Oracle Instant Client required -- Faucet uses a pure-Go driver

Step 1: Connect Oracle to Faucet

The DSN format for Oracle:

oracle://username:password@host:port/service_name

Via CLI

bash
faucet db add \
  --name mydb \
  --driver oracle \
  --dsn "oracle://appuser:secret@localhost:1521/XEPDB1"

Via API

bash
TOKEN=$(curl -s http://localhost:8080/api/v1/system/admin/session \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","password":"changeme123"}' \
  | jq -r '.session_token')

curl -X POST http://localhost:8080/api/v1/system/service \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "mydb",
    "driver": "oracle",
    "dsn": "oracle://appuser:secret@localhost:1521/XEPDB1"
  }'

Via Admin UI

  1. Open http://localhost:8080/admin
  2. Navigate to Services
  3. Click Add Service
  4. Select driver: Oracle
  5. Enter the service name and DSN
  6. Click Save

Step 2: Verify the Connection

bash
faucet db test mydb

Or list tables via the API:

bash
curl http://localhost:8080/api/v1/mydb/_table \
  -H "Authorization: Bearer $TOKEN"

Expected response:

json
{
  "resource": [
    {"name": "EMPLOYEES"},
    {"name": "DEPARTMENTS"},
    {"name": "PRODUCTS"}
  ]
}

Note: Oracle table and column names are typically uppercase.

Step 3: Query Your Data

List all records

bash
curl "http://localhost:8080/api/v1/mydb/_table/EMPLOYEES?limit=10" \
  -H "Authorization: Bearer $TOKEN"

Filter records

bash
curl "http://localhost:8080/api/v1/mydb/_table/EMPLOYEES?filter=DEPARTMENT_ID%20%3D%2010" \
  -H "Authorization: Bearer $TOKEN"

Select specific fields

bash
curl "http://localhost:8080/api/v1/mydb/_table/EMPLOYEES?fields=FIRST_NAME,LAST_NAME,EMAIL" \
  -H "Authorization: Bearer $TOKEN"

Paginate

bash
curl "http://localhost:8080/api/v1/mydb/_table/EMPLOYEES?limit=10&offset=0&order=HIRE_DATE%20DESC" \
  -H "Authorization: Bearer $TOKEN"

Count records

bash
curl "http://localhost:8080/api/v1/mydb/_table/EMPLOYEES?include_count=true" \
  -H "Authorization: Bearer $TOKEN"

Step 4: Insert, Update, and Delete

Insert a record

bash
curl -X POST http://localhost:8080/api/v1/mydb/_table/EMPLOYEES \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"resource": [{"FIRST_NAME": "Jane", "LAST_NAME": "Smith", "EMAIL": "jsmith"}]}'

Note: Oracle does not support PostgreSQL-style RETURNING clauses, so the response echoes the submitted records rather than server-generated values (such as sequences or identity columns). Use a subsequent GET to retrieve auto-generated IDs.

Update a record

bash
curl -X PATCH "http://localhost:8080/api/v1/mydb/_table/EMPLOYEES?ids=207" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"LAST_NAME": "Johnson"}'

Delete a record

bash
curl -X DELETE "http://localhost:8080/api/v1/mydb/_table/EMPLOYEES?ids=207" \
  -H "Authorization: Bearer $TOKEN"

Oracle-Specific Notes

Schema (Owner)

In Oracle, the schema is the same as the database user (owner). By default, Faucet uses the connected user's schema. To query tables owned by a different user:

bash
faucet db add \
  --name hrdb \
  --driver oracle \
  --dsn "oracle://appuser:secret@localhost:1521/XEPDB1" \
  --schema HR

Service name vs. SID

Oracle databases are identified by either a service name or a SID. The DSN format uses service name by default:

oracle://user:pass@host:1521/SERVICE_NAME

For SID-based connections, use the SID parameter:

oracle://user:pass@host:1521?SID=ORCL

Stored procedures

Faucet can execute Oracle stored procedures:

bash
curl -X POST http://localhost:8080/api/v1/mydb/_proc/UPDATE_SALARY \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"params": {"EMP_ID": 100, "NEW_SALARY": 75000}}'

Oracle procedures are invoked using PL/SQL BEGIN ... END; blocks. Procedures that only perform DML (no result sets) return an empty result.

Pagination

Faucet uses Oracle 12c+ OFFSET ... ROWS FETCH NEXT ... ROWS ONLY syntax for pagination. This requires Oracle Database 12c (12.1) or later. Tested through Oracle 26ai.

Supported features

FeatureSupported
Schema introspectionYes
RETURNING clauseNo
Upsert (MERGE)No
Stored proceduresYes
ViewsYes
Parameter style:1, :2, :3
Default schemaCurrent user
PaginationOFFSET/FETCH (12c+)

Docker for local development

Run Oracle Database Express Edition locally with Docker:

bash
docker run -e ORACLE_PWD=YourStrong!Passw0rd \
  -p 1521:1521 --name oracle-xe \
  -d container-registry.oracle.com/database/express:latest

Wait for the database to start (this can take a few minutes), then connect:

bash
faucet db add \
  --name localdb \
  --driver oracle \
  --dsn "oracle://system:YourStrong!Passw0rd@localhost:1521/XEPDB1"

Troubleshooting

"ORA-01017: invalid username/password"

Check your username and password. Oracle passwords are case-sensitive. Ensure the user has appropriate permissions (CONNECT and SELECT privileges at minimum).

"ORA-12514: TNS:listener does not currently know of service requested"

The service name in your DSN doesn't match any registered service. Verify the service name with:

sql
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'service_names';

"ORA-12541: TNS:no listener"

Oracle's listener isn't running on the specified host/port. Check that the Oracle listener is started and listening on port 1521 (default).

"connection refused"

Oracle isn't running, the port is wrong, or a firewall is blocking the connection. Verify the host, port, and network connectivity.

Password with special characters

If your password contains @, #, %, or other URL-special characters, URL-encode them in the DSN:

bash
# Password: Pa@ss#1 → Pa%40ss%231
oracle://user:Pa%40ss%231@localhost:1521/XEPDB1

What's Next

Released under the MIT License.