2009-03-03 9 views
3

Bir Oracle işlevinden sonuç tablosu döndürmek istiyorum. Bir imleci kullanmak en kolay olurdu, ancak bunu yapmak zorunda olduğum uygulama bir imleci dönüş değeri olarak kabul etmeyecek. Alternatif, bu işlevle birlikte ilerlemek için bir tip (bir pakete sarılmış) oluşturmaktır. Ancak, tablo türlerini döndürebilmem için birkaç tip (yazım için 4+ işlevim var) oluşturmak biraz gereksiz görünüyor. Kayıp olduğum bir alternatif var mı?Bir tablo özel bir tür veya imleç olmadan bir Oracle işlevinden nasıl döndürülür?

+0

Gereksiz mi? GRUP BY yan tümce seçim listesinde bir toplu işlev varsa, gereksiz olduğunu düşünüyorum, ama hey, ne olduğu. –

+0

Veritabanını kullanan ne tür bir uygulama imleçleri kabul etmez ??? – kurosch

cevap

3

GÜNCELLEME: TABLE solution withou limit için ilk yorumu görün. Bir VARRAY veya kullanım

geri onlardan sorgulamak için fonksiyonunu boruhatlı.

  • bir ayrıntı için this makalesinde VARRAY görünüm için. Aşağıdaki kod örneği:

    CREATE OR REPLACE TYPE EMPARRAY is VARRAY(20) OF VARCHAR2(30) 
    /
    
    CREATE OR REPLACE FUNCTION getEmpArray RETURN EMPARRAY 
    AS 
        l_data EmpArray := EmpArray(); 
        CURSOR c_emp IS SELECT ename FROM EMP; 
    BEGIN 
        FOR emp_rec IN c_emp LOOP 
        l_data.extend; 
        l_data(l_data.count) := emp_rec.ename; 
        END LOOP; 
    RETURN l_data; 
    

    END;

  • için PIPELINED işlevler here. Kod örneği: bu uygulama geliştiricileri uygun olup olmadığından

    create or replace function Lookups_Fn return lookups_tab 
        pipelined 
    is 
        v_row lookup_row; 
    begin 
        for j in 1..10 
        loop 
        v_row := 
         case j 
         when 1 then lookup_row (1, 'one') 
         --... 
         when 7 then lookup_row (7, 'seven') 
         else  lookup_row (j, 'other') 
         end; 
        pipe row (v_row); 
        end loop; 
        return; 
    end Lookups_Fn; 
    /
    
    select * from table (Lookups_Fn); 
    
+0

Neden bir VARRAY kullanın ve maksimum olarak 20 sonuç? Kullanım Tablosu: CREATE VEYA TİP EMPARRAY DEĞİŞTİRME VARCHAR2'DİR (30). –

+0

BECAUSE, TYPES kullanarak AVOID kullanmaya çalıştığını söyledi. OP –

+0

@Mark Pipelined AVOID ipuçlarını okuyun, değil mi? – FerranB

1

Her zaman işlevinden XML geri dönebilirler.

XML, ne yüklediğinize ve hangi sürüme kullandığınıza bağlı olarak Oracle'da bir dizi yoldan üretilebilir.

XMLTYPE, belirli bağlamlarda çok kullanışlıdır ve XMLElement, XMLAttributes, XMLAgg, vb. Yerleşik işlevleri kullanarak SQL'den üretilebilir. İstemci XMLTYPE'yi desteklemiyorsa, CLOB değerlerine kolayca dökülebilir. değil en iyi (IMO) seçeneği dbms_xmlgen paketi kullanmak olsa belki en basit

:

SQL> set serveroutput on size 1000; 
SQL> exec dbms_output.put_line(dbms_xmlgen.getXML('select * from dual')); 

Çıktı: Tek içinde size "Tablo" sonuç verir

<?xml version="1.0"?> 
<ROWSET> 
<ROW> 
    <DUMMY>X</DUMMY> 
</ROW> 
</ROWSET> 

CLOB değeri.

İlgili konular