我有以下存储过程:
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;
由于
答案 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_
在这种情况下,只需要注意正确处理光标,并在完成光标后随时关闭它。