I want to create a stored procedure on oracle which return the value in a out parameter. I was able to create a sample query but I am able to set the value to output variable. And the output should be converted into JSON
Here is my code
CREATE OR REPLACE PROCEDURE GET_TABLE_NAMES(JSON_DATA OUT CLOB )
-- OUT OUT_IS_SUCCESS BOOLEAN,
-- OUT OUT_ERROR_MESSAGE VARCHAR(4000)
AS
l_cursor_1 SYS_REFCURSOR;
BEGIN
--JSON_DATA :=
OPEN l_cursor_1 FOR SELECT JSON_ARRAYAGG(
JSON_OBJECT('TABLE_NAME' VALUE T.TABLE_NAME)
) INTO JSON_DATA
FROM
(
select TABLE_NAME FROM all_tables
) T
;
JSON_DATA := TO_CLOB(l_cursor_1);
--dbms_sql.return_result(l_cursor_1);
END GET_TABLE_NAMES;
I want to get output in 3 variables JSON_DATA contain out in JSON format OUT_IS_SUCCESS Boolean flag if no error occurred OUT_ERROR_MESSAGE if any error message
Any help will be appreciated. Thanks in advance
CodePudding user response:
You can tell json_arrayagg to return a CLOB, and select that directly into your OUT parameter. The other two commented-out parameters are malformed; the OUT is in the wrong place, and the string should not have a size.
You can do something like:
CREATE OR REPLACE PROCEDURE GET_TABLE_NAMES(
P_JSON_DATA OUT CLOB,
P_IS_SUCCESS OUT BOOLEAN,
P_ERROR_MESSAGE OUT VARCHAR2
)
AS
BEGIN
SELECT JSON_ARRAYAGG(
JSON_OBJECT('TABLE_NAME' VALUE TABLE_NAME)
FORMAT JSON
RETURNING CLOB
)
INTO P_JSON_DATA
FROM all_tables;
P_IS_SUCCESS := TRUE;
EXCEPTION
WHEN OTHERS THEN
P_IS_SUCCESS := FALSE;
P_ERROR_MESSAGE := SQLERRM;
END GET_TABLE_NAMES;
/
db<>fiddle, with an extra bit of dummy code to force an exception on the second call.
But catching exceptions, particularly with when others, just to turn them into basic strings with no context such as the position the error occurred, is rarely a good idea - it would be simpler to just let any exception flow back to the caller:
CREATE OR REPLACE PROCEDURE GET_TABLE_NAMES(
P_JSON_DATA OUT CLOB
)
AS
BEGIN
SELECT JSON_ARRAYAGG(
JSON_OBJECT('TABLE_NAME' VALUE TABLE_NAME)
FORMAT JSON
RETURNING CLOB
)
INTO P_JSON_DATA
FROM all_tables;
END GET_TABLE_NAMES;
/
... unless you have a good reason to hide useful debugging information.
