当您运行代码块时,它不会返回任何行。但是,它确实返回cursor
指向您可以使用该游标变量访问的某些行的指向cur
- 它是一个OUT
参数,这意味着该过程设置其值,并且当该过程完成时,cur
游标已准备好进行如下查询:
LOOP
FETCH cur INTO your_variable1, your_variable2, ..., your_variableN;
EXIT WHEN cur%NOTFOUND;
-- process fetched values
END LOOP;
我不确定返回游标 OUT 参数的过程是否允许您使用 SSIS 查询数据,不幸的是我自己无法测试。
我想出了一种可能的解决方案,但它可能做得过火了。您也可以请编写该程序的PIPELINED
人为您编写一个函数。这样的函数可以在FROM
查询的子句中使用,因此您可以在 Oracle 数据库中创建一个视图,该视图将从该函数中获取数据,并且在您的 SSIS 包中您只需查询该视图。下面是一个示例,也可在 SQLFiddle 上找到:http ://sqlfiddle.com/#!4/c66c7/1
CREATE TABLE emp (id NUMBER, name VARCHAR2(20));
INSERT INTO emp VALUES (1, 'John');
INSERT INTO emp VALUES (2, 'Jake');
CREATE OR REPLACE TYPE emp_rec_t AS OBJECT (
id NUMBER,
name VARCHAR2(20)
);
CREATE OR REPLACE TYPE my_emp_array_t IS TABLE OF emp_rec_t;
CREATE OR REPLACE PROCEDURE my_emp_ref_func(o_emp_cur OUT sys_refcursor)
IS
BEGIN
OPEN o_emp_cur FOR 'SELECT id, name FROM emp';
END;
/
CREATE OR REPLACE FUNCTION my_emp_func RETURN my_emp_array_t PIPELINED
IS
v_emp_cur sys_refcursor;
v_id NUMBER;
v_name VARCHAR2(20);
BEGIN
my_emp_ref_func(v_emp_cur);
LOOP
FETCH v_emp_cur INTO v_id, v_name;
EXIT WHEN v_emp_cur%NOTFOUND;
PIPE ROW (emp_rec_t(v_id, v_name));
END LOOP;
END;
/
CREATE OR REPLACE VIEW my_emp_cur_view AS
SELECT id, name
FROM TABLE(my_emp_func)
;