Skip to content

Commit fafcac1

Browse files
committed
feat: add DBMS_OUTPUT package with full Oracle compatibility
Implement complete DBMS_OUTPUT package including: - ENABLE/DISABLE buffer management - PUT_LINE/PUT/NEW_LINE output functions - GET_LINE/GET_LINES retrieval functions - Full Oracle compatibility validated against Oracle 23.26 All functions work correctly in Oracle mode (port 1521) using Oracle data types (VARCHAR2, INTEGER). Includes comprehensive regression tests for all 7 functions.
1 parent c51d958 commit fafcac1

File tree

7 files changed

+1091
-1
lines changed

7 files changed

+1091
-1
lines changed

contrib/ivorysql_ora/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ OBJS = \
2525
src/builtin_functions/datetime_datatype_functions.o \
2626
src/builtin_functions/numeric_datatype_functions.o \
2727
src/builtin_functions/misc_functions.o \
28+
src/builtin_functions/dbms_output.o \
2829
src/merge/ora_merge.o \
2930
src/sysview/sysview_functions.o \
3031
src/xml_functions/ora_xml_functions.o
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
src/datatype/datatype
22
src/builtin_functions/builtin_functions
3+
src/builtin_functions/dbms_output
34
src/sysview/sysview
45
src/xml_functions/xml_functions
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/***************************************************************
2+
*
3+
* DBMS_OUTPUT package - Full Oracle-compatible implementation
4+
*
5+
* This provides native buffering for PUT_LINE, PUT, NEW_LINE,
6+
* GET_LINE, and GET_LINES with full Oracle compatibility.
7+
*
8+
* Tested against Oracle Database Free 23.26.0.0
9+
* See design/dbms_output/ORACLE_BEHAVIOR.md for validation details
10+
*
11+
***************************************************************/
12+
13+
-- Register C functions
14+
CREATE FUNCTION sys.ora_dbms_output_enable(buffer_size INTEGER DEFAULT 20000)
15+
RETURNS VOID
16+
AS 'MODULE_PATHNAME', 'ora_dbms_output_enable'
17+
LANGUAGE C VOLATILE;
18+
19+
CREATE FUNCTION sys.ora_dbms_output_disable()
20+
RETURNS VOID
21+
AS 'MODULE_PATHNAME', 'ora_dbms_output_disable'
22+
LANGUAGE C VOLATILE;
23+
24+
CREATE FUNCTION sys.ora_dbms_output_put_line(a VARCHAR2)
25+
RETURNS VOID
26+
AS 'MODULE_PATHNAME', 'ora_dbms_output_put_line'
27+
LANGUAGE C VOLATILE;
28+
29+
CREATE FUNCTION sys.ora_dbms_output_put(a VARCHAR2)
30+
RETURNS VOID
31+
AS 'MODULE_PATHNAME', 'ora_dbms_output_put'
32+
LANGUAGE C VOLATILE;
33+
34+
CREATE FUNCTION sys.ora_dbms_output_new_line()
35+
RETURNS VOID
36+
AS 'MODULE_PATHNAME', 'ora_dbms_output_new_line'
37+
LANGUAGE C VOLATILE;
38+
39+
-- Create composite types for GET_LINE and GET_LINES return values
40+
CREATE TYPE sys.dbms_output_line AS (
41+
line VARCHAR2,
42+
status INTEGER
43+
);
44+
45+
CREATE TYPE sys.dbms_output_lines AS (
46+
lines VARCHAR2[],
47+
numlines INTEGER
48+
);
49+
50+
CREATE FUNCTION sys.ora_dbms_output_get_line()
51+
RETURNS sys.dbms_output_line
52+
AS 'MODULE_PATHNAME', 'ora_dbms_output_get_line'
53+
LANGUAGE C VOLATILE;
54+
55+
CREATE FUNCTION sys.ora_dbms_output_get_lines(numlines INTEGER)
56+
RETURNS sys.dbms_output_lines
57+
AS 'MODULE_PATHNAME', 'ora_dbms_output_get_lines'
58+
LANGUAGE C VOLATILE;
59+
60+
-- Create DBMS_OUTPUT package
61+
CREATE OR REPLACE PACKAGE sys.dbms_output IS
62+
PROCEDURE enable(buffer_size INTEGER DEFAULT 20000);
63+
PROCEDURE disable;
64+
PROCEDURE put_line(a VARCHAR2);
65+
PROCEDURE put(a VARCHAR2);
66+
PROCEDURE new_line;
67+
PROCEDURE get_line(line OUT VARCHAR2, status OUT INTEGER);
68+
PROCEDURE get_lines(lines OUT VARCHAR2[], numlines IN OUT INTEGER);
69+
END dbms_output;
70+
71+
CREATE OR REPLACE PACKAGE BODY sys.dbms_output IS
72+
73+
PROCEDURE enable(buffer_size INTEGER DEFAULT NULL) IS
74+
BEGIN
75+
PERFORM sys.ora_dbms_output_enable(buffer_size);
76+
END;
77+
78+
PROCEDURE disable IS
79+
BEGIN
80+
PERFORM sys.ora_dbms_output_disable();
81+
END;
82+
83+
PROCEDURE put_line(a VARCHAR2) IS
84+
BEGIN
85+
PERFORM sys.ora_dbms_output_put_line(a);
86+
END;
87+
88+
PROCEDURE put(a VARCHAR2) IS
89+
BEGIN
90+
PERFORM sys.ora_dbms_output_put(a);
91+
END;
92+
93+
PROCEDURE new_line IS
94+
BEGIN
95+
PERFORM sys.ora_dbms_output_new_line();
96+
END;
97+
98+
PROCEDURE get_line(line OUT VARCHAR2, status OUT INTEGER) IS
99+
result sys.dbms_output_line;
100+
BEGIN
101+
SELECT * INTO result FROM sys.ora_dbms_output_get_line();
102+
line := result.line;
103+
status := result.status;
104+
END;
105+
106+
PROCEDURE get_lines(lines OUT VARCHAR2[], numlines IN OUT INTEGER) IS
107+
result sys.dbms_output_lines;
108+
BEGIN
109+
SELECT * INTO result FROM sys.ora_dbms_output_get_lines(numlines);
110+
lines := result.lines;
111+
numlines := result.numlines;
112+
END;
113+
114+
END dbms_output;

0 commit comments

Comments
 (0)