2016-04-02 13 views
0

Bir iş hatasından geldim. İş PLS'de offcid ve spool dosyası ile çağrıldı. Biriktirme dosyasını kontrol ettiğimde hata geçersiz sayıldı. Sorguyu PLS'de ayrı ayrı offcid'i geçerek ayrı ayrı yürüttüğümde, hatanın, offcid'in where maddesinde dinamik olarak iletildiği bir seçim sorgusunda geldiğini öğrendim. Dinamik SQL, hemcinsinden farklı bir yan tümce ve aynı sözcükle aynıdır.

where offcid = &2; 

detayları daha kontrol i ve Madde sadece seçme maddesi farklılık göre bir birden fazla, eşit sorgu olduğu bulunmuştur da (hiçbir group by) ama bu iyi çalışıyor. Offcid işinde 43 olarak geçiyor. Üst düzey geliştiricilerin önerisi üzerine tabloyu taradık ve çıkardığımız kaynak tablodaki bir kayıt için offcid sütununda karakter değeri olduğunu gördük ve sorgu iyi çalıştı.

Bu senaryoda karşılaştığım bir başka şey de aynı senaryoda aynı sorgu altında aynı sorgulamada aynı hatayla karşılaştım. Soruna neyin neden olabileceği hakkında bir fikri olan var mı? Oracle 11g'nin buna sebep olabilecek herhangi bir arka uç kontrolü var mı?

cevap

1

Öyleyse offcid VARCHAR2 olarak tanımlanmış ve sayısal bir sütun değil? Bu durumda büyük olasılıkla, ikame değişkeninizi tırnak içine almak isteyeceksiniz, böylece iletilen değer de bir karakter olarak ele alınacaktır. (Sütunun, sayısal bir sütun olarak tanımlanıp tanımlanmaması başka bir konudur.)

Sorunuzu anlıyorsanız, bir ortamın neden tek bir ortamda "geçersiz sayı" hatasına neden dönüştüğünü bilmek istersiniz. Her iki ortamın da aynı verilere sahip olduğu varsayılıyor mu? Bir dize ile bir sayı karşılaştırmayı denerseniz, Oracle ilk olarak karakter değerini önce bir sayıya dönüştürmeye ve sonucu sayıyla karşılaştırmaya çalışacaktır. bir sayıya dönüştürülebilir '1' Burada dize

SELECT * FROM dual WHERE TO_NUMBER('1') = 1 

ve tüm iyi:

SELECT * FROM dual WHERE '1' = 1 

aslında bu şekilde değerlendirilecektir: Yani böyle bir şey vardır.

SELECT ... where TO_NUMBER(offcid) = 10 

zaman zaman hatta masa yaptığında "geçersiz sayı" hatası alabilirsiniz nedeni: 2, 10, diyelim ki, ile ikame edildiği & eğer durumda

, sorgu olarak değerlendirilecektir bir sayıya dönüştürülemeyen offcid değerlere sahip olmanız, Oracle'ın bir sayıya dönüştürülemeyen bir değer içeren bir satırı gerçekten dikkate alıp almadığına bağlı olarak değişir. Bu, sorgu için kullanılan yürütme planında sürüyor.

Diyelim ki var diyelim böyle bir sorgu:

SELECT ... FROM some_table where TO_NUMBER(offcid) = 17 AND another_column = 4 

ve Oracle tam tablo some_table taraması yoksa senin kusurlu satır offcid etti = 'ONE7' ve another_column = 2

diyelim tüm satırları karşılaştırır ve bir sayıya dönüşemeyen bir değere ('XYZ') dönüşemeyen satır çarptığında hataya girersiniz. Ancak, eğer Oracle, else_column = 4 ile satırları izole etmek için ilk önce kullanmayı seçen bir else_column üzerinde bir dizininiz varsa, bu, bir başka_column = 2 ile satırlara bakmaz ve 'XYZ' yi bir sayıya dönüştürmeye çalışmayacaktır. hatayı alamazsınız.

Çünkü kullanılan farklı yürütme planlarının iki tam olarak aynı sorgu ile tam olarak aynı verilerle ortamları ancak sahip olmak mümkündür (veritabanı versiyonları şekilde değişikliklere neden bilinmektedir sorgu etkileyebilir iyileştirici çalışmalar planlar) sorgunuz tek bir ortamda iyi çalışabilir, ancak diğerinde başarısız olabilir.

Bu mantıklı mı?

İlgili konular