2013-10-17 36 views
1

我有一個SSIS包,它使用數據流任務與Oracle數據庫連接來運行數據查詢並將其輸出到平面csv文件。現在我需要將此查詢轉換爲在Oracle過程中獲取數據,並從數據流任務中調用此過程。有人爲我創建了一個基本上返回一個Cursor的Oracle過程。現在3個問題在這裏:如何使用Oracle過程創建數據流任務來返回數據?

  1. 我是微軟SQL專家,但不太瞭解Oracle。
  2. 當我在PL/SQL窗口中運行這樣的過程時,它會編譯OK,但不返回任何行,就像在Microsoft SQL Server中所期望的那樣。這可以嗎?

    DECLARE cur MyPackage.cursor_type; 
    BEGIN 
        MyPackage.GetData(id => 1234, o_cur_out => cur); 
    END; 
    
  3. 在SSIS我怎麼調用這個過程來提取數據?它只有2個選項「表或視圖」&「SQL命令」?

+1

「1.I是微軟SQL專家」 - 這是一個很大的來電! :) –

+0

@MitchWheat精選Mitch。但是如果你以比較的方式瞭解我對Oracle的瞭解,那麼你會同意這一點。 :) – RRR

回答

1

當你運行你的代碼塊時,它不返回任何行。但是,它確實會返回一個指向可以使用該遊標變量cur訪問的某些行的cursor - 它是一個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) 
; 
+0

這也是我的建議。這也是一個很好的例子,表格值函數的Oracle相當複雜。 –

相關問題