SQLines SQL Converter can help you convert Oracle PL/SQL stored procedures, functions and packages to Java.
To run the conversion in command line:
# Convert a single file ./sqlines -s=oracle -t=oracle -tl=java -in=package.sql -out=Package.java # Convert multiple files ./sqlines -s=oracle -t=oracle -tl=java -in=*.sql -out=out_dir/
See more command line options.
To run the conversion in SQLines Studio, edit sqlines.cfg and set -tl=java option:
PL/SQL language elements:
| PL/SQL | Java | |||
| 1 | 'string_literal' | String literals in single quotes | "string_literal" | String literals in double quotes |
| 2 | NULL | NULL value | null | Null reference |
| 3 | expr IS NULL | Check for NULL value | expr == null | |
| 4 | -- Text | Single line comment | // Text | |
Comparison:
Operators:
| PL/SQL | Java | |||
| 1 | || Operator | String concatenation | + Operator | |
| 2 | AND | Logical AND operator | && | |
| 3 | OR | Logical OR operator | || | |
Derived data types:
| PL/SQL | Java | |||
| 1 | table.column%TYPE | Data type the same as table.column | Java data type | |
| 2 | table%ROWTYPE | Structure and data types the same as table | Generated Java class | |
Character data types:
| PL/SQL | Java | |||
| 1 | CHAR(n) | Fixed-length string, 1 <= n <= 2000 | String | |
| 2 | VARCHAR2(n) | Variable-length string, 1 <= n <= 4000 | String | |
Numeric data types:
| PL/SQL | Java | ||||
| 1 | INTEGER | INT | Integer number | Integer | |
| 2 | NUMBER(p,0) | NUMBER(p) | Integer number | Integer | |
| 3 | NUMBER(p,s) | Fixed-point number | BigDecimal | ||
| 4 | NUMBER | NUMBER(*) | Floating-point number | BigDecimal | |
Note that use of data type classes instead of primitive data types in Java (Double vs double i.e.) helps handling NULLs that are typically widely used in PL/SQL code.
Object types:
| PL/SQL | Java | |||
| 1 | TYPE Typetab IS TABLE OF data_type INDEX BY BINARY_INTEGER | Collection of data_type objects | HashMap<Integer, data_type> | |
| 2 | tab Typetab | Creating collection | tab = new HashMap<Integer, data_type>() | |
| 3 | tab(index) := value | Assign a value | tab.put(index, value) | |
Records:
| PL/SQL | Java | |||
| 1 | TYPE name IS RECORD (elements) | Record objects | Java class with getters and setters | |
Converting NULL processing functions:
| Oracle | Java | |||
| 1 | NVL(exp, replacement) | Replace NULL with the specified value | Functions.nvl(exp, replacement) | |
Converting queries:
| PL/SQL | Java | |||
| 1 | SELECT INTO | conn.prepareStatement("SELECT ..."); ... stmt.statement.executeQuery(); ... | ||
Converting PL/SQL procedures:
| PL/SQL | Java | |||
| 1 | CREATE OR REPLACE PROCEDURE Name | public static void Name | ||
| 2 | (param IN | OUT | IN OUT datatype, …) | Parameter definition | (datatype param, …) | |
| 3 | OUT | IN OUT datatype | Output parameter | datatypeOut | Wrapper class |
| 4 | IS | AS plsql_statements END | { java_statements } | ||
For more information, see Conversion of PL/SQL Statements.
Converting PL/SQL packages:
| PL/SQL | Java | |||
| 1 | CREATE OR REPLACE PACKAGE Name | Package specification | Removed except type declarations | |
| 2 | CREATE OR REPLACE PACKAGE BODY Name | Package body | public class Name | |
| 3 | BEGIN plsql_statements END | Package code | { java_statements } | |
For more information, see Conversion of PL/SQL Statements.
Converting SQL INSERT statement:
| PL/SQL | Java | |||
| 1 | INSERT INTO tab VALUES (exp1, ...) | conn.prepareStatement("INSERT INTO tab VALUES (?, ...)"); ... | ||
Converting SQL UPDATE statement:
| PL/SQL | Java | |||
| 1 | UPDATE tab SET c1 = v1 ... WHERE ... | conn.prepareStatement("UPDATE tab SET c1 = ? ... WHERE ..."); ... | ||
Converting SQL DELETE statement:
| PL/SQL | Java | |||
| 1 | DELETE FROM tab WHERE ... | conn.prepareStatement("DELETE FROM tab WHERE ..."); ... | ||
Variable declaration and assignment:
| PL/SQL | Java | ||
| 1 | variable datatype := value | Variable declaration | datatype variable = value |
| 2 | variable CONSTANT datatype := value | Constant declaration | final datatype variable = value |
| 3 | variable := expression | Variable assignment | variable = expression |
Flow of control statements:
| PL/SQL | Java | ||
| 1 | IF condition THEN … ELSIF … ELSE … END IF | IF statement | if (condition) { … } else if(…) { … } else { … } |
| 2 | FOR rec IN cursor LOOP ... END LOOP | Cursor loop | stmt.executeQuery(); while(rs.next()) {...} |
| 3 | LOOP statements END LOOP | Loop statement | while (true) { statements } |
| 4 | EXIT | Leave loop | break |
Cursor declaration and processing:
| PL/SQL | Java | ||
| 1 | CURSOR cur (params) IS select_statement | Cursor declaration | String cur = 'select_statement' |
| 2 | OPEN cur | Open a cursor | ResultSet rs = stmt.executeQuery(cur) |
| 3 | FETCH cur INTO var, … | Fetch a cursor | boolean cur_found = rs.next(); if(cur_found) { var = rs.getObject(1); … } |
| 4 | FOR rec IN cursor LOOP ... END LOOP | Cursor loop | stmt.executeQuery(); while(rs.next()) {...} |
| 5 | cur%FOUND | Row was fetched | cur_found boolean variable |
| 6 | cur%NOTFOUND | No rows anymore | !cur_found boolean expression |
| 7 | EXIT WHEN cur%NOTFOUND | Exit cursor loop | if(!cur_found) break; |
| 8 | CLOSE cur | Close a cursor | stmt.close() |
Exception handling:
| PL/SQL | Java | ||
| 1 | BEGIN … EXCEPTION … END | Exception block | try { … } catch (SQLException e) { … } |
| 2 | WHEN NO_DATA_FOUND THEN NULL | Ignore no data found exception | Remove as it's handled by ResultSet.next() |
| 3 | WHEN OTHERS THEN NULL | Ignore all exceptions | catch (SQLException) { } |
Custom exception handling:
| PL/SQL | Java | ||
| 1 | ExceptionName EXCEPTION | Exception declaration | class ExceptionName extends Exception {} |
| 2 | RAISE ExceptionName | Raise exception | throw new ExceptionName() |
| 3 | EXCEPTION WHEN ExceptionName THEN … | Exception block | catch (ExceptionName e) { … } |
Transactions:
| PL/SQL | Java | ||
| 1 | COMMIT | Commit the transaction | conn.commit(); |
Converting built-in PL/SQL packages:
| Oracle | Java | ||
| 1 | DBMS_OUTPUT.PUT_LINE(text) | Output a message | System.out.println(text) |