2009-08-28 16 views
7

'da değişkene nasıl kaydedilir Basit bir prosedür yazarım. Seçim sonucunu değişkende tutmaya çalışıyorum. "INTO INTO" sorgusunu kullanıyorum ama bunu yapamam.Seçim, Oracle prosedürü

Örnek:

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
SELECT * INTO v_employeeRecord 
     FROM Employee WHERE Salary > 10; 
END; 
+0

basit bir örnek ve almak mesajın hatalı bize miyim? –

+0

Yalnızca bir satır saklayabilirim ancak seçim sonuçta çok fazla satır var. –

cevap

11

Bir kaç seçenek var.

DECLARE 
    CURSOR v_employeeRecords IS 
      SELECT * FROM Employee WHERE Salary > 10; 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
    FOR v_employeeRecord IN v_employeeRecords LOOP 
      /* Do something with v_employeeRecord */ 
    END LOOP; 
END; 

Veya, bir TABLE değişkeni oluşturabilirsiniz: Bir imleç içine sorgu dönüşebilecek

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
    v_employeeRecords IS TABLE OF employee%ROWTYPE; 
    i BINARY_INTEGER; 
BEGIN 
SELECT * BULK COLLECT INTO v_employeeRecords 
     FROM Employee WHERE Salary > 10; 

i := v_employeeRecords.FIRST; 
WHILE v_employeeRecords.EXISTS(i) LOOP 
    v_employeeRecord := v_employeeRecords(i); 
    /* Do something with v_employeeRecord */ 
    i := v_employeeRecords.NEXT(i); 
END; 
END; 

Ben Oracle'da bu örnekleri denemedim, bu yüzden derleyici hataları alabilirsiniz ..

+0

İmleç, sorunumu çözüyor. –

+2

"BULK COLLECT INTO" öğesini kullanmalısınız – jva

+0

@jva: Yakalama için teşekkürler! –

7

SELECT'iniz birden fazla satır döndürürse, SELECT INTO synthax öğelerini kullanamazsınız.

Sen resulte seti gezinmek için bir döngü oluşturmak gerekir:

Adam Eğer açık bir imleç nasıl kullanacağını gösterdi ve toplu döngü toplamak. Sana en basit döngü mümkün (örtük imleç, bir BILDIRMEK bölümünü gerekmez) inşa edebilirsiniz nasıl gösterecektir:

BEGIN 
    FOR c_emp IN (SELECT * 
        FROM Employee 
        WHERE Salary > 10) LOOP 
     /* do something with each row, for example:*/ 
     UPDATE foo SET bar = bar + c_emp.salary WHERE id = c_emp.id; 
    END LOOP; 
END; 
+0

İyi örnek, teşekkürler –