6 undeniable facts to choose conversion with Ispirer
-
Fact 1/6
Reduced costs
Migrating to a more efficient PostgreSQL database can lower operational costs by reducing hardware and software maintenance requirements, optimizing resource utilization, and lowering licensing fees.
-
Fact 2/6
Modernization and innovation
Migrating to PostgreSQL can enable the adoption of new technologies and features, unlocking new business opportunities and driving innovation.
-
Fact 3/6
Added AI precision
An AI-driven migration toolkit can automate complex tasks, reduce errors, optimize workflows, and accelerate the process, ensuring smoother transitions while minimizing costly system downtime.
-
Fact 4/6
Enhanced security
Newer databases often incorporate advanced security features like encryption, access controls, and threat detection mechanisms, providing better protection against data breaches and cyberattacks.
-
Fact 5/6
Legacy system transformation
Migrating legacy databases to modern systems can upgrade your database, making it easier to maintain, update, and extend in the long run.
-
Fact 6/6
No need for documentation
We perform the migration using the source code. There is no need for detailed documentation to begin the migration as there is in development.
Migration opportunities with Ispirer
Ispirer Ecosystem automates your migration routine to enable quick and smart transformation of any database. Double the migration speed with our comprehensive solutions.
-
With Ispirer Toolkit only
- Free InsightWays tool to analyze your Oracle database and estimate migration complexity
- Assistance in Ispirer Toolkit configuration
- Automated migration of the entire database schema, tables, SQL objects, business logic, and data
- Timely customization of the Ispirer Toolkit to maximize automation rate
- Expert support
-
With Ispirer Toolkit as a part of migration service
- Detailed analysis of your Oracle database and tailored migration roadmap
- Migration of data and database schema, including SQL objects, business logic, and tables
- Team of database conversion experts and a dedicated Project Manager
- Regular updates on the project status
- Post-migration refinement and testing
Ispirer Ecosystem for automated migration
Ispirer Toolkit is a solution for automated heterogeneous database migration. Using it, you can transfer tables and data, stored procedures, functions, packages, views, and triggers. This solution is based on an intelligent proprietary algorithm that analyzes data types, relationships between objects, reserved words, and code structures that do not have equivalents in a target technology.
AI-powered SQLWays
Migrate Smarter. Evolve Faster
Over 400 migration directions- PostgreSQL
- Oracle
- AlloyDB
- SQL Server
- Informix
- MySQL
- DB2
- MariaDB
- Sybase ASE
- PostgreSQL
- Oracle
- AlloyDB
- SQL Server
- Informix
- MySQL
- DB2
- MariaDB
- Sybase ASE
- MSSQL
- COBOL
- Azure
- Progress 4GL
- SAP
- PowerBulder
- .NET
- Delphi
- MSSQL
- COBOL
- Azure
- Progress 4GL
- SAP
- PowerBulder
- .NET
- Delphi
Cloud migration software
The toolkit facilitates seamless database migration to both on-premises and cloud environments, with particular expertise in migrating to Google Cloud SQL, AWS RDS, and Azure Database for PostgreSQL and MySQL.
Migration details overview
-
Ispirer Toolkit automates
Ispirer Toolkit automates the entire migration of database objects from Oracle to PostgreSQL
Both conversion with connection to the source database, as well as conversion of files containing PL/SQL scripts are possible. The first option is most recommended, as the tool will get all the required information about object dependences directly from the database. Ispirer Toolkit can migrate the following objects: tables, views, functions, procedures, packages (specification and body), triggers, sequences, collection and object types. As a result, each separate database object is converted to its equivalent in PostgreSQL.
If you have your own applications, the Embedded SQL and Database APIs can be converted using either Ispirer Toolkit or Ispirer Service. They will be able to work with your new PostgreSQL database.
-
Table and Data Conversion
Ispirer Toolkit converts tables with all related objects
Indexes, referential integrity constraints, and data are migrated to the target PostgreSQL database. All Oracle native data types are converted to the PostgreSQL equivalents.
If necessary, the user can change the default settings of data type mapping.
-
Procedure, Function and Trigger Conversion
SQL objects
Oracle user procedures and functions are converted to stored procedures and functions written in PostgreSQL syntax, depending on the version of the target database. Packages are converted to a separate set of objects - procedures and functions.
Package-level variables and constants are taken into account
They are migrated to tables that store the actual values, and a set of functions that define and get values of those tables.
Ispirer Toolkit automatically migrates Oracle triggers to the trigger function, and the trigger itself to the PostgreSQL database
Oracle trigger logic is moved to the trigger function as well. The tool then generates a trigger that calls this trigger function.
-
Built-in Functions and Procedures Conversion
Oracle built-in functions and procedures are converted to their equivalents in PostgreSQL
If there is none, the tool will try to convert the functions to PostgreSQL expressions. They will emulate the same behavior or generate a user-defined function that will work the same way as in the Oracle database.
-
Working with Collections and their Methods
Ispirer Toolkit supports collection conversion of all three types: Associative array, Nested table, Variable-size array (varray)
They are converted to a PostgreSQL table. Then a set of user-defined functions is generated. This allows to work with values in such tables.
-
Oracle Supplied PL/SQL Package Conversion
Ispirer Toolkit supports conversion of some Supplied PL/SQL Packages, such as UTL_FILE, DBMS_LOB and others
The list can be expanded depending on the requirements of your conversion project.
Migrate your data without limits!
Need migrations with near-zero downtime and reliable recovery?
Our automated migration service handles everything - without middleware, without altering your source database, and without requiring unique columns.
-
Read-only access to your data
-
Change Data Capture (CDC)
-
Customization to handle any data type
-
Migration of BLOB at full speed
-
Custom mapping options
-
Horizontal scalability
Move your migration project to the next level. Migrate logic from database to application
Ispirer has a solution to unlock the full potential of your database. Our team helps you to move business logic to an application layer seamlessly to advance the database performance.
Source database
- Oracle
ODBC
Files with business logic SQL code
- Oracle
Seamless integration, limitless possibilities!
Application target Code
- Java
- JDBC
- Spring
- Hibernate
-
Unlock agility: shift your database logic to the application layer!
Transform faster, scale smarter—see how moving from database to application layer drives real results. Let’s modernize it together.
Check out how Ispirer Toolkit migrates databases efficiently, minimizing the need for manual corrections
Oracle to PostgreSQL migration service overview
More than 2K users use this way to
successfully convert their database
Start
Assessment
- Obtaining access
- Project discussion
- Making migration plan
- Creating SOW
Migration
- DB schema conversion
- Data migration testing
- Data integrity testing
- APP changes: API, ESQL, logic shift to APP layer
Manual review & corrections
- Manual corrections
- Internal testing
Functional testing
- Creating snapshots with data
- Testing APP and DB on snapshots
- Fixing all logical issues
Performance testing
- Performance testing
- Converted code review
- Code refactoring
- Extra code optimization
Data migration
- Prod data migration
Cutover
- Switching DB and APP
- Providing user access
- System startup
Oracle Database to PostgreSQL Migration Challenges and How Ispirer Toolkit Overcomes Them
| Aspect | Oracle Database | PostgreSQL | Ispirer |
|---|---|---|---|
| Licensing | Enterprise Edition per processor, Standard Edition per processor. Annual support costs | Completely free and open source under PostgreSQL License with no licensing fees or usage limitations | Provides project-based or time-boxed licenses |
| Ownership | Owned by Oracle Corporation as a proprietary commercial product | Open source project maintained by PostgreSQL Global Development Group | Ispirer Systems, LLC |
| SQL Language | Uses PL/SQL (Procedural Language/SQL) with robust procedural capabilities and proprietary extensions | Uses standard SQL with PL/pgSQL procedural language and supports multiple procedural languages including PL/Python, PL/Perl, and PL/Tcl | Converts SQL code to PL/pgSQL automatically, including packages, stored procedures, functions, and triggers; handles Oracle-specific constructs and syntax differences |
| Basic Data Types | Uses NUMBER with precision and scale for numeric data; DATE for dates; XMLTYPE for XML; supports FLOAT as NUMBER subtype, string datatypes | Extensive data types including NUMERIC, INTEGER variants, native arrays, JSON, JSONB, UUID, geometric types, and custom user-defined types | Provides global and local data type mapping engines; automatically maps Oracle types (NUMBER, DATE, XMLTYPE, etc.) to optimal PostgreSQL equivalents (NUMERIC, TIMESTAMP, XML, etc.) and others |
| Indexing Options | B-tree (default), bitmap indexes for low-cardinality columns, function-based indexes, domain indexes, reverse key indexes | B-tree (default), GIN, GiST, BRIN, SP-GiST indexes; supports partial/conditional indexes and specialized indexing for various data types | Automatically recreates indexes during migration; translates Oracle index structures to PostgreSQL equivalents; drops unsupported Oracle-specific options |
Conversion Samples of Oracle to PostgreSQL
Ispirer Toolkit analyzes all object dependencies during the conversion process and provides not only line-by-line conversion, but resolves type conversions as well. The software understands and transforms the necessary inheritance dependencies. It parses the entire source code, builds an internal tree with all the information about the objects, and uses it in the migration process.
-
Oracle Collections conversion:
Oracle
- CREATE TYPE employee AS OBJECT (
- id NUMBER,
- Name VARCHAR(300)
- );
- CREATE TYPE employees_tab IS TABLE OF employee;
- CREATE OR REPLACE PROCEDURE hire(EMPLOYEES in out employees_tab, id NUMBER, Name VARCHAR) AS
- NEW_EMPLOYEES employees_tab := employees_tab();
- BEGIN
- EMPLOYEES.Extend(1);
- EMPLOYEES(EMPLOYEES.count) := employee(id, Name);
- FOR i IN EMPLOYEES.first..EMPLOYEES.last
- LOOP
- INSERT INTO emp_tab values (EMPLOYEES(i).id, EMPLOYEES(i).Name);
- END LOOP;
- INSERT INTO EMP_TAB SELECT * FROM TABLE(EMPLOYEES);
- NEW_EMPLOYEES.Extend(EMPLOYEES.count);
- NEW_EMPLOYEES.Delete;
- END;
→ PostgreSQL
- CREATE TYPE employee AS(id NUMERIC,Name VARCHAR(300));
- -- CREATE TYPE employees_tab IS TABLE OF employee;
- CREATE OR REPLACE PROCEDURE hire(INOUT EMPLOYEES employee[] , id NUMERIC, Name VARCHAR)
- LANGUAGE plpgsql
- AS $$
- DECLARE
- NEW_EMPLOYEES employee[] default array[]:: employee[];
- BEGIN
- EMPLOYEES[coalesce(array_length(EMPLOYEES,1),0)+1] := null;
- EMPLOYEES[coalesce(array_length(EMPLOYEES,1),0)] := row(id,Name);
- FOR i IN array_lower(EMPLOYEES,1) .. array_upper(EMPLOYEES,1)
- LOOP
- INSERT INTO emp_tab values(EMPLOYEES[i].id, EMPLOYEES[i].Name);
- END LOOP;
- INSERT INTO EMP_TAB SELECT * FROM UNNEST(EMPLOYEES);
- for i in 1 .. coalesce(array_length(EMPLOYEES,1),0) loop
- NEW_EMPLOYEES[coalesce(array_length(NEW_EMPLOYEES,1),0)+1] := null;
- end loop;
- NEW_EMPLOYEES := array[]:: employee[];
- END; $$;
-
Package objects transformation:
Oracle
- CREATE OR REPLACE EDITIONABLE PACKAGE BODY "COMMON_PKG" AS
- CUSTOMER_ID NUMBER(10,0);
- TYPE VARCHAR2_AARAY IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
- ADDRES_LST VARCHAR2_AARAY;
- PROCEDURE PREPARE_CUSTOMER_ADRESSS_BY_ID(CITY_NAME VARCHAR2, CUSTTYPE_ID VARCHAR2)
- IS
- CUR_ADDR VARCHAR2(500);
- CUSTM_ID NUMBER;
- v_int number;
- V_RES DBMS_UTILITY.lname_array;
- l_clob clob;
- cursor cus_addr(cur_id number) is select address from customer where cust_id = cur_id or cust_id <5;
- BEGIN
- l_clob := '';
- select CUST_ID into CUSTM_ID
- from customer
- where CITY = CITY_NAME and CUST_TYPE_CD = CUSTTYPE_ID and ROWNUM <= 1;
- open cus_addr(CUSTM_ID);
- fetch cus_addr into CUR_ADDR;
- WHILE(cus_addr%found)
- loop
- l_clob := l_clob || CUR_ADDR||',';
- fetch cus_addr into CUR_ADDR;
- end loop;
- if cus_addr%isopen then
- close cus_addr;
- end if;
- dbms_output.put_line( rtrim(l_clob,',') );
- END;
- PROCEDURE GET_FIST_NAME_OF_EMPLOYEE_BY_START_DATE(STRT_DATE DATE) is
- EMPLOYEE_REC EMPLOYEE%ROWTYPE;
- cursor cur_start_date is select * from EMPLOYEE;
- BEGIN
- open cur_start_date;
- fetch cur_start_date into EMPLOYEE_REC;
- WHILE(cur_start_date%found)
- loop
- if EMPLOYEE_REC.START_DATE < STRT_DATE THEN
- goto loop_again;
- end if;
- DBMS_OUTPUT.PUT_LINE(EMPLOYEE_REC.FIRST_NAME || ' ' ||EMPLOYEE_REC.LAST_NAME );
- <<loop_again>>
- fetch cur_start_date into EMPLOYEE_REC;
- end loop;
- if cur_start_date%isopen then
- close cur_start_date;
- end if;
- END;
- END COMMON_PKG;
→ PostgreSQL
- CREATE SCHEMA IF NOT EXISTS COMMON_PKG;
- -- TYPE VARCHAR2_AARAY IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
- DROP TYPE IF EXISTS COMMON_PKG.GL_VAR_TYPE CASCADE;
- CREATE type COMMON_PKG.GL_VAR_TYPE
- as(CUSTOMER_ID BIGINT,
- ADDRES_LST VARCHAR(50)[]);
- CREATE OR REPLACE FUNCTION COMMON_PKG.INIT_GL_VAR()
- RETURNS VOID LANGUAGE plpgsql
- AS $$
- BEGIN
- CREATE TEMPORARY TABLE COMMON_PKG_GL_VAR AS SELECT(array[]:: VARCHAR(50)[]):: COMMON_PKG.GL_VAR_TYPE AS SWV_GL_VAR_VAL;
- RETURN;
- EXCEPTION
- WHEN SQLSTATE '42P07' THEN
- NULL;
- END; $$;
- CREATE OR REPLACE FUNCTION COMMON_PKG.GET_GL_VAR()
- RETURNS COMMON_PKG.GL_VAR_TYPE LANGUAGE plpgsql
- AS $$
- DECLARE
- SWV_GL_VAR COMMON_PKG.GL_VAR_TYPE;
- BEGIN
- RETURN(select SWV_GL_VAR_VAL:: COMMON_PKG.GL_VAR_TYPE from COMMON_PKG_GL_VAR);
- EXCEPTION
- WHEN OTHERS THEN
- PERFORM COMMON_PKG.INIT_GL_VAR();
- RETURN(select SWV_GL_VAR_VAL:: COMMON_PKG.GL_VAR_TYPE from COMMON_PKG_GL_VAR);
- END; $$;
- CREATE OR REPLACE PROCEDURE COMMON_PKG.SET_GL_VAR(SWP_GLVAR COMMON_PKG.GL_VAR_TYPE)
- LANGUAGE plpgsql
- AS $$
- BEGIN
- UPDATE COMMON_PKG_GL_VAR SET SWV_GL_VAR_VAL = SWP_GLVAR;
- END; $$;
- CREATE OR REPLACE PROCEDURE COMMON_PKG.GET_CUSTID_BY_PARAMS(CITY_NAME VARCHAR,
- CUST_ID_CD VARCHAR,
- OUT CUST_ID NUMERIC)
- LANGUAGE plpgsql
- AS $$
- DECLARE
- SWV_GL_VAR COMMON_PKG.GL_VAR_TYPE DEFAULT COMMON_PKG.GET_GL_VAR();
- IN_ID BIGINT;
- BEGIN
- select CUST_ID into STRICT IN_ID
- from CUSTOMER
- where CITY = CITY_NAME and CUST_TYPE_CD = CUST_ID_CD LIMIT 1;
- CUST_ID := IN_ID;
- END; $$;
- CREATE OR REPLACE PROCEDURE COMMON_PKG.PREPARE_CUSTOMER_ADRESSS_BY_ID(CITY_NAME VARCHAR, CUSTTYPE_ID VARCHAR)
- LANGUAGE plpgsql
- AS $$
- DECLARE
- SWV_GL_VAR COMMON_PKG.GL_VAR_TYPE DEFAULT COMMON_PKG.GET_GL_VAR();
- CUR_ADDR VARCHAR(500);
- CUSTM_ID NUMERIC;
- v_int NUMERIC;
- V_RES VARCHAR(4000)[] default array[]:: VARCHAR(4000)[];
- l_clob TEXT;
- CUS_ADDR cursor(cur_id NUMERIC) FOR select ADDRESS from CUSTOMER where cust_id = cur_id or cust_id < 5;
- BEGIN
- l_clob := '';
- select CUST_ID into STRICT CUSTM_ID
- from CUSTOMER
- where CITY = CITY_NAME and CUST_TYPE_CD = CUSTTYPE_ID LIMIT 1;
- open CUS_ADDR(CUSTM_ID);
- fetch CUS_ADDR into CUR_ADDR;
- WHILE FOUND
- loop
- l_clob := CONCAT(l_clob,CUR_ADDR,',');
- fetch CUS_ADDR into CUR_ADDR;
- end loop;
- if EXISTS(SELECT 1 FROM pg_cursors WHERE NAME ilike 'CUS_ADDR') then
- close CUS_ADDR;
- end if;
- RAISE NOTICE '%',NULLIF(rtrim(l_clob,','),'');
- END; $$;
- CREATE OR REPLACE PROCEDURE COMMON_PKG.GET_FIST_NAME_OF_EMPLOYEE_BY_START_DATE(STRT_DATE TIMESTAMP)
- LANGUAGE plpgsql
- AS $$
- DECLARE
- SWV_GL_VAR COMMON_PKG.GL_VAR_TYPE DEFAULT COMMON_PKG.GET_GL_VAR();
- EMPLOYEE_REC EMPLOYEE%ROWTYPE;
- CUR_START_DATE cursor FOR select * from EMPLOYEE;
- BEGIN
- open CUR_START_DATE;
- fetch CUR_START_DATE into EMPLOYEE_REC;
- WHILE FOUND
- loop
- << loop_again >>
- BEGIN
- if EMPLOYEE_REC.START_DATE < STRT_DATE THEN
- EXIT loop_again;
- end if;
- RAISE NOTICE '%',CONCAT(EMPLOYEE_REC.FIRST_NAME,' ',EMPLOYEE_REC.LAST_NAME);
- END;
- fetch CUR_START_DATE into EMPLOYEE_REC;
- end loop;
- if EXISTS(SELECT 1 FROM pg_cursors WHERE NAME ilike 'CUR_START_DATE') then
- close CUR_START_DATE;
- end if;
- END; $$;
-
Hierarchical query conversion:
Oracle
- create or replace Procedure sp_hier_with_cte_and_rownum (configList IN varchar2)
- IS
- refcur sys_refcursor;
- BEGIN
- FOR refcur IN (
- with test as
- (select configList from dual)
- select regexp_substr(configList, '[^;]+', 1, rownum) config
- from test
- connect by level <= length (regexp_replace(configList, '[^;]+')) +1
- )
- LOOP
- dbms_output.put_line('config= '||refcur.config);
- END LOOP;
- END;
→ PostgreSQL
- create or replace Procedure sp_hier_with_cte_and_rownum(IN configList VARCHAR)
- LANGUAGE plpgsql
- AS $$
- DECLARE
- refcur REFCURSOR;
- SWV_REFCUR_rec RECORD;
- BEGIN
- FOR SWV_REFCUR_rec IN(
- WITH RECURSIVE
- test as(select configList),
- TabAl_cte AS(SELECT 1 AS LEVEL
- UNION ALL
- SELECT TabAl_cte.LEVEL+1 AS LEVEL
- FROM TabAl_cte, test
- WHERE(TabAl_cte.LEVEL+1) <= length(regexp_replace(test.configList,'[^;]+','','g'))+1)
- SELECT SWF_REGEXP_SUBSTR(test.configList,'[^;]+',1,row_number() over()) AS config
- FROM TabAl_cte,test)
- LOOP
- RAISE NOTICE '%',CONCAT('config= ',SWV_REFCUR_rec.config);
- END LOOP;
- END; $$;
-
Dynamic code conversion:
Oracle
- CREATE OR REPLACE PROCEDURE DYNAMIC_DELETE
- AS
- TAB_NAME VARCHAR2(15):='FOR_TYPE';
- TAB_COL VARCHAR2(12):='COL1';
- TAB_COL2 VARCHAR2(12):='COL2';
- COL_VALUE INTEGER:=2000;
- SQL_DELETE VARCHAR2(200);
- BEGIN
- SQL_DELETE:='DELETE '||TAB_NAME||' WHERE ' || TAB_COL2 || '=SYSDATE+5 AND ' ||TAB_COL||' < :value ';
- EXECUTE IMMEDIATE SQL_DELETE USING COL_VALUE;
- EXECUTE IMMEDIATE 'begin EXAMPLE_PROC; end;';
- END;
→ PostgreSQL
- CREATE OR REPLACE PROCEDURE DYNAMIC_DELETE()
- LANGUAGE plpgsql
- AS $$
- DECLARE
- TAB_NAME VARCHAR(15) DEFAULT 'FOR_TYPE';
- TAB_COL VARCHAR(12) DEFAULT 'COL1';
- TAB_COL2 VARCHAR(12) DEFAULT 'COL2';
- COL_VALUE INTEGER DEFAULT 2000;
- SQL_DELETE VARCHAR(200);
- BEGIN
- SQL_DELETE := 'DELETE FROM ' || TAB_NAME || ' WHERE ' || TAB_COL2 || '= LOCALTIMESTAMP+INTERVAL ''5 day'' AND ' || TAB_COL || ' <%1$L ';
- EXECUTE format(SQL_DELETE,COL_VALUE);
- EXECUTE 'DO LANGUAGE plpgsql $anonymous_block$ BEGIN CALL EXAMPLE_PROC(); END; $anonymous_block$';
- END; $$;
-
PRAGMA AUTONOMOUS_TRANSACTION conversion:
Oracle
- CREATE PROCEDURE AUTO_TEST (id_value number, text_value varchar2)
- IS
- PRAGMA AUTONOMOUS_TRANSACTION;
- BEGIN
- INSERT INTO AUTONOMOUS_EVENT (id, value)
- VALUES(id_value, text_value);
- COMMIT;
- END AUTO_TEST;
→ PostgreSQL
- CREATE EXTENSION IF NOT EXISTS dblink;
- --use superuser to run this script
- CREATE SERVER SWL_targetDBname_link FOREIGN DATA WRAPPER dblink_fdw
- OPTIONS (hostaddr '127.0.0.1', dbname 'targetDBname');
- CREATE USER MAPPING FOR targetUser SERVER SWL_targetDBname_link
- OPTIONS (user 'targetUser', password 'pass');
- GRANT USAGE ON FOREIGN ERVER SWL_targetDBname_link TO targetUser;
- -- procedure code
- CREATE OR REPLACE PROCEDURE AUTO_TEST(id_value DOUBLE PRECISION, text_value VARCHAR,IN is_recursive BOOLEAN DEFAULT false)
- LANGUAGE plpgsql
- AS $$
- DECLARE
- v_sql text;
- BEGIN
- IF is_recursive = FALSE THEN
- BEGIN
- IF NOT EXISTS(SELECT 1 FROM DBLINK_GET_CONNECTIONS()
- WHERE dblink_get_connections@> '{myconn}') THEN
- PERFORM DBLINK_CONNECT('myconn','SWL_targetDBname_link');
- END IF;
- v_sql := FORMAT('CALL AUTO_TEST( id_value => %L, text_value => %L, is_recursive => TRUE )',id_value,text_value);
- PERFORM DBLINK('myconn',v_sql);
- END;
- ELSE
- --procedure body
- INSERT INTO AUTONOMOUS_EVENT(ID, VALUE)
- VALUES(id_value, text_value);
- COMMIT;
- END IF;
- END; $$;
-
XML functions conversion:
Oracle
- with demo1 as(
- select XMLType(
- '<hello-world>
- <word seq="1">Hello</word>
- <word seq="2">world</word>
- </hello-world>
- ') XML
- from dual
- )
- select
- t.xml.extract('//word[@seq=1]/text()').getStringVal() col1
- , decode(t.xml.extract('//word[@seq=1]/text()').getStringVal(), 'Hello', 'Hell', 'END') col2
- from demo1 t
→ PostgreSQL
- with demo1 as(select '<hello-world>
- <word seq="1">Hello</word>
- <word seq="2">world</word>
- </hello-world>
- ':: xml AS XML)
- select(trim(replace(xpath('//word[@seq=1]/text()',T.XML):: text,',',''),'{}'):: xml):: text AS COL1
- , CASE(trim(replace(xpath('//word[@seq=1]/text()',T.XML):: text,',',''),'{}'):: xml):: text WHEN 'Hello' THEN 'Hell' ELSE 'END' END AS COL2
- from demo1 T;
Get a free sample code of our Oracle to PostgreSQL conversion
Ispirer Toolkit automatically converts not only a single piece of code, but an entire database. Complex code will require customization of the toolkit
Trust us with your migration project
-
High quality SQL code conversion
Expert system with 20.000+ conversion rules and 100.000+ automated tests
-
Flexibility
Nimble configuration with 300+ parameters and options for SQL objects and data multithread migration
-
Seasoned team
Ensuring high security and performance standards is what we do best, thanks to our impressive expertise in building reliable and scalable solutions
-
Technology expertise
With 25+ years of experience, our team has gained a wide pool of expertise in various programming languages, from the rarest to the most popular ones
-
We comply with ISO 27001
security management requirements with comprehensive policies and processes, advanced security technology, and skilled professionals
-
Comprehensive migration analysis
Intuitive and instructive reports for cost-effective post-migration polishing
-
Proprietary tools
We employ Ispirer proprietary tools, underscoring our dedication to delivering the utmost reliability and performance solutions. The toolkit is compiled daily and continually integrates dozens of new conversion rules, enhancing the automation capabilities
-
Free smart assessment
Ispirer's free InsightWays tool for migration scope and complexity evaluation
The world’s most innovative companies are building their next big thing with Ispirer
Magnit, CardinalHealth, Worldline and more have adopted SQLWays to boost their innovation life-cycle accelerate and manage their end-to-end innovation lifecycle
All testimonialsAre you still here? And wow, that's quite a lot you had to scroll through! 😄
Take control of your database
migration now





