2010-07-30 24 views
13

Satırları bir declare/begin/end bloğu içindeki select deyiminden döndürmek istiyorum. Bunu T-SQL'de yapabilirim ama PL/SQL'de nasıl yapılacağını bilmek isterim. Eğer gösterdiğin gibi bir şey "dönüş" olamaz,Oracle'da bir bildirim/başlangıç ​​/ bitiş bloğundan satırları nasıl gönderilir?

declare 
    blah number := 42; 
begin 
    select * 
    from x 
    where x.value = blah; 
end; 
+0

Geri dönülemezsiniz anonim PLSQL bloğundan veri. –

+0

Evet, örneğin, 'node oracledb' içinde 'oracledb.Bind_OUT' seçeneğini kullanabilirsiniz. Https://github.com/oracle/node-oracledb/blob/master/doc/api.md – Toolkit

cevap

10

Anonim PL/SQL bloğu:

kod aşağıdaki gibi biraz görünüyor. Bununla birlikte, arayan değişkenlerle bağlama ile etkileşime girebilir.

Bu durumda kullanacağım yöntem, bir imleç başvurusu bildirmek, istenen sorgu için PL/SQL bloğunda açmak ve çağıran uygulamanın satırları satırdan almasına izin vermek olacaktır. Eğer o zaman değerleri geri dönebilirler saklı fonksiyonu olarak PL/SQL recast Eğer

variable rc refcursor 

declare 
    blah number := 42; 
begin 
    open :rc for 
    select * 
    from x 
    where x.value = blah; 
end; 
/

print x 

: SQLPlus olarak şu şekilde görünecektir.

CREATE TYPE number_table AS TABLE OF NUMBER; 

CREATE FUNCTION get_blah_from_x (blah INTEGER) 
    RETURN number_table 
    IS 
    values number_table; 
    BEGIN 
    SELECT id 
     BULK COLLECT INTO values 
     FROM x 
     WHERE x.value = blah; 
    RETURN values; 
    END; 
/
+0

Teşekkürler - güzel cevap! Bu durumda bir imleci kullanmanın performans etkileri nelerdir? Her zaman T-SQL'deki kötü performanslarından kaçınmaya çalışıyorum. –

+1

Bir imleç, sonuç kümesine yapılan referanstan başka bir şey değildir. Performans cezası, her kaydı getirme arasında yer alan gidiş gelişlerden kaynaklanmaktadır. Ancak, Oracle'a karşı çağırdığınız her seçim, bir imleç biçiminde size iade edilir. Net'de DataReaders olarak adlandırılır. Bununla ilgili herhangi bir sorun yaşamadığı zaman, imleçlerle ilgili çok fazla sorun yaşamayacaksınız. –

0

Eh, bu veri erişim kütüphaneye büyük ölçüde bağlıdır: Yapmak istediğiniz ne olabilir Bu durumda, bir koleksiyon türü oluşturmak için bu türden bir değişken içine tüm satırları getirir ve geri olduğunu.

Herhangi bir SQL uyumlu türünü parametre olarak döndürebilirsiniz. Bu karmaşık SQL türleri ve koleksiyon türlerini içerir. Ancak çoğu kütüphane, Oracle'ın nesne türlerini kullanamaz.

iki şekilde de, benim örnekler bu nesne türlerini kullanacak:

begin 
    :list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c')); 
end; 

: Erişim kütüphane nesne türlerini işleyebilir zaman

create type SomeType as object(Field1 VarChar(50)); 

create type SomeTypeList as table of SomeType; 

, sadece PL/SQL nesnelerin listesini geri dönebilirler Değilse, bu listeyi bir seçime zorlayarak ve bir imleç olarak sonucunu döndürerek buralarda hacklemiş olabilirsiniz:

declare 
    list SomeTypeList; 
begin 
    list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c')); 
    open :yourCursor for 
    SELECT A 
    FROM table(list); 
end; 
İlgili konular