ORACLE - 从存储过程返回游标

时间:2017-06-29 07:52:53

标签: oracle stored-procedures

我需要从存储过程返回一个游标对象,但我需要先处理数据。

例如,让我们考虑一下这个简单的存储过程:

create or replace PROCEDURE TEST 
(
   query_str IN VARCHAR2,
   CURSOR_ OUT SYS_REFCURSOR
)
AS
BEGIN
   OPEN CURSOR_ FOR query_str;
END;

此过程按原样返回数据,不进行后处理。 我需要的改进如下:

  1. 来自query_str执行的流程数据;
  2. 以游标的形式返回已处理的数据。
  3. 任何人都可以建议我实现这个目标吗?

    由于

1 个答案:

答案 0 :(得分:1)

使用动态SQL很难做到建议(除非您传递给过程的所有语句都具有类似的输出格式)。如果您可以知道SELECT将是什么,那么您可以将其存储在一个集合中并进行处理:

CREATE TABLE TEST_DATA ( id, name, dt ) AS
  SELECT 1, 'A', SYSDATE FROM DUAL UNION ALL
  SELECT 2, 'B', DATE '2017-01-01' FROM DUAL;

CREATE TYPE processed_data_obj AS OBJECT(
  id   INTEGER,
  etag VARCHAR2(20)
);
/

CREATE OR REPLACE TYPE processed_data_table AS TABLE OF processed_data_obj;
/

CREATE OR REPLACE PROCEDURE TEST 
(
   CURSOR_ OUT SYS_REFCURSOR
)
AS
  processed PROCESSED_DATA_TABLE;
BEGIN
  -- Process it in the select statement
  SELECT processed_data_obj(
           id,
           name || '_' || ROUND( ( dt - DATE '1970-01-01' ) * 24*60*60 )
         )
  BULK COLLECT INTO processed
  FROM  test_data;

  -- Process it more in PL/SQL
  FOR i IN 1 .. processed.COUNT LOOP
    processed[i].etag := processed[i].etag || '_' || i;
  END LOOP;

  OPEN cursor_out FOR
    SELECT *
    FROM   TABLE( processed );
END;
/