1

我有一个 SSIS 包,它使用数据流任务连接 Oracle 数据库以运行数据查询并将其输出到平面 csv 文件。现在我需要将此查询转换为在 Oracle 过程中获取数据并从数据流任务中调用此过程。有人为我创建了一个基本上返回光标的 Oracle 程序。现在这里有3个问题:

  1. 我是 Microsoft SQL 专家,但对 Oracle 了解不多。
  2. 当我在 PL/SQL 窗口中运行这样的过程时,它可以编译,但不会像您在 Microsoft SQL Server 中所期望的那样返回任何行。那样行吗?

    DECLARE cur MyPackage.cursor_type;
    BEGIN
      MyPackage.GetData(id => 1234, o_cur_out => cur);
    END;
    
  3. 在 SSIS 中,如何调用此过程来获取数据?它只有 2 个选项“表或视图”和“SQL 命令”?

4

1 回答 1

1

当您运行代码块时,它不会返回任何行。但是,它确实返回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)
;
于 2013-10-17T09:02:06.313 回答