+ All Categories
Home > Documents > Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL...

Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL...

Date post: 05-Jun-2018
Category:
Upload: dangquynh
View: 244 times
Download: 1 times
Share this document with a friend
80
Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. PGCon 2008 Porting Oracle Applications to PostgreSQL: 1 / 80
Transcript
Page 1: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Porting Oracle Applications to PostgreSQL

Peter Eisentraut, credativ GmbH / credativ Ltd.

PGCon 2008

Porting Oracle Applications to PostgreSQL: 1 / 80

Page 2: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Disclaimers

This presentation was written by a PostgreSQL expert, not anOracle expert.

Both Oracle and PostgreSQL are diverse, complex, andmoving targets.

Both Oracle and PostgreSQL are (probably) Turing-complete,so almost anything is “possible”, but we are looking forreasonable options.

Porting Oracle Applications to PostgreSQL: 2 / 80

Page 3: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

You Will See . . .

Porting projects are hard.

Compatibility and compatibility layers are an illusion.

It might be better not to do it.

But success can be very rewarding.

Porting Oracle Applications to PostgreSQL: 3 / 80

Page 4: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Outline

1 Porting the SQL

2 Porting Tools

3 PL/SQL vs. PL/pgSQL

4 Interfaces

5 Project Management

Porting Oracle Applications to PostgreSQL: 4 / 80

Page 5: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Outline

1 Porting the SQL

2 Porting Tools

3 PL/SQL vs. PL/pgSQL

4 Interfaces

5 Project Management

Porting Oracle Applications to PostgreSQL: 5 / 80

Page 6: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Syntax

Identifiers Oracle case folds to upper case, PostgreSQL to lowercase. Big trouble if you mix quoted and unquotedidentifiers.

Column aliases SELECT foo [AS] bar — Most Oracleapplications omit the AS, but PostgreSQL requires it.Fixed in PostgreSQL 8.4.

MINUS Change to EXCEPT.

SQL key words Usually not a big problem, but should be kept inmind.

“FROM dual” Easy to work around (or use orafce).

Porting Oracle Applications to PostgreSQL: 6 / 80

Page 7: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Table Definition

The usual features are mostly the same: columns, constraints,defaults.

Data types are more work; see below.

No fancy features like “table of type”.

Porting Oracle Applications to PostgreSQL: 7 / 80

Page 8: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Data Types: General

Both Oracle and PostgreSQL support plenty ofSQL-conforming data types.

But usually the nonconforming ones are in wider use.

Thin compatibility layers can usually help, but that will makeyour PostgreSQL application unpretty.

A big search-and-replace is usually in order.

Porting Oracle Applications to PostgreSQL: 8 / 80

Page 9: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Data Types: Specifics

varchar2 → varchar or text

clob, long → varchar or text

nchar, nvarchar2, nclob → (varchar or text)

number → numeric or bigint or int or smallint or doubleprecision or real (bug potential)

binary float/binary double → real/double precision

blob, raw, long raw → bytea (additional porting required)

date → date or timestamp

Porting Oracle Applications to PostgreSQL: 9 / 80

Page 10: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Null Values

Infamous Oracle behavior: NULL = ’’

Consequently, ’’ = ’’ is not true

Completely weird and inconsistent

Usually, your data will just disappear in PostgreSQL

transform_null_equals does not help here

If your application relies on any of this, you are in trouble.

Porting Oracle Applications to PostgreSQL: 10 / 80

Page 11: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Functions: General

Function compatibility is a bottomless pit.

PostgreSQL (+ orafce) supports many Oracle compatibilityfunctions.

It’s easy to write your own.

Only the special syntax is trouble.

Porting Oracle Applications to PostgreSQL: 11 / 80

Page 12: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Functions: Compatibility

For example, the following common functions are supported byPostgreSQL as well:

substr

to char

nvl, nullif (orafce)

Porting Oracle Applications to PostgreSQL: 12 / 80

Page 13: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Functions: Specifics

Manual work required here:

sysdate → current_timestamp or localtimestamp

Porting Oracle Applications to PostgreSQL: 13 / 80

Page 14: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Functions: decode

DECODE(expr, search, expr[, search, expr...] [, default])

becomes

CASE WHEN expr THEN search .. ELSE default END

Porting Oracle Applications to PostgreSQL: 14 / 80

Page 15: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Default Parameters: Overview

PostgreSQL supports neither default values for parameters nornamed parameters in function calls.

Oracle applications make ample use of both.

Porting Oracle Applications to PostgreSQL: 15 / 80

Page 16: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Default Parameters: The Easy Case

CREATE FUNCTION foo (a int, b int, c int = 0) ...

becomes

CREATE FUNCTION foo (a int, b int, c int) ...

CREATE FUNCTION foo (a int, b int) ...AS $$ SELECT foo(a, b, 0) $$;

Porting Oracle Applications to PostgreSQL: 16 / 80

Page 17: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Default Parameters: The Hard Case

CREATE FUNCTION foo (a int, b int = 5, c int = 0) ...

This is only callable with named parameters.

PostgreSQL doesn’t support this.

You will have to change your client application.

Your project time will double.

Porting Oracle Applications to PostgreSQL: 17 / 80

Page 18: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Default Parameters: Conclusion

Approx. 97% of applications to be ported contain issues likethis.

Client code must be reworked.

Adding this support in PostgreSQL would be a great feature.

Porting Oracle Applications to PostgreSQL: 18 / 80

Page 19: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Sequences: Creating

Sequences are somewhat compatible . . .

Change NOCACHE to CACHE 1 (or omit).

MAXVALUE 9999999999999999999999999 needs to bereduced.

Don’t rely on the caching behavior.

Porting Oracle Applications to PostgreSQL: 19 / 80

Page 20: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Sequences: Using

Oracle syntax: sequence_name.nextval

PostgreSQL syntax: nextval(’sequence_name’)

Search-and-replace; but direct sequence calls are rare.

Porting Oracle Applications to PostgreSQL: 20 / 80

Page 21: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Outer Joins: Overview

PostgreSQL only supports the SQL-standard outer join syntax.

Oracle supports it since version 9.

Most Oracle code uses the old, Oracle-specific syntax.

Porting is usually straightforward, but requires manual work.

Set up test queries to catch porting mistakes.

Porting Oracle Applications to PostgreSQL: 21 / 80

Page 22: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Outer Joins: Simple Example

SELECT * FROM a, b WHERE a.x = b.y(+)

becomes

SELECT * FROM a LEFT JOIN b ON a.x = b.y

Porting Oracle Applications to PostgreSQL: 22 / 80

Page 23: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Outer Joins: Complex Example

SELECT ...FROM A, B, CWHERE A.A_ID (+) = B.A_IDAND C.C_KEY(+) = B.C_KEY

becomes

SELECT ...FROM A

RIGHT JOINB ON (A.A_ID = B.A_ID)LEFT JOINC ON (C.C_KEY = B.C_KEY)

Porting Oracle Applications to PostgreSQL: 23 / 80

Page 24: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Outer Joins: Unclear Example

SELECT ...FROM A, B, C, D, EWHERE A.A_ID = B.A_IDAND B.B_ID = C.A_ID(+)AND B.B_KEY = C.B_KEY(+)AND C.C_ID = D.C_ID(+)AND B.A_ID = E.A_ID(+)AND B.B_KEY = E.B_KEY(+)AND ’CONSTANT’ = C.X_ID(+)

What’s that???

Porting Oracle Applications to PostgreSQL: 24 / 80

Page 25: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Locking

Transaction isolation, locking, SELECT FOR UPDATE behavepretty much the same.

Oracle also defaults to read committed.

Usually, no one at the client has ever heard of concurrencyissues, so the code is likely buggy anyway.

Porting Oracle Applications to PostgreSQL: 25 / 80

Page 26: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Indexes

Basic syntax the same:CREATE INDEX name ON table (a, b)

Primary keys and unique constraints are automaticallyindexed.

Other features are implementation-specific.

You will have to re-tune the entire porting result anyway.

Porting Oracle Applications to PostgreSQL: 26 / 80

Page 27: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Optimizer Hints

Delete them

Or keep them for future investigation

Usually useless

Porting Oracle Applications to PostgreSQL: 27 / 80

Page 28: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Date Formatting

TO_CHAR is largely compatible.

Warning: PostgreSQL version is not very robust.

One-argument variant provided by orafce

NLS_DATE_FORMAT is replaced by locale settings.

Porting Oracle Applications to PostgreSQL: 28 / 80

Page 29: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Date Arithmetic

Usually, date arithmetic is easier in PostgreSQL, so consider asmall code rewrite.

orafce provides compatibility functions, such as last_day,add_months.

Oracle code often does date + int . . .

In PostgreSQL, this may become timestamp + int.This doesn’t work.Write a custom operator or rewrite the code.

Porting Oracle Applications to PostgreSQL: 29 / 80

Page 30: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Encodings

Both Oracle and PostgreSQL support the same ideas.

But everything is named differently.

Might be a good time to review the encoding and localechoices.

Porting Oracle Applications to PostgreSQL: 30 / 80

Page 31: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

NLS * vs. LC *

Approximate analogies:

NLS CALENDAR —NLS COMP lc collate = ’C’NLS CURRENCY lc monetaryNLS DATE FORMAT DateStyleNLS DATE LANGUAGE lc messages, lc time (8.4?)NLS LANG, NLS LANGUAGE LANG, client encodingNLS NCHAR —NLS NUMERIC CHARACTERS lc numericNLS SORT lc collateNLS TERRITORY LANG, lc *

Porting Oracle Applications to PostgreSQL: 31 / 80

Page 32: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

ROWNUM and ROWID

ROWNUM:

Use generate_series, or

Rewrite and apply LIMIT, or

Just handle in the client

ROWID:

Analogous to ctid

Good code should usually not use this.

That does not prevent some from trying.

Porting Oracle Applications to PostgreSQL: 32 / 80

Page 33: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

XML

(untested!)

xmltype → xml

extract → xpath

XMLELEMENT, XMLATTRIBUTES, etc. are the same.

Most functionality is different or missing in PostgreSQL.

Porting Oracle Applications to PostgreSQL: 33 / 80

Page 34: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Triggers: Declarations

Oracle uses inline trigger actions:

CREATE TRIGGER foo AFTER action ON tableAS BEGIN ... END;

becomes

CREATE OR REPLACE FUNCTION foo_tg() RETURNS TRIGGERLANGUAGE xxxAS $$ ... $$;

CREATE TRIGGER foo AFTER action ON tableEXECUTE PROCEDURE foo_tg();

Note: FOR EACH STATEMENT is the default in Oracle andPostgreSQL.

Porting Oracle Applications to PostgreSQL: 34 / 80

Page 35: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Triggers: Column-Level Triggers

Oracle supports column-level triggers:

CREATE TRIGGER foo BEFORE UPDATE OF column ON tableAS BEGIN ... END;

becomes

CREATE OR REPLACE FUNCTION foo_tg() RETURNS TRIGGERLANGUAGE xxx AS $$

BEGINIF NEW.column IS NOT DISTINCT FROM OLD.column THENRETURN NEW;

END IF;... -- normal code

END;$$;CREATE TRIGGER foo AFTER action ON table

EXECUTE PROCEDURE foo_tg();

But this doesn’t catch updates to the same value.

You will need to make a choice which behavior you need.Porting Oracle Applications to PostgreSQL: 35 / 80

Page 36: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Things That Won’t Work Directly

CONNECT BY Try contrib/tablefunc.

Materialized views Write your own wrapper.

Snapshots Write your own wrapper.

Database links Use contrib/dblink plus views.

Autonomous transactions Try dblink.

Synonyms Try views or wrapper or schema path.

Partitioning Write your own system.

Porting Oracle Applications to PostgreSQL: 36 / 80

Page 37: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Outline

1 Porting the SQL

2 Porting Tools

3 PL/SQL vs. PL/pgSQL

4 Interfaces

5 Project Management

Porting Oracle Applications to PostgreSQL: 37 / 80

Page 38: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

orafce

http://orafce.projects.postgresql.org/

Large set of Oracle compatibility functions

“dual” table

Debian and RPM packages available

Invaluable

Porting Oracle Applications to PostgreSQL: 38 / 80

Page 39: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

ora2pg

http://ora2pg.projects.postgresql.org/

Converts Oracle schema definitions

Extracts data from Oracle database for import intoPostgreSQL

Packages available

Invaluable

Porting Oracle Applications to PostgreSQL: 39 / 80

Page 40: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

TOra

http://tora.sourceforge.net/

GUI for PostgreSQL and Oracle

Contains exploration and debugging facilities for Oracle

Packages available, but usually without Oracle support

Generally a bit outdated, but good for this purpose

Porting Oracle Applications to PostgreSQL: 40 / 80

Page 41: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

DBD::Oracle

http://search.cpan.org/dist/DBD-Oracle/

Needed for ora2pg

Also helpful for test scripts etc.

Building it can be challenging

Debian and RPM packages available

Porting Oracle Applications to PostgreSQL: 41 / 80

Page 42: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Oracle Instant Client

Needed for DBD::Oracle and TOra

Also contains sqlplus

download from Oracle

Porting Oracle Applications to PostgreSQL: 42 / 80

Page 43: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Oracle Database Express Edition

Use this for testing if you have no other Oracle instance.

download from Oracle

Porting Oracle Applications to PostgreSQL: 43 / 80

Page 44: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Outline

1 Porting the SQL

2 Porting Tools

3 PL/SQL vs. PL/pgSQL

4 Interfaces

5 Project Management

Porting Oracle Applications to PostgreSQL: 44 / 80

Page 45: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

From PL/SQL to PL/pgSQL

Compatibility isn’t that great, but it’s obviously the bestchoice.

The PL/pgSQL parser is DAAB.

See also http://www.postgresql.org/docs/current/static/plpgsql-porting.html.

Porting Oracle Applications to PostgreSQL: 45 / 80

Page 46: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Function Creation

CREATE FUNCTION ... RETURN type becomesCREATE FUNCTION ... RETURNS type

Function body must be quoted (dollar quoting).

Various other details are incompatible:

LANGUAGESTRICT, STABLE, etc.

For variable declarations, DECLARE is needed in PostgreSQL.

Porting Oracle Applications to PostgreSQL: 46 / 80

Page 47: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Syntax Differences

FOR i IN REVERSE 1..10 LOOP — Order must be switchedfor PostgreSQL.

Porting Oracle Applications to PostgreSQL: 47 / 80

Page 48: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Variables

PL/SQL can distinguish column names and variable names.

PL/pgSQL replaces all matching tokens by variables.

Find a namespacing mechanism to tell apart variables,parameters, and columns.

Porting Oracle Applications to PostgreSQL: 48 / 80

Page 49: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Packages

Use schemas to group your functions.

Call syntax is about the same.

But there is no equivalent public/private mechanism.

Porting Oracle Applications to PostgreSQL: 49 / 80

Page 50: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Package Variables

Not supported by PostgreSQL

Write a wrapper based on (temporary) tables.

Porting Oracle Applications to PostgreSQL: 50 / 80

Page 51: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Cursors

Usually, you need less cursors in PostgreSQL.

CURSOR foo IS SELECT ...;

BEGINFOR x IN foo LOOP

can be simplified to

BEGINFOR x IN SELECT ... LOOP

Note: The x is defined implicitly in Oracle. In PostgreSQL, youneed to declare it.

Porting Oracle Applications to PostgreSQL: 51 / 80

Page 52: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Cursors Variables

This doesn’t work in PostgreSQL:

CURSOR foo IS SELECT ...;x foo%ROWTYPE;

BEGINFOR x IN foo LOOP

Use RECORD:

DECLARECURSOR foo IS SELECT ..;x RECORD;

BEGINFOR x IN foo LOOP

Porting Oracle Applications to PostgreSQL: 52 / 80

Page 53: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

PERFORM

In PostgreSQL, “procedure” calls must start with PERFORM. E. g.,

service.put_utl(’Error’);

becomes

PERFORM service.put_utl(’Error’);

Porting Oracle Applications to PostgreSQL: 53 / 80

Page 54: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

EXECUTE

For DDL statements, EXECUTE might be necessary. E. g.,

EXECUTE ’CREATE TABLE ’ || quote_ident(foo) || ...

Porting Oracle Applications to PostgreSQL: 54 / 80

Page 55: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Subcommits

Code that does COMMIT or ROLLBACK needs major, client-sidechanges. (Savepoints won’t usually do the job.)

Porting Oracle Applications to PostgreSQL: 55 / 80

Page 56: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Exceptions (1)

An exception rolls back all changes implicitly in PostgreSQL.

You can drop most savepoint-using code from the Oracleversion.

More complex behavior needs a redesign.

Porting Oracle Applications to PostgreSQL: 56 / 80

Page 57: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Exceptions (2)

Exception block syntax is the same.

Exception names are different.

Oracle supports user-defined exception names.

Error codes are different.

Variable SQLERRM is available.

Of course, error messages are also different.

Porting Oracle Applications to PostgreSQL: 57 / 80

Page 58: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Exceptions (3)

We use a scheme to encode exception information into themessage string:

RAISE name; ---> RAISE EXCEPTION ’name’;

Similar for error codes:

raise_application_error(12345, ’msg’);---> RAISE EXCEPTION ’+12345:msg’;

Codes can be positive or negative. Write a wrapper function.

errcode := substr(SQLERRM, 1, 6)

Porting Oracle Applications to PostgreSQL: 58 / 80

Page 59: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

No Data Found Exceptions

Oracle throws NO_DATA_FOUND exceptions for

SELECT

INSERT

UPDATE

DELETE

PostgreSQL only for:

SELECT INTO STRICT

Use IF NOT FOUND to deal with other cases.

Porting Oracle Applications to PostgreSQL: 59 / 80

Page 60: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Logging

dbms_output “package” is provided by orafce. E. g.

dbms_output.put_line(’WRONG PARAMETER: ’ || par);

Watch for interferences from null values!

Porting Oracle Applications to PostgreSQL: 60 / 80

Page 61: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Backtraces

orafce provides dbms_utility.format_call_stack()

impossible to implementdbms_utility.format_error_stack() in PostgreSQL(except by patching PL/pgSQL directly)

Porting Oracle Applications to PostgreSQL: 61 / 80

Page 62: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

What About PL/Java?

Should be compatible with SQL/JRT and Oracle

Basic functionality should work without changes

Reality is more complex

There is little or no experience with this scenario.

Porting Oracle Applications to PostgreSQL: 62 / 80

Page 63: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Outline

1 Porting the SQL

2 Porting Tools

3 PL/SQL vs. PL/pgSQL

4 Interfaces

5 Project Management

Porting Oracle Applications to PostgreSQL: 63 / 80

Page 64: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

psql/sqlplus

psql is much nicer for interactive use. :-)

sqlplus is much nicer for scripting use. :-(

With use of variables and naming conventions, sqlplus scriptscan be converted anyway.

Consider a wholesale rewrite.

Porting Oracle Applications to PostgreSQL: 64 / 80

Page 65: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Backup, Recovery

Build a new system using transaction log archiving or SQL dumps.

Porting Oracle Applications to PostgreSQL: 65 / 80

Page 66: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Setup, initdb

Works completely differently.

Forget everything you get from Oracle.

Write new setup scripts that integrate well with the operatingsystem.

Forget about tablespaces, partitioning, OS tuning, etc. untilyou have a porting result.

Porting Oracle Applications to PostgreSQL: 66 / 80

Page 67: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

JDBC

Works great, aside from SQL syntax issues

Porting Oracle Applications to PostgreSQL: 67 / 80

Page 68: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Outline

1 Porting the SQL

2 Porting Tools

3 PL/SQL vs. PL/pgSQL

4 Interfaces

5 Project Management

Porting Oracle Applications to PostgreSQL: 68 / 80

Page 69: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Testing

Have a test suite for:

functions

setup

tables/database contents

Porting Oracle Applications to PostgreSQL: 69 / 80

Page 70: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Dividing the Work

In PL/SQL-heavy applications, you can usually divide thework by function or package.

Someone needs to drive and monitor integration work.

Have a test suite.

Porting Oracle Applications to PostgreSQL: 70 / 80

Page 71: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Long-Term Maintenance

Will the original application continue to be developed?

. . . while the porting project runs?!?

How is the merging going to work?

One time ports, maintainable ports, and mergeable ports areall slightly different.

Porting Oracle Applications to PostgreSQL: 71 / 80

Page 72: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Code Formatting

Create a code formatting standard.

(This applies to any development project.)

I tend to stick with the original layout.

This is important for later updates, merges, and maintenance.

Porting Oracle Applications to PostgreSQL: 72 / 80

Page 73: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Version Control

Use version control, even if the client doesn’t.

Prefer to use your own VCS; merge later.

Porting Oracle Applications to PostgreSQL: 73 / 80

Page 74: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Beyond the SQL

Applications also contain setup and maintenance scripts.

These were typically written by old-school Oracleadministrators.

Hence completely incomprehensible and written in ksh

Half the logic usually doesn’t make sense for PostgreSQL.

Half the logic required to make PostgreSQL work will nothave been written yet.

Reserve plenty of time for dealing with this.

Porting Oracle Applications to PostgreSQL: 74 / 80

Page 75: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Legacy Code and Legacy Environments

Applications to be ported are usually very old and crufty.

This multiplies the time required to deal with them.

A lot of the code won’t compile/run on newer operatingsystems.

Half your tools won’t compile/run on the old operatingsystem.

Everything is locked down, so you can’t do anything aboutthis.

Evaluate this carefully before starting the project.

Porting Oracle Applications to PostgreSQL: 75 / 80

Page 76: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Client Participation

Almost always, the database clients will need to be adjusted.

Almost always, you need someone reachable who understandsthe code.

Clients think SQL code is a black box with a clean and simpleinterface.

In practice, a port is like a major new software release.

A port affects your entire system.

The client must be willing, able, and available to participate in theproject.

Porting Oracle Applications to PostgreSQL: 76 / 80

Page 77: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

“Josh’s Rules (of Database Contracting)”

http://blogs.ittoolbox.com/database/soup/archives/joshs-rules-of-database-contracting-17253

Learn them by heart.

Print them out.

Post them at your office door.

Quote them to the sales people.

Porting Oracle Applications to PostgreSQL: 77 / 80

Page 78: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Contribute Your Improvements

Porting projects are a great source of ideas for features andbug fixes.

Record your experiences, e. g., in the wiki.

Contribute to orafce and ora2pg.

Contribute to PL/pgSQL and PL/Java.

Porting Oracle Applications to PostgreSQL: 78 / 80

Page 79: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Coincidence?

If you need help:

Oracle Ask Tom: http://asktom.oracle.com/

PostgreSQL Ask Tom: [email protected]

Porting Oracle Applications to PostgreSQL: 79 / 80

Page 80: Porting Oracle Applications to PostgreSQL - PGCon 2018 · Porting Oracle Applications to PostgreSQL Peter Eisentraut, credativ GmbH / credativ Ltd. ... Porting is usually straightforward,

Porting the SQL Porting Tools PL/SQL vs. PL/pgSQL Interfaces Project Management

Fly Way to Conclude SQL-Themed Presentation

COMMIT;

Porting Oracle Applications to PostgreSQL: 80 / 80


Recommended