Sql 如何使用Oracle过程创建数据流任务以返回数据?
我有一个SSIS包,它使用数据流任务与Oracle数据库连接以运行数据查询并将其输出到平面csv文件。现在,我需要将此查询转换为在Oracle过程中获取数据,并从数据流任务调用此过程。有人为我创建了一个Oracle过程,它基本上返回一个游标。现在这里有三个问题:Sql 如何使用Oracle过程创建数据流任务以返回数据?,sql,oracle,plsql,ssis,Sql,Oracle,Plsql,Ssis,我有一个SSIS包,它使用数据流任务与Oracle数据库连接以运行数据查询并将其输出到平面csv文件。现在,我需要将此查询转换为在Oracle过程中获取数据,并从数据流任务调用此过程。有人为我创建了一个Oracle过程,它基本上返回一个游标。现在这里有三个问题: 我是Microsoft SQL专家,但对Oracle了解不多 当我在PL/SQL窗口中运行这样的过程时,它编译为OK,但不会像您在Microsoft SQL Server中所期望的那样返回任何行。可以吗 在SSIS中,如何调用此过程来
运行代码块时,它不会返回任何行。但是,它确实返回一个
光标
,指向可以使用该光标变量cur
访问的某些行-它是一个OUT
参数,意味着过程设置其值,当过程完成时,cur
光标准备好进行如下查询:
LOOP
FETCH cur INTO your_variable1, your_variable2, ..., your_variableN;
EXIT WHEN cur%NOTFOUND;
-- process fetched values
END LOOP;
我不确定返回cursor OUT参数的过程是否允许您使用SSI查询数据,不幸的是,我自己无法测试它
我想出了一个可能的解决办法,但可能做得太过分了。您可以让编写该过程的人也为您编写一个管道化的
函数。这样的函数可以在查询的FROM
子句中使用,因此您可以在Oracle数据库中创建一个视图,从该函数中获取数据,而在SSIS包中,您只需查询该视图。下面是一个示例,也可从SQLFIDLE获得:
运行代码块时,它不会返回任何行。但是,它确实返回一个
光标
,指向可以使用该光标变量cur
访问的某些行-它是一个OUT
参数,意味着过程设置其值,当过程完成时,cur
光标准备好进行如下查询:
LOOP
FETCH cur INTO your_variable1, your_variable2, ..., your_variableN;
EXIT WHEN cur%NOTFOUND;
-- process fetched values
END LOOP;
我不确定返回cursor OUT参数的过程是否允许您使用SSI查询数据,不幸的是,我自己无法测试它
我想出了一个可能的解决办法,但可能做得太过分了。您可以让编写该过程的人也为您编写一个管道化的
函数。这样的函数可以在查询的FROM
子句中使用,因此您可以在Oracle数据库中创建一个视图,从该函数中获取数据,而在SSIS包中,您只需查询该视图。下面是一个示例,也可从SQLFIDLE获得:
“1.我是Microsoft SQL专家”-这是一个重大的决定@米奇麦特精心挑选了米奇。但是,如果你以比较的方式了解我对甲骨文的了解,你会同意这一点。:)“1.我是Microsoft SQL专家”-这是一个重大的决定@米奇麦特精心挑选了米奇。但是,如果你以比较的方式了解我对甲骨文的了解,你会同意这一点。:)这也是我的建议。这也是一个很好的例子,说明Oracle等价于表值函数是多么复杂。这也是我的建议。这也是一个很好的例子,说明表值函数的Oracle等价物是多么复杂。
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)
;