如何从 Oracle 存储过程发送游标响应

How to send cursor response from Oracle stored procedure

我有一个存储过程,我想将 return 游标作为 OUT 参数。我看到了输出 dbms_output.put_line(as_return_val);喜欢

Loan Purpose can not be Limited ||  /loanPurpose 
THE PURPOSE OF PURCHASE IS NOT VALID ||  /loanPurpose 

我需要在我的服务层中将此响应读取为一组对象(每个对象一个对象)。抱歉,我不确定是否需要从此处将其作为游标或 varchar 发送。我添加了 as_return_val 这个变量来查看我是否得到正确的响应。

程序

create or replace PROCEDURE PR_LOGIC_CHECK_TEST 
(in_loan_id IN NUMBER,
in_trans_id  IN NUMBER)AS 

BEGIN
DECLARE
as_errm          VARCHAR2(2000);
curr_cursor_out  SYS_REFCURSOR;
temp_cursor_row  temp_cor_ll_cursor%rowtype;
as_return_val    VARCHAR2(500);
BEGIN
pr_loan_logic_check(in_loan_id, in_trans_id, as_errm,  curr_cursor_out);
LOOP
    FETCH curr_cursor_out INTO temp_cursor_row;
    EXIT WHEN curr_cursor_out%notfound;
    as_return_val := temp_cursor_row.ret_value
                     || ' ||  '
                     || '/'||temp_cursor_row.xpath_name;

    --dbms_output.put_line(as_return_val);
END LOOP;
close curr_cursor_out;
ROLLBACK;
END;
END PR_LOGIC_CHECK_TEST;

我还在猜测你真正想要发生什么,因为你实际上没有给我们一个可重现的测试用例(即我们可以 运行 在本地或在 dbfiddle 或 liveSQL 在给定特定输入的情况下产生特定输出)。

在架构上,存储过程的唯一目的是格式化不同过程的输出以供人类使用,这似乎是有问题的。格式化结果在应用程序的显示层(MVC 应用程序的视图,但当我们谈论数据库时视图意味着其他东西,所以我使用“显示层”)而不是在存储过程中完成会更合适。对于您的应用程序来说,直接调用 pr_loan_logic_check 并让您的显示层决定将多个列的值连接在一起会更有意义。如果以后有人想更改输出格式,您只需更改显示层中的代码,而不是后端数据库中的代码。

我猜你想 return 一个 collection 这样的。请注意,我正在 SQL 级别创建 collection 类型。您也可以在 PL/SQL 包中创建它。

create or replace type varchar2_tbl
  is table of varchar2(500);

create or replace PROCEDURE PR_LOGIC_CHECK_TEST (
  in_loan_id   IN NUMBER,
  in_trans_id  IN NUMBER,
  out_strings OUT varchar2_tbl
)
AS 
  as_errm          VARCHAR2(2000);
  curr_cursor_out  SYS_REFCURSOR;
  temp_cursor_row  temp_cor_ll_cursor%rowtype;
BEGIN
  pr_loan_logic_check(in_loan_id, in_trans_id, as_errm,  curr_cursor_out);

  out_strings := out_strings();
  LOOP
    FETCH curr_cursor_out INTO temp_cursor_row;
    EXIT WHEN curr_cursor_out%notfound;

    out_strings.extend();
    out_strings( out_strings.count ) := 
            temp_cursor_row.ret_value
         || ' ||  '
         || '/'||temp_cursor_row.xpath_name;
  END LOOP;
  close curr_cursor_out;

  -- I have trouble imagining why you'd put a `rollback` here
  ROLLBACK;
END PR_LOGIC_CHECK_TEST;