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 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
Capabilities Oracle PL/SQL to Java conversion
Our automated migration engine analyzes the original Oracle PL/SQL code at the Abstract Syntax Tree (AST) level and accurately transforms:
Migration details overview
-
Ispirer Toolkit automates
Ispirer Toolkit automates the entire migration of database objects from Oracle PL/SQL to Java
Both conversion with connection to the source database, and conversion of files containing Oracle PL/SQL scripts are possible. Our tool supports conversion of the following objects: packages (specification and body), collection and object types, functions, procedures. At the same time, tables, views, triggers and sequences remain on the side of Oracle. As a result of conversion, each separate database object is converted to a Java class. Class names are formed based on object names, taking into account the Java Naming Convention.
In case, you need your Java application to work with a different database, Ispirer Toolkit can convert Embedded SQL and the database itself.
-
Variable Conversion
Ispirer Toolkit supports conversion of all Oracle data types
The tool automatically converts function and procedure variables (nested or not) to method variables, as well as package variables to class variables.
Moreover, when converting variables, their visibility is taken into account.
-
PL/SQL Code Conversion
SQL objects are converted to classes
Procedures and functions are converted to classes with one method. Packages are converted to classes, their nested functions and procedures into methods of this class, taking into account their visibility. Initialization block is converted to the class constructor.
Oracle built-in functions and procedures are converted either to the same Java methods, if any, or to the methods of our framework.
-
Working with Database
The automated conversion supports multiple data access options: from classic JDBC to Spring JDBC Template and Hibernate (using native queries)
This flexibility ensures that the generated code can be seamlessly integrated into different technology stacks while preserving familiar tools for working with the database.
-
Working with Collections
Ispirer Toolkit supports collection conversion of all three types: Associative array, Nested table, Variable-size array (varray)
For optimal collection conversion, we have developed helper classes that allow to repeat the logic of Oracle collections in Java.
-
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 based on the requirements of your conversion project.
Check out how Ispirer Toolkit migrates databases efficiently, minimizing the need for manual corrections
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
Oracle to Java 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
Conversion Samples of Oracle PL/SQL to Java
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.
-
Common variables declaration structure conversion:
Oracle PL/SQL
- CREATE OR REPLACE PACKAGE pkgWithVars
- IS
- NORMAL CONSTANT NUMBER := 0;
- FOUND CONSTANT NUMBER := 1;
- INST VARCHAR2(50) := 'pkgWithVars';
- PROCEDURE sp;
- END;
- /
- CREATE PACKAGE BODY pkgWithVars AS
- PROCEDURE sp
- as
- My_Status number(5);
- BEGIN
- My_Status := Normal;
- END;
- END;
→ Java
- @Service
- @SessionScope
- public class Pkgwithvars implements IPkgwithvars {
- @Getter
- private final BigDecimal NORMAL = new BigDecimal("0");
- @Getter
- private final BigDecimal FOUND = new BigDecimal("1");
- @Getter
- @Setter
- private String inst = "pkgWithVars";
- @Override
- public void sp() {
- Integer myStatus = null;
- myStatus = Converter.toInteger(NORMAL);
- }
- }
-
%ROWTYPE attribute and Record Type conversion:
Oracle PL/SQL
- DECLARE
- rec1 PREC_TAB%ROWTYPE;
- type rec2_tp is record (
- inst_id number,
- instr_dt date
- );
- rec2 rec2_tp;
- v1 number := 5;
- BEGIN
- rec1.PREC_ID := v1;
- v1 := rec2.inst_id;
- END;
→ Java
- @Data
- @TableType
- public class PrecTab {
- private BigDecimal precId;
- private String precSt;
- private Integer cnt;
- public PrecTab() {
- initFields(null, null, null);
- }
- public PrecTab(BigDecimal precId, String precSt, Integer cnt) {
- initFields(precId, precSt, cnt);
- }
- public PrecTab(PrecTab precTab) {
- if (precTab != null) {
- initFields(precTab.precId, precTab.precSt, precTab.cnt);
- }
- else {
- initFields(null, null, null);
- }
- }
- private void initFields(BigDecimal precId, String precSt, Integer cnt) {
- this.precId = precId;
- this.precSt = precSt;
- this.cnt = cnt;
- }
- }
- @Service
- @SessionScope
- public class QuickfileSqlScr1 implements IQuickfileSqlScr1 {
- @Override
- public void spQuickfileSqlScr1() {
- @Record
- @Data
- class Rec2Tp {
- private BigDecimal instId;
- private LocalDateTime instrDt;
- public Rec2Tp() {
- initFields(null, null);
- }
- public Rec2Tp(BigDecimal instId, LocalDateTime instrDt) {
- initFields(instId, instrDt);
- }
- public Rec2Tp(Rec2Tp rec2Tp) {
- if (rec2Tp != null) {
- initFields(rec2Tp.instId, rec2Tp.instrDt);
- }
- else {
- initFields(null, null);
- }
- }
- private void initFields(BigDecimal instId, LocalDateTime instrDt) {
- this.instId = instId;
- this.instrDt = instrDt;
- }
- }
- PrecTab rec1 = null;
- Rec2Tp rec2 = new Rec2Tp();
- BigDecimal v1 = new BigDecimal("5");
- rec1.setPrecId(v1);
- v1 = rec2.getInstId();
- }
- }
-
For collection types conversion we’ve implemented additional classes that have same behavior as Oracle collections:
Oracle PL/SQL
- DECLARE
- TYPE student_arraytype IS TABLE OF student%ROWTYPE INDEX BY PLS_INTEGER;
- student_array student_arraytype;
- BEGIN
- FOR i IN student_array.FIRST .. student_array.LAST
- LOOP
- DBMS_OUTPUT.PUT_LINE(student_array(i).FIRST_NAME);
- END LOOP;
- END;
→ Java
- public void spQuickfileSqlScr1() {
- AssociativeCollection < Integer, Student > studentArray = new AssociativeCollection <>(Integer.class, Student.class);
- for (Integer i = studentArray.first();
- i <= studentArray.last();
- i ++) {
- System.out.println(studentArray.get(i).getFirstName());
- }
- }
-
Cursor conversion:
Oracle PL/SQL
- CREATE PROCEDURE sp_student_loop IS
- CURSOR C_STUD IS
- SELECT * FROM STUDENT;
- BEGIN
- FOR STUD_REC IN C_STUD
- LOOP
- STUD_UPDATE(STUD_REC);
- END LOOP;
- END;
→ Java
- public void spSpStudentLoop() {
- CursorReader cStud = new CursorReader("SELECT * " +
- "FROM STUDENT ");
- cStud.open(cursorManager);
- while (cStud.fetch()) {
- studUpdate.spStudUpdate(EntityMapper.mapEntity(cStud, Student.class));
- }
- cStud.close();
- }
-
Output parameters conversion:
Oracle PL/SQL
- CREATE PACKAGE BODY sample_pkg
- AS
- PROCEDURE increm_fn (
- PAR_ID OUT varchar2,
- PAR_SAJES_OUT IN OUT NUMBER
- )
- IS
- BEGIN
- PAR_ID := 'new value';
- PAR_SAJES_OUT := PAR_SAJES_OUT + 1;
- END;
- PROCEDURE main_sp
- IS
- V_ID varchar2(50);
- V_SAJES NUMBER;
- BEGIN
- increm_fn(V_ID, V_SAJES);
- END;
- END;
→ Java
- public class SamplePkg implements ISamplePkg {
- @Autowired
- private AdviceWrapper aw;
- @Override
- @OutParameters
- public Map< String, Object > incremFn(@Out String parId, BigDecimal parSajesOut) {
- Map<String, Object> outData = new HashMap<>();
- try {
- parId = "new value";
- parSajesOut = MathUtil.add(parSajesOut, 1);
- return outData;
- }
- finally {
- outData.put("parId", parId);
- outData.put("parSajesOut", parSajesOut);
- }
- }
- @Override
- public void mainSp() {
- Map<String, Object> outDataResult;
- String vId = null;
- BigDecimal vSajes = null;
- outDataResult = aw.getProxy(SamplePkg.this).incremFn(vId, vSajes);
- vId = (String) outDataResult.get("parId");
- vSajes = (BigDecimal) outDataResult.get("parSajesOut");
- }
- }
-
Nested procedure conversion:
Oracle PL/SQL
- create PROCEDURE pkg_nested_example IS
- PROCEDURE CHECK1 IS
- W_TOBE CHAR(1) := '0';
- W_PAR CHAR(1) := '0';
- PROCEDURE CHK AS
- BEGIN
- W_PAR := '1';
- W_TOBE := '1';
- END;
- BEGIN
- CHK;
- END;
- BEGIN
- CHECK1;
- END;
→ Java
- public void spPkgNestedExample() {
- class NestedFunctions {
- public void check1() {
- MutableObject<String> mutablewTobe = new MutableObject<>();
- MutableObject<String> mutablewPar = new MutableObject<>();
- class NestedFunctions2 {
- public void chk() {
- String wPar = mutablewPar.getValue();
- String wTobe = mutablewTobe.getValue();
- try {
- wPar = "1";
- wTobe = "1";
- }
- finally {
- mutablewPar.setValue(wPar);
- mutablewTobe.setValue(wTobe);
- }
- }
- }
- NestedFunctions2 nestedFunctions2 = new NestedFunctions2();
- String wTobe = "0";
- String wPar = "0";
- mutablewTobe.setValue(wTobe);
- mutablewPar.setValue(wPar);
- nestedFunctions2.chk();
- wTobe = mutablewTobe.getValue();
- wPar = mutablewPar.getValue();
- }
- }
- NestedFunctions nestedFunctions = new NestedFunctions();
- nestedFunctions.check1();
- }
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
6 undeniable facts to choose conversion with Ispirer
-
Fact 1/6
Enhanced agility
Applications can offer more flexibility and agility in managing and modifying business logic than databases. It's easier and faster to update and iterate on application code rather than altering database architecture, structure, stored procedures and data.
-
Fact 2/6
Portability
Business logic embedded within applications is more portable across different database systems or platforms. It can be beneficial if the business needs to switch database vendors or deploy the application in various environments.
-
Fact 3/6
Improved performance
Application servers are much easier to scale than database servers. Depending on the load users create, an application can be placed in a container and used as needed. It will be much easier and cheaper to achieve the system's desired performance using Ispirer solutions.
-
Fact 4/6
RDBMS dependency eliminated
Having business logic in the application layer unties your hands if you plan to change a database management system. This approach allows the simultaneous support of several databases.
-
Fact 5/6
Modernization and innovation
Migrating to Java can enable the adoption of new technologies and features, unlocking new business opportunities and driving innovation.
-
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.
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





