2009-02-26 17 views
2

Kayıtlarınızı PL/SQL'de% ROWTYPE özniteliğini kullanarak tanımlamanın iyi bir uygulama olduğunu duydum. Bu, yazmayı kaydeder ve bir sütun eklendiğinde veya silindiğinde bile paketinizin çalışmaya devam etmesini sağlar. (Yanılıyorsam düzeltin!)PL/SQL: Bir imleçten 2 veya daha fazla birleştirilmiş tablo almak için en iyi uygulama?

Ancak, bir birleştirmeyi içeren bir imleç getirilirken, (muhtemelen oldukça uzun) içeren bir programlayıcı tanımlı kayıt almam gerektiğini anladım. Birleştiren tarafından döndürülen her sütunun elle yazılmış listesi.

Yani benim soru: o yuvalanmış kayıtlarına getirme veya kayıtların bir liste halinde getirme veya şey böyle çirkin bir kludge önlemek için yapmak mümkün mü? Denediğim her şey, imleç tarafından döndürülenle eşleşmeyen kayıtla ilgili bir hataya neden oluyor.

Bir imleç kullanarak bir birleştirme sonucunun döndürülmesi, böyle bir şey, bir aramada ortaya çıkmadığı garip, benim için yaygın bir kullanım durumu gibi görünüyor.

Teşekkür ederiz.

+0

"Satır eklendiğinde veya silindiğinde bile" dediğinizde farz ediyorum. "Bir sütun eklendiğinde veya silindiğinde bile" demek istediniz. –

+1

Bu bir klozdan oldukça uzak. Tam olarak çalışması gereken yol. –

cevap

8

İmleç% rowtype kullanıcısını kullanabilirsiniz.

Örnek:

declare 
cursor c_c is 
select emp.*, dept.* -- use aliasses if columns have same name 
from emp 
, dept; -- for sample no join condition 

r_c c_c%rowtype; 

begin 
    for r_c in c_c loop -- with for loop even the definition of r_c is not needed. 
    ... 
    end loop; 
end; 
/
+0

Vay! Harikasın. Ben bunu hiç düşünemezdim. Teşekkürler. –

+1

Kullanmakta olduğunuz kullanım örneğinde (cc ... için r_c için), r_c değişkenini veya türünü bildirmek bile gerekli değildir. For döngüsü dolaylı olarak yapar. Ancak, açık FETCH'lar yapmanız gerekiyorsa, bu kesinlikle yararlıdır. –

5

Neden bile imleç bildiriminde ile rahatsız?

Bu eşdeğerdir.

begin 
    for r_c in (select emp.*, dept.* from emp, dept) loop 
    ... 
    end loop; 
end; 

Yorumunuzdan bahsetmişsinizdir. Ama ben açıkça kullanılan imleç sözdizimini görüyorum, bence çok önemli.