Sybase SQL Anywhere to PostgreSQL Migration

SQLines tools can help you transfer data, convert database schema (DDL), views, stored procedures, functions, triggers, queries and SQL scripts from SAP Sybase SQL Anywhere, Sybase Adaptive Server Anywhere (ASA) to PostgreSQL (Postgres).

Databases:

  • SAP Sybase SQL Anywhere 17, 16, 12, 11, 10, 9 and 5
  • PostgreSQL 18.x, 17.x, 16.x, 15.x, 14.x, 13.x, 12.x, 11.x, 10.x and 9.x

Migration Reference

SQL Language Elements

Operators:

Sybase SQL Anywhere PostgreSQL
1 str1 || str2 || ... String concatenation, NULLs ignored CONCAT(str1, str2, ...) str1 || str2 || ...

Data Types

Date and time data types:

Sybase SQL Anywhere PostgreSQL
1 DATE Date (year, month and day) DATE
2 DATETIME Date and time with fraction TIMESTAMP
3 DATETIMEOFFSET Date and time with fraction and time zone TIMESTAMP WITH TIME ZONE
4 SMALLDATETIME Date and time with fraction TIMESTAMP
5 TIME Time (hour, minute, second and fraction) TIME
6 TIMESTAMP Date and time with fraction (microseconds) TIMESTAMP(p)
7 TIMESTAMP WITH TIME ZONE Date and time with fraction and time zone TIMESTAMP WITH TIME ZONE

Numeric data types:

Sybase SQL Anywhere PostgreSQL
1 BIGINT 64-bit integer BIGINT
2 DECIMAL(p,s), DEC(p,s) Fixed point number DECIMAL(p,s), DEC(p,s)
3 DOUBLE [PRECISION] Double-precision floating-point number DOUBLE PRECISION
4 FLOAT(p) Floating-point number DOUBLE PRECISION
5 INTEGER, INT 32-bit integer INTEGER, INT
6 MONEY Monetary data MONEY
7 NUMERIC(p,s) Fixed point number NUMERIC(p,s)
8 REAL Single-precision floating-point number REAL
9 SMALLINT 16-bit integer SMALLINT
10 SMALLMONEY Monetary data, ⇐ million currency units MONEY
11 TINYINT 8-bit unsigned integer, 0 to 255 SMALLINT
12 UNSIGNED BIGINT 64-bit unsigned integer NUMERIC(20)
13 UNSIGNED INT 32-bit unsigned integer NUMERIC(10)
14 UNSIGNED SMALLINT 16-bit unsigned integer NUMERIC(5)
15 UNSIGNED TINYINT 8-bit unsigned integer NUMERIC(3)

Converting data types:

Sybase SQL Anywhere PostgreSQL
1 BINARY(n) Variable-length binary string, 1 ⇐ n ⇐ 32767 BYTEA
2 BINARY VARYING(n) Variable-length binary string, 1 ⇐ n ⇐ 32767 BYTEA
3 CHAR(n), CHARACTER(n) Fixed-length string, 1 ⇐ n ⇐ 32767 CHAR(n), CHARACTER(n)
4 IMAGE Binary data, ⇐ 2G BYTEA
5 LONG BINARY Binary data, ⇐ 2G BYTEA
6 LONG BIT VARYING Bit array data, ⇐ 2G BYTEA
7 LONG NVARCHAR UTF-8 character data, ⇐ 2G TEXT
8 LONG VARBIT Bit array data, ⇐ 2G BYTEA
9 LONG VARCHAR Character data, ⇐ 2G TEXT
10 NCHAR(n) Fixed-length UTF-8 string, 1 ⇐ n ⇐ 32767 CHAR(n)
11 NTEXT UTF-8 character data, ⇐ 2G TEXT
12 NVARCHAR(n) Variable-length UTF-8 string, 1 ⇐ n ⇐ 32767 VARCHAR(n)
13 TEXT Character data, ⇐ 2G TEXT
14 VARBINARY(n) Variable-length binary string, 1 ⇐ n ⇐ 32767 BYTEA
15 VARCHAR(n) Variable-length string, 1 ⇐ n ⇐ 32767 VARCHAR(n)

Other data types:

Sybase SQL Anywhere PostgreSQL
1 BIT 0, 1 or NULL BOOLEAN, BOOL
2 BIT VARYING(n) Variable-length bit array, 1 ⇐ n ⇐ 32767 BIT VARYING(n)
3 UNIQUEIDENTIFIER 16-byte GUID (UUID) data CHAR(16)
4 UNIQUEIDENTIFIERSTR GUID (UUID) data in string format UUID
5 VARBIT(n) Variable-length bit array, 1 ⇐ n ⇐ 32767 VARBIT(n)
6 XML XML data XML

CREATE TABLE Statement

Converting table definitions:

Sybase SQL Anywhere PostgreSQL
1 DEFAULT AUTOINCREMENT Autoincrement column GENERATED BY DEFAULT AS IDENTITY
2 AUTOINCREMENT on DECIMAL and NUMERIC columns IDENTITY on integer columns only
3 DEFAULT TIMESTAMP Auto-updated timestamp column DEFAULT CLOCK_TIMESTAMP() and update trigger

INSERT Statement

Converting SQL INSERT statement:

Sybase SQL Anywhere PostgreSQL
1 ON EXISTING UPDATE Update duplicates on insert ON CONFLICT ... DO UPDATE SET ...

CREATE PROCEDURE Statement

Converting stored procedures:

Sybase SQL Anywhere PostgreSQL
1 CREATE ORE REPLACE PROCEDURE name CREATE OR REPLACE PROCEDURE name
2 IN | OUT | INOUT param datatype DEFAULT exp IN | OUT | INOUT param datatype DEFAULT exp
3 () required when no parameters () required when no parameters
4 RESULT(col datatype, ...) Result set columns Defined by result set query and REFCURSOR
5 Standalone SELECT Return result set OPEN cursor FOR SELECT

For further information, see Conversion of Procedural Statements.

CREATE FUNCTION Statement

Converting user-defined functions:

Sybase SQL Anywhere PostgreSQL
1 CREATE FUNCTION name CREATE OR REPLACE FUNCTION name
2 (IN param datatype(length) DEFAULT default, …) (IN param datatype(length) DEFAULT default, …)
3 RETURNS datatype(len) RETURNS datatype(len)

For further information, see Conversion of Procedural Statements.

Procedural SQL Statements

Cursor declaration and operations:

Sybase SQL Anywhere PostgreSQL
1 FOR rec CURSOR FOR SELECT ... DO ... END FOR Cursor loop FOR rec IN SELECT ... LOOP ... END LOOP

Flow-of-control statements:

Sybase SQL Anywhere PostgreSQL
1 IF … THEN … ELSEIF … ELSE … END IF IF statement IF … THEN … ELSEIF … ELSE … END IF

Temporary tables:

Sybase SQL Anywhere PostgreSQL
1 DECLARE LOCAL TEMPORARY TABLE name (columns) CREATE TEMPORARY TABLE name (columns)
2 ON COMMIT DELETE ROW | PRESERVE ROWS ON COMMIT DELETE ROW | PRESERVE ROWS
3 NOT TRANSACTIONAL Always transactional

Error handling:

Sybase SQL Anywhere PostgreSQL
1 RAISERROR error_num text Raise an error RAISE EXCEPTION '%', text USING ERRCODE = error_num

Other statements:

Sybase SQL Anywhere PostgreSQL
1 MESSAGE text TYPE type TO destination Send a message RAISE NOTICE '%', text