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?
cevap
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);
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). –
BECAUSE, TYPES kullanarak AVOID kullanmaya çalıştığını söyledi. OP –
@Mark Pipelined AVOID ipuçlarını okuyun, değil mi? – FerranB
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.
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. –
Veritabanını kullanan ne tür bir uygulama imleçleri kabul etmez ??? – kurosch