Skip to content

Commit 42afdcc

Browse files
committed
fix: add VARCHAR2 overloads for DBMS_OUTPUT OUT parameters
Oracle uses VARCHAR2 for GET_LINE and GET_LINES OUT parameters. When users declare variables as VARCHAR2 (common Oracle practice), implicit casts don't work for OUT parameters because the value cannot be written back through the cast. Add overloaded procedures: - get_line(line OUT VARCHAR2, status OUT INTEGER) - get_lines(lines OUT VARCHAR2[], numlines IN OUT INTEGER) This allows migrated Oracle code using VARCHAR2 to work correctly.
1 parent 8ae2835 commit 42afdcc

2 files changed

Lines changed: 20 additions & 4 deletions

File tree

contrib/ivorysql_ora/expected/ora_dbms_output.out

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -646,8 +646,7 @@ BEGIN
646646
END IF;
647647
END;
648648
$$;
649-
ERROR: procedure parameter "line" is an output parameter but corresponding argument is not writable
650-
CONTEXT: PL/iSQL function inline_code_block line 8 at CALL
649+
NOTICE: Test 11.1 - VARCHAR2 GET_LINE: [VARCHAR2 test line]
651650
-- Test 11.2: GET_LINES with VARCHAR2[] OUT parameter
652651
DO $$
653652
DECLARE
@@ -665,8 +664,7 @@ BEGIN
665664
END IF;
666665
END;
667666
$$;
668-
ERROR: procedure parameter "lines" is an output parameter but corresponding argument is not writable
669-
CONTEXT: PL/iSQL function inline_code_block line 9 at CALL
667+
NOTICE: Test 11.2 - VARCHAR2[] GET_LINES: 2 lines
670668
-- =============================================================================
671669
-- Cleanup
672670
-- =============================================================================

contrib/ivorysql_ora/src/builtin_packages/dbms_output/dbms_output--1.0.sql

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ CREATE OR REPLACE PACKAGE dbms_output IS
7878
PROCEDURE put(a TEXT);
7979
PROCEDURE new_line;
8080
PROCEDURE get_line(line OUT TEXT, status OUT INTEGER);
81+
PROCEDURE get_line(line OUT VARCHAR2, status OUT INTEGER);
8182
PROCEDURE get_lines(lines OUT TEXT[], numlines IN OUT INTEGER);
83+
PROCEDURE get_lines(lines OUT VARCHAR2[], numlines IN OUT INTEGER);
8284
END dbms_output;
8385

8486
CREATE OR REPLACE PACKAGE BODY dbms_output IS
@@ -116,6 +118,14 @@ CREATE OR REPLACE PACKAGE BODY dbms_output IS
116118
status := result.status;
117119
END;
118120

121+
PROCEDURE get_line(line OUT VARCHAR2, status OUT INTEGER) IS
122+
result sys.dbms_output_line;
123+
BEGIN
124+
SELECT * INTO result FROM sys.ora_dbms_output_get_line();
125+
line := result.line;
126+
status := result.status;
127+
END;
128+
119129
PROCEDURE get_lines(lines OUT TEXT[], numlines IN OUT INTEGER) IS
120130
result sys.dbms_output_lines;
121131
BEGIN
@@ -124,4 +134,12 @@ CREATE OR REPLACE PACKAGE BODY dbms_output IS
124134
numlines := result.numlines;
125135
END;
126136

137+
PROCEDURE get_lines(lines OUT VARCHAR2[], numlines IN OUT INTEGER) IS
138+
result sys.dbms_output_lines;
139+
BEGIN
140+
SELECT * INTO result FROM sys.ora_dbms_output_get_lines(numlines);
141+
lines := result.lines;
142+
numlines := result.numlines;
143+
END;
144+
127145
END dbms_output;

0 commit comments

Comments
 (0)