2016-01-22 18 views
9

Bu sorunda ele alınan işlev, verilen SQL komut dosyasını yürütmektir. Komut dosyasının içeriği, uygulama çalışma zamanı sırasında kullanıcı tarafından tanımlanmak üzere tasarlanmıştır. Komut dosyası, bir INSERT ifadesinin veya karmaşık bir PL/SQL ifadesinin bir sırasının olup olmadığı olabilir. Çalışma zamanı sırasında girdi (nihayetinde String örneği olarak) olduğundan, Java ile yürütülmelidir.Java'da SQL komut çalıştırması için genel yaklaşım

Güncel yaklaşım, kullanıcı girdisini bir PreparedStatement ile sarmak ve yürütmek içindir. Bu çözüm mevcut test durumları için çalışır. Esas endişe, kullanılan veritabanının, testler tarafından kapsanmayan tam işlevselliğini sağlamaktır, yani aynı kullanıcı SQL komut dosyasını veritabanı satıcısının sağladığı konsola aktarmaya en yakın olan çözüm.

Şu anki yaklaşımda PreparedStatement ile öngörülen herhangi bir sınırlama bulunmadığını merak ediyorum? Java ile SQL betiğinin yürütülmesi için daha iyi bir genel yaklaşım var mı?

+0

Tam olarak ne yapmaya çalışıyorsunuz? Sadece her şeyi çalıştırmak istiyor musunuz, http://sqlfiddle.com/ gibi bir şey yaratmaya mı çalışıyorsunuz? –

+1

Güvenlik açıkları burada bir endişe kaynağı mı? Komut dosyasının potansiyel olarak istenmeyen veya tehlikeli bir şey yapmasını engellemek için yeterli kısıtlamalar var mı? (Kullanıcının veritabanında yer alan ayrıcalıkları aracılığıyla?) –

+0

@SteveChambers, kullanıcı kendi veritabanını değiştirdiği ve tamamen sorumlu olduğu için güvenlik açığıyla ilgili endişeler yoktur. Temel sorun, veritabanının tam işlevselliğini en verimli şekilde sağlamaktır. –

cevap

4

Eh, bu geniş tasarım sorudur ama yapılabilir çeşitli adımlar olduğunu düşünüyorum:

  • SQL komut ayrıştırma ve tanıma: Sen SQL hangi modelini tespit edebilmesi gerekir sahip olduğunuz komut dosyası: PL/SQL, DML, DDL, CDL, TCL, ";" vb.
  • yapı bildirimi: her tür sql betiği için, bu ifadeyi java ile yürütebilmeniz gerekir.
  • Sonuç ayrıştırma. Döndürülen SELECTs ve isteğe bağlı olarak işlevler tarafından döndürülen parametreleri veya etkilenen/eklenen satırların sayısını toplayabilmeniz gerekir.
  • hata işlenirken: işler beklendiği gibi çalışmadığında SQL Komut Dosyası'na ne olduğunu bildirmeniz gerekir.

düşünün:

  • Bu SQL Client programlanması gibi görünüyor. Eğer değilse lütfen ne yapmak istediğinizi açıklayın. Bunu normal bir uygulamada bağlantı katmanı olarak kullanmayın. Son derece verimsiz olacak ve SQL enjeksiyonlarına karşı savunmasız olacaktır (Sadece komşu virgüllerden çok daha karmaşıktır)
  • Dış parametrelerle işlevler yürütme işlevlerini çağırmak isteyebilirsiniz.
  • Bu, sözdizimi vurgulama gibi kullanıcı arabirimleri özelliklerini içermez. Parametreler arayüzleri, vb ...
+0

Sorunun güncellenmesi, @borjab Lütfen –

+0

sorununun yeni versiyonunu göz önünde bulundurun, yukarıdaki adımların çoğunda yardımcı olabilecek bir [açık kaynak projesi] (https://github.com/jonheller1/plsql_lexer) inşa ettim. SQL \ * Plus'ın ifadeleri nasıl ayırabileceğine benzer ifadeleri bölebilir, bu nedenle onlarla ne yapılacağını bildiğinizden, gereksiz noktalı virgüllerden (bazı ifadelerin bunlara ihtiyaç duyduklarından ve bazılarının yapılmadığından) ve SQL \ * Plus'a benzer geri bildirim sağladığından "5 satır birleştirildi." Hepsi PL/SQL'de ama Java'dan çağırmak mümkün olmalı. –

0

akla gelen PreparedStatement ilk sınırlama - Bir saklı yordam bir OUT parametre (ler) kayıt mümkün olmaz, CallableStatement arayüzüne içine bakmak isteyebilirsiniz .