Skip to content

Protocol Compatibility Migration Guide

Protocol Compatibility Migration Guide

Overview

This guide helps migrate applications from Oracle 23ai or SQL Server 2022 to HeliosDB while maintaining 95%+ compatibility.

Oracle to HeliosDB Migration

Connection String Changes

Before (Oracle)

jdbc:oracle:thin:@hostname:1521:ORCL

After (HeliosDB with Oracle protocol)

jdbc:oracle:thin:@hostname:1521:heliosdb

No application code changes required - HeliosDB speaks Oracle TNS protocol.

Automatic SQL Translation

HeliosDB automatically translates Oracle-specific SQL to standard SQL:

DUAL Table

-- Oracle syntax (automatically handled)
SELECT SYSDATE FROM DUAL;
-- HeliosDB internal translation
SELECT CURRENT_TIMESTAMP;

NVL to COALESCE

-- Oracle syntax (automatically handled)
SELECT NVL(salary, 0) FROM employees;
-- HeliosDB internal translation
SELECT COALESCE(salary, 0) FROM employees;

DECODE to CASE

-- Oracle syntax
SELECT DECODE(status, 'A', 'Active', 'I', 'Inactive', 'Unknown')
FROM employees;
-- Automatically translated to standard CASE

PL/SQL Migration

Cursor Handling

Oracle PL/SQL (fully supported)

DECLARE
CURSOR emp_cursor IS SELECT * FROM employees WHERE dept_id = 10;
emp_rec employees%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_rec;
EXIT WHEN emp_cursor%NOTFOUND;
-- Process record
END LOOP;
CLOSE emp_cursor;
END;

HeliosDB Support: 96% compatible

  • All cursor attributes supported (%FOUND, %NOTFOUND, %ROWCOUNT, %ISOPEN)
  • BULK COLLECT supported
  • REF CURSOR (weak and strong) supported

Exception Handling

Oracle PL/SQL (fully supported)

BEGIN
SELECT salary INTO v_salary FROM employees WHERE emp_id = 999;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_salary := 0;
WHEN TOO_MANY_ROWS THEN
RAISE_APPLICATION_ERROR(-20001, 'Multiple records found');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;

HeliosDB Support: 95% compatible

  • All standard exceptions supported
  • Custom exception support
  • Exception propagation across blocks

Hierarchical Queries

Oracle CONNECT BY (fully supported)

SELECT employee_id, manager_id, LEVEL, SYS_CONNECT_BY_PATH(name, '/') AS path
FROM employees
START WITH manager_id IS NULL
CONNECT BY NOCYCLE PRIOR employee_id = manager_id
ORDER SIBLINGS BY name;

HeliosDB Support: 93% compatible

  • CONNECT BY PRIOR fully supported
  • START WITH clause supported
  • NOCYCLE keyword for cycle detection
  • LEVEL pseudo-column
  • SYS_CONNECT_BY_PATH function
  • CONNECT_BY_ROOT operator
  • CONNECT_BY_ISLEAF pseudo-column
  • ORDER SIBLINGS BY clause

Advanced Functions

String Functions

-- All fully supported
SELECT
INSTR('hello world', 'world'), -- Position 7
SUBSTR('hello', -3, 3), -- 'llo' (negative position)
LPAD('Page 1', 10, '*.'), -- '*.*.*Page 1'
TRANSLATE('2KRW229', '0123456789', '----'), -- Result
FROM DUAL;

Analytic Functions

-- Fully supported
SELECT
employee_id,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank,
LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_salary,
LEAD(salary, 1, 0) OVER (ORDER BY hire_date) AS next_salary
FROM employees;

XMLType and JSON

XMLType

-- Create XML
DECLARE
xml_doc XMLType;
BEGIN
xml_doc := XMLType('<employees><employee id="1">John</employee></employees>');
-- Extract value
SELECT xml_doc.extract('/employees/employee/text()') FROM DUAL;
-- Check existence
IF xml_doc.existsNode('/employees/employee[@id="1"]') = 1 THEN
-- Node exists
END IF;
END;

HeliosDB Support: 90% compatible

  • XMLType creation and storage
  • extract() with XPath
  • existsNode() for validation
  • Basic XSLT transformation

JSON Functions (Oracle 21c+)

-- JSON_VALUE
SELECT JSON_VALUE('{"name":"John","age":30}', '$.name') AS name;
-- JSON_QUERY
SELECT JSON_QUERY('{"items":[1,2,3]}', '$.items') AS items;
-- JSON_TABLE
SELECT jt.*
FROM JSON_TABLE(
'[{"id":1,"name":"John"},{"id":2,"name":"Jane"}]',
'$[*]'
COLUMNS(
id NUMBER PATH '$.id',
name VARCHAR2(50) PATH '$.name'
)
) jt;

HeliosDB Support: 94% compatible

Migration Checklist

  • Test connection string changes
  • Identify PL/SQL packages usage (check compatibility)
  • Review hierarchical queries with cycles
  • Test exception handling edge cases
  • Validate XMLType usage
  • Check JSON path expressions
  • Test cursor-intensive code
  • Verify ROWNUM behavior in complex queries

SQL Server to HeliosDB Migration

Connection String Changes

Before (SQL Server)

Server=hostname;Database=mydb;User Id=sa;Password=***;

After (HeliosDB with TDS protocol)

Server=hostname;Database=mydb;User Id=user;Password=***;

No application code changes required - HeliosDB speaks TDS protocol.

Automatic T-SQL Translation

TOP to LIMIT

-- SQL Server syntax (automatically handled)
SELECT TOP 10 * FROM employees ORDER BY salary DESC;
-- HeliosDB internal translation
SELECT * FROM employees ORDER BY salary DESC LIMIT 10;

Identity Functions

-- All fully supported
INSERT INTO orders (customer) VALUES ('John');
SELECT @@IDENTITY; -- Last identity inserted (any table, includes triggers)
SELECT SCOPE_IDENTITY(); -- Last identity in current scope (excludes triggers)
SELECT IDENT_CURRENT('orders'); -- Last identity for specific table
SELECT @@ROWCOUNT; -- Rows affected by last statement

HeliosDB Support: 97% compatible

  • Correct scope handling for identity functions
  • Transaction awareness
  • Trigger distinction

T-SQL Features

TRY…CATCH

SQL Server T-SQL (fully supported)

BEGIN TRY
-- Risky operation
INSERT INTO orders (customer) VALUES ('John');
UPDATE inventory SET qty = qty - 1 WHERE product_id = 123;
END TRY
BEGIN CATCH
-- Error handling
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_MESSAGE() AS ErrorMessage,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine;
ROLLBACK TRANSACTION;
END CATCH;

HeliosDB Support: 95% compatible

  • Full ERROR_* function support
  • Nested TRY…CATCH blocks
  • Severity level handling (errors >= 20 terminate connection)
  • THROW for re-raising exceptions

Temp Tables and Table Variables

-- Local temp table
CREATE TABLE #temp_orders (
order_id INT,
customer VARCHAR(100)
);
-- Global temp table
CREATE TABLE ##global_temp (
id INT
);
-- Table variable
DECLARE @results TABLE (
id INT,
name VARCHAR(100)
);
INSERT INTO @results VALUES (1, 'John');
SELECT * FROM @results;

HeliosDB Support: 94% compatible

  • Local temp tables (#temp) - session scope
  • Global temp tables (##temp) - cross-session scope
  • Table variables (@table) - batch scope
  • Proper scope enforcement

OUTPUT Clause

-- INSERT with OUTPUT
INSERT INTO products (name, price)
OUTPUT INSERTED.product_id, INSERTED.name
VALUES ('Widget', 9.99);
-- UPDATE with OUTPUT
UPDATE inventory
SET qty = qty - 1
OUTPUT DELETED.qty AS old_qty, INSERTED.qty AS new_qty
WHERE product_id = 123;
-- DELETE with OUTPUT INTO
DECLARE @deleted TABLE (product_id INT, name VARCHAR(100));
DELETE FROM products
OUTPUT DELETED.product_id, DELETED.name INTO @deleted
WHERE discontinued = 1;

HeliosDB Support: 93% compatible

  • INSERTED and DELETED pseudo-tables
  • OUTPUT INTO table/variable
  • Works with triggers (proper isolation)

MERGE Statement

MERGE target t
USING source s
ON t.id = s.id
WHEN MATCHED THEN
UPDATE SET t.value = s.value
WHEN NOT MATCHED BY TARGET THEN
INSERT (id, value) VALUES (s.id, s.value)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
OUTPUT $action, INSERTED.*, DELETED.*;

HeliosDB Support: 92% compatible

  • Multiple WHEN clauses
  • WHEN NOT MATCHED BY SOURCE
  • OUTPUT with $action
  • Proper transaction handling

Common Table Expressions (CTEs)

Non-Recursive CTEs

WITH sales_summary AS (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
)
SELECT c.name, s.total
FROM customers c
JOIN sales_summary s ON c.id = s.customer_id;

HeliosDB Support: 96% compatible

Recursive CTEs

WITH RECURSIVE numbers AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM numbers WHERE n < 100
)
SELECT * FROM numbers
OPTION (MAXRECURSION 100);

HeliosDB Support: 96% compatible

  • MAXRECURSION limit (default 100, max 32767)
  • Infinite recursion detection
  • Proper validation (anchor vs recursive member)

JSON Support (SQL Server 2016+)

JSON Functions

DECLARE @json NVARCHAR(MAX) = N'{"name":"John","age":30,"active":true}';
-- JSON_VALUE (scalar extraction)
SELECT JSON_VALUE(@json, '$.name') AS name;
SELECT JSON_VALUE(@json, 'lax $.missing') AS missing; -- Returns NULL (lax mode)
SELECT JSON_VALUE(@json, 'strict $.missing') AS error; -- Raises error (strict mode)
-- JSON_QUERY (object/array extraction)
SELECT JSON_QUERY(@json, '$') AS full_object;
-- JSON_MODIFY
SET @json = JSON_MODIFY(@json, '$.age', 31);
SET @json = JSON_MODIFY(@json, 'append $.hobbies', 'reading');
-- ISJSON validation
IF ISJSON(@json) = 1
PRINT 'Valid JSON';
-- OPENJSON
SELECT *
FROM OPENJSON(@json)
WITH (
name NVARCHAR(50) '$.name',
age INT '$.age',
active BIT '$.active'
);
-- FOR JSON
SELECT customer_id, name, email
FROM customers
FOR JSON PATH, ROOT('customers'), INCLUDE_NULL_VALUES;

HeliosDB Support: 95% compatible

  • lax and strict path modes
  • All JSON functions
  • FOR JSON AUTO and PATH
  • Complex path expressions

Migration Checklist

  • Test connection string changes
  • Review @@IDENTITY vs SCOPE_IDENTITY usage
  • Check temp table scope requirements
  • Validate TRY…CATCH error handling
  • Test OUTPUT clause behavior
  • Verify MERGE statement logic
  • Check recursive CTE depth limits
  • Test JSON path modes (lax/strict)
  • Review table variable performance
  • Validate transaction handling

Performance Optimization Tips

Oracle Protocol

  1. Minimize ROWNUM usage: Convert to LIMIT when possible
  2. Hierarchical queries: Add NOCYCLE to prevent infinite loops
  3. REF CURSOR: Use strong-typed when possible for better optimization
  4. Bulk operations: Use BULK COLLECT for better performance

SQL Server Protocol

  1. Identity functions: Prefer SCOPE_IDENTITY() over @@IDENTITY
  2. CTEs: Set appropriate MAXRECURSION to prevent runaway queries
  3. Table variables: Use temp tables for large datasets (better statistics)
  4. JSON: Use strict mode only when necessary (lax mode is faster)

Troubleshooting

Common Issues

Oracle

  1. Cursor already open: Check for proper OPEN/CLOSE pairing
  2. ORA-01436 (CONNECT BY loop): Add NOCYCLE keyword
  3. XMLType parsing errors: Validate XML well-formedness
  4. PL/SQL package not found: Check DBMS_* package support

SQL Server

  1. Severity 20+ errors: These terminate connection, cannot be caught
  2. MAXRECURSION exceeded: Increase limit or optimize recursive query
  3. Table variable out of scope: Ensure usage within same batch
  4. JSON path errors: Check lax vs strict mode settings

Getting Help

  • Documentation: /docs/protocol/MULTI_PROTOCOL_COMPATIBILITY_MATRIX.md
  • Test examples: /heliosdb-protocols/tests/
  • Issue tracker: GitHub Issues

Version Compatibility

DatabaseTested VersionsCompatibility
Oracle19c, 21c, 23ai95%+
SQL Server2016, 2019, 202295%+

Last updated: 2025-01-02 (Agent 26 - Phase 5 Hardening)