oracle中如何设置out参数的值

How to set value in out parameter in oracle

我想在 oracle 上创建一个存储过程,其中 return out 参数中的值。我能够创建一个示例查询,但我能够将值设置为输出变量。输出应转换为 JSON

这是我的代码

 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;

我想得到 3 个变量的输出 JSON_DATA 包含 JSON 格式 OUT_IS_SUCCESS 布尔标志,如果没有发生错误 OUT_ERROR_MESSAGE如果有任何错误信息

如有任何帮助,我们将不胜感激。提前致谢

您可以告诉 json_arrayagg 到 return 一个 CLOB,并且 select 直接进入您的 OUT 参数。另外两个被注释掉的参数格式不正确; OUT 位置错误,字符串不应该有大小。

您可以这样做:

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,使用额外的虚拟代码位在第二次调用时强制出现异常。

但是捕获异常,尤其是 when others,只是将它们变成没有上下文(例如错误发生的位置)的基本字符串,很少是一个好主意 - 只让任何异常会更简单流回调用者:

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;
/

db<>fiddle

...除非您有充分的理由隐藏有用的调试信息。