Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用Oracle过程创建数据流任务以返回数据?_Sql_Oracle_Plsql_Ssis - Fatal编程技术网

Sql 如何使用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中,如何调用此过程来

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

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

  • 在SSIS中,如何调用此过程来获取数据?它只有两个选项“表或视图”和“SQL命令”


  • 运行代码块时,它不会返回任何行。但是,它确实返回一个
    光标
    ,指向可以使用该光标变量
    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)
    ;