2014-12-30 98 views
0

我是Oracle和存儲過程的新手。我只是想知道它是否有可能(例如在SQL Server中)將字段名稱的記錄集返回給extern程序。我讀了一些文件,但我不確定我是否在正確的軌道上。當我使用Sys_Refcursor時,我只能返回一個字段,而不是我想要的那樣多。Oracle存儲過程返回字段名稱的記錄集

我需要返回多個字段名稱,我有一個輸入參數。

在程序的文檔,我對SQL Server的一個例子,我想有同樣爲我的Oracle存儲過程:

Use 
Go 
Set Ansi_Nulls ON 
Go 
Alter Procedure 
    @InputLocation Varchar(255) 
As 
Begin 
    Set Nocount On; 
    select FirstName as '@FirstName', Company as '@Company' from dbo.company where Location = @InputLocation 
End 

是否有任何建議,我該怎麼辦呢?如果你需要一些額外的信息,請讓我知道。謝謝。

/編輯:

我的示例代碼(不使用在第一步中輸入參數,只是用於生成輸出,看看它的工作原理):

create or replace 
PROCEDURE TEST_PROZEDUR1 (
    Input_Location IN Varchar2, 
    First_Name OUT SYS_Refcursor, 
    Company OUT Sys_Refcursor) IS 
BEGIN 
    open First_Name For Select FirstName from dbo.company; 
    open Company For Select Company from dbo.company; 
END TEST_PROZEDUR1; 
+0

'sys_refcursor'會導致任何查詢的結果,這裏你說的是一個字段。請參考http://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php – Exhausted

+0

這個例子中的字段是'@Firstname'和'@Company'(在Oracle中:名字,:公司)。調用程序需要帶字段的記錄集。如果我返回其中的一個,它會起作用,但是如果我將它們都返回,我只能得到我的代碼中提到的第一個。在SQL Developer中,我可以看到兩個變量。這是可以理解的嗎? – triplus

+1

在Plsql上發佈你的示例代碼可能有助於回答 – Exhausted

回答

0

用於PL的編程模型/ SQL和TSQL是不同的。你可能會在TSQL中返回一個記錄集,在PL/SQL中你會返回一個遊標。遊標只是一個指向SQL語句的指針,該語句已打開並且可以讀取。它不限於返回一列。粗略地說,在PL/SQL相當於你的TSQL程序上面會是這樣的:

CREATE OR REPLACE FUNCTION GET_INPUT_LOCATION(pinInput_location IN VARCHAR2(255)) 
    RETURN SYS_REFCURSOR 
IS 
    cCursor SYS_REFCURSOR; 
BEGIN 
    OPEN cCursor FOR 
    SELECT FIRSTNAME, 
      COMPANY 
     FROM COMPANY 
     WHERE LOCATION = pinInput_location; 

    RETURN cCursor; 
END GET_INPUT_LOCATION; 

然後調用者將調用此函數爲:

DECLARE 
    cCursor  SYS_REFCURSOR; 
    strFirstname COMPANY.FIRSTNAME%TYPE; 
    strCompany COMPANY.COMPANY%TYPE; 
BEGIN 
    cCursor := GET_INPUT_LOCATION('SOMEWHERE OVER THE RAINBOW, INC.'); 

    FETCH cCursor 
    INTO strFirstname, 
     strCompany; 

    CLOSE cCursor; 
END; 

不過,我可能不會代碼時這辦法。如果COMPANY.LOCATION是獨一無二的,那麼當返回一個光標時,你會遇到很多麻煩,調用者在完成它時可能需要記住關閉它們,而這些光標可能會忘記做。相反,我只是使用輸出參數返回FIRSTNAME和COMPANY字段;例如

CREATE OR REPLACE PROCEDURE GET_INPUT_LOCATION 
    (pinInput_location IN VARCHAR2(255), 
    poutFirst_name OUT COMPANY.FIRSTNAME%TYPE, 
    poutCompany  OUT COMPANY.COMPANY%TYPE) 
IS 
    cCursor SYS_REFCURSOR; 
BEGIN 
    SELECT FIRSTNAME, 
     COMPANY 
    INTO poutFirst_name, 
     poutCompany 
    FROM COMPANY 
    WHERE LOCATION = pinInput_location; 
END GET_INPUT_LOCATION; 

分享和享受。

+0

非常感謝。這真的幫了我很多。但是,即使我的系統目前還不能使用。出於好奇和未來的問題。如果表格在開始時不知道,是否有可能,如何解決?我需要確定過程中的表格,然後交出所有「字段」。任何表格中的「字段」數量都是無關緊要的。 – triplus

+0

[通讀DBMS_SQL文檔](http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sql.htm#BABEDAHF)。祝你好運。 –