2009-06-30 64 views
3

我在Oracle 11g服務器中有一個存儲過程,該過程具有記錄的變量。我無法編輯此程序。我正在創建一個將調用該過程並返回記錄集中的信息的函數。我在這裏看到以下問題:past question從記錄收集類型中選擇數據

我的問題是我可以創建一種記錄類型,並直接在SQL查詢它?或者我是否需要將記錄轉換爲類型對象併爲其創建直接查詢的表類型?

+0

您使用的是什麼RDMS?在存儲過程中你可以做什麼因平臺而異。 – 2009-06-30 17:49:20

+0

對不起,我正在使用oracle 11g – Slowbie 2009-06-30 18:01:27

回答

1

您的鏈接指向的問題被標記爲Oracle,所以我假設這就是您正在使用的。

最簡單的方法可能是返回一個CURSOR

 
SQL> VAR cr_dual REFCURSOR 

SQL> BEGIN 
    2   OPEN :cr_dual FOR 
    3   SELECT 1 
    4   FROM dual 
    5   UNION ALL 
    6   SELECT 2 
    7   FROM dual; 
    8 END; 
    9/

Процедура PL/SQL успешно завершена. 

SQL> PRINT cr_dual 

     1 
---------- 
     1 
     2 
0

,如果你只接收到一個記錄,你知道記錄定義,你應該能夠記錄的現場直接的名字。

例如:

CREATE OR REPLACE FUNCTION myFunction(theRecord IN myrecord%TYPE) RETURN NUMBER 
IS 
BEGIN  
    RETURN recordInstance.itemA; 
END myFunction; 

請注意您可能能夠解決這個問題:

TYPE myrecord IS RECORD (
     itemA NUMBER, 
     itemB myTable.columnName%TYPE 
); 

,當你有myrecord類型的記錄,你可以在這樣的方式引用意達在你的調用代碼中簡單地處理原始過程返回的記錄類型。

0

你可以嘗試varray。

首先 -

create or replace type addr_type 
as object 
(name varchar2(20) 
,city varchar2(20) 
) 

並創建VARRAY作爲

create or replace type varr_addr as varray(10) of addr_type 
/

現在你可以用varr_addr返回工作。舉個例子:

SQL> create or replace procedure ret_user_addr (p_out out varr_addr) 
    2 is 
    3 begin 
    4 p_out := varr_addr(addr_type('NAME1','CITY1'),addr_type('NAME2','CITY2')); 
    5 end; 
    6/

Procedure created. 

SQL> sho err 
No errors. 

現在,你需要有從那裏你call.And你可以從表(VARIABLE_NAME)選擇,你會做正確配置了變量。

3

RECORD是一個PL/SQL概念。所以我們不能創建基於RECORD的TABLE TYPE,並在SQL語句中使用該TYPE。 SQL只能識別在SQL中創建的TYPE。

所以,如果我正確理解你的場景,你需要在SQL中創建一個對象和/或嵌套表。然後您的函數可以調用該過程並將RECORD轉換爲嵌套表格。嵌套表可以被返回或流水線化。

1

最終這個問題是爲了創建一個基於存儲過程邏輯的視圖並直接從中查詢。