ORACLE存储过程 - 存储查询结果

时间:2017-06-29 14:24:19

标签: oracle stored-procedures

我有以下存储过程:

CREATE OR REPLACE PROCEDURE SP 
(
   query IN VARCHAR2(200),
   CURSOR_ OUT SYS_REFCURSOR
)
AS
  row_ PROCESSED_DATA_OBJECT; 
  processed PROCESSED_DATA_TABLE;
BEGIN

       .....

END;

CREATE TYPE processed_data_obj AS OBJECT(
  id   INTEGER,
  value FLOAT
);
/

CREATE OR REPLACE TYPE processed_data_table AS TABLE OF processed_data_obj;
/

我调用存储过程传递查询作为输入参数执行。 查询是这样的:

SELECT A,B FROM TABLE WHERE

其中A,B和TABLE不固定(在java程序执行期间在运行时定义),所以我事先不知道它们的值。

如何在我的结构中获取/存储每个返回的行?

processed PROCESSED_DATA_TABLE;

由于

1 个答案:

答案 0 :(得分:1)

这是您可以将动态生成的查询处理为用户定义类型的一种方法。请注意,为了使其正常工作,查询(列)的结构必须与您的类型(属性)的数据类型结构匹配,否则您将遇到麻烦。

style

我注意到,最初,您确实将CREATE TYPE processed_data_obj AS OBJECT( ID INTEGER, VALUE FLOAT, constructor FUNCTION processed_data_obj RETURN self AS result ); / CREATE OR REPLACE TYPE BODY processed_data_obj IS constructor FUNCTION processed_data_obj RETURN self AS result IS BEGIN RETURN; END; END; / CREATE OR REPLACE TYPE processed_data_table AS TABLE OF processed_data_obj; / CREATE OR REPLACE PROCEDURE sp ( p_query IN VARCHAR2 ) AS cursor_ sys_refcursor; processed processed_data_table := processed_data_table(); BEGIN OPEN cursor_ FOR p_query; loop processed.EXTEND; processed(processed.count) := processed_data_obj(); fetch cursor_ INTO processed(processed.count).ID, processed(processed.count).VALUE; exit WHEN cursor_%notfound; dbms_output.put_line(processed(processed.count).ID||' '||processed(processed.count).VALUE);-- at this point do as you please with your data. END loop; CLOSE cursor_; -- always close cursor ;) processed.TRIM; -- or processed.DELETE(processed.count); END sp; 作为输出参数存储在存储过程中,如果仍然是您的目标,则可以将过程创建为:

CURSOR_

在这种情况下,只需要注意正确处理光标,并在完成光标后随时关闭它。