2009-09-14 13 views
31

Bu, Oracle'la ilk defa uğraştığım ve neden bu hatayı aldığımı anlamakta zorlanıyorum. Ben w Oracle'ın ODT.NET kullanıyorumOracle "ORA-01008: tüm değişkenler bağlı değil" Hata w/Parametreleri

/a sorgunun nereye fıkrada aşağıdaki kodla C#:

WHERE table.Variable1 = :VarA 
    AND (:VarB IS NULL OR table.Variable2 LIKE '%' || :VarB || '%') 
    AND (:VarC IS NULL OR table.Variable3 LIKE :VarC || '%') 

ve ben şöyle parametre değerlerini ekliyorum:

cmd.Parameters.Add("VarA", "24"); 
cmd.Parameters.Add("VarB", "test"); 
cmd.Parameters.Add("VarC", "1234"); 

Ben bu sorguyu, sunucu döndürür çalıştırın:

ORA-01008: not all variables bound 

Ben '.... (AND' satırları birini dışarı yorum, sorgu comp başarılı olur.

Yalnızca iki parametreyle sorgularken, ancak üç ile değil, sorgu neden doğru şekilde yürütülüyor? Hatta mantıklı değil alıyorum hata

+0

için Sql değiştirebilir? –

cevap

42

oracle ODP.Net sağlayıcı varsayılan olarak konumu ile bağlama kullanır. Davranışa isme göre değiştirmek için. BindByName özelliğini true olarak ayarlayın. Dahası, parametrelerin çift tanımını reddedebilirsiniz.

using(OracleCommand cmd = con.CreateCommand()) { 
    ... 
    cmd.BindByName = true; 
    ... 
} 
+0

daha mantıklı… Dün parametreleri yeniden düzenledim ve değişkenin pozisyonuyla değil de (iyi olan) değişkenin pozisyonuyla bağlandığını fark ettim; Bunu değiştirmek için bir seçenek olduğunu fark etmemişti – John

+0

Bu güzel Christian13467! Bu yüzden, yerel Oracle Net Veri Sağlayıcısı ile deneyimlerimi 8i'den 10g'a kadar bilmedim. Bu cevap için teşekkürler. –

+1

Mükemmel çözüm. Parametreleri kopyalamaktan çok daha iyi. @John - Bu cevabı kabul etmeyi gerçekten düşünmelisiniz, eğer yapabilirsem - 13000'den fazla kişi sorunuzu daha önce gördü, önce daha iyi bir seçenek görmeliydiler.(Üzgünüm Tony) – Kobi

23

O aptal görünüyor, ama iki kez ayarlamak zorunda iki kez aynı bağlama değişkeni kullandığınızda düşünüyorum:

cmd.Parameters.Add("VarA", "24"); 
cmd.Parameters.Add("VarB", "test"); 
cmd.Parameters.Add("VarB", "test"); 
cmd.Parameters.Add("VarC", "1234"); 
cmd.Parameters.Add("VarC", "1234"); 

Kesinlikle o Yerli ile doğru PL/SQL dinamik SQL:

SQL> begin 
    2  execute immediate 'select * from emp where ename=:name and ename=:name' 
    3  using 'KING'; 
    4 end; 
    5/
begin 
* 
ERROR at line 1: 
ORA-01008: not all variables bound 


SQL> begin 
    2  execute immediate 'select * from emp where ename=:name and ename=:name' 
    3  using 'KING', 'KING'; 
    4 end; 
    5/

PL/SQL procedure successfully completed. 
+0

Bu işe yaradı ... bu malikanede hareket edeceğine inanamıyorum, ama işe yaradı, bu yüzden onu alacağım! Teşekkürler! – John

+1

Sadece birden çok kez belirtilmesi gerekmiyor, aynı zamanda sorguda göründükleri sıraya eklenmeleri gerekiyor. –

+0

Çok eski bir gönderiye sırt atmak istemem ama ... (birden çok kez kullanıldıysa birden fazla parametre eklemek zorunda olan) bu durumun hala geçerli olduğunu kimse bilmiyor mu? Bir şeyin benim için yerel olarak çalıştığı garip bir senaryo ile uğraşıyorum, ancak Üretimdeki bir kullanıcı tarafından çalıştırıldığında başarısız oldu. Şu andaki değişikliği destekledik, ancak '01008' hatasının neden sadece kullanıcıya gösterildiğine dair bir kayıp. –

2
Ayrıca VarB herhangi değeri için '%' sağlamak için müşteri alma sonra

table.Variable2 LIKE '%' || :VarB || '%' 

için Sql değiştirerek Sql yinelenen parametre adları için ihtiyacını ortadan kaldırarak ve dikkate yerine olabilir

boş. Bazı yönlerden bunun daha doğal olduğunu düşünüyorum.

Ayrıca Çalıştırılırken önce SQL deyimi yazdırmak için DBMS_OUTPUT kullanabiliyor musunuz

table.Variable2 LIKE '%' || IfNull(:VarB, '%') || '%'