CLOB in – CLOB out -> Grails + SQL

Zdarza mi się w pracy pisać troszkę więcej niż tylko CRUDy.  Pewnego dnia wynikła potrzeba przekazania CLOBa do procedury w SQLu i odebranie kolejnego CLOBa z wyjścia procedury. W Grailsach? Nic prostszego.

Pierwszy problem – stworzenie CLOBa w grailsach. Okazało się, że nie mogę go stworzyć za pomocą new CLOB(). To by było za proste. Do stworzenia CLOBa potrzebuję połączenia z bazą danych (wstrzyknięte – magia), a potem ustawiam mu wartość na pożądanej pozycji (najlepiej na początku). Trzeba wiedzieć, że pozycje w CLOBie numeruje się od 1…

https://gist.github.com/jezinka/d6c35578d7554c2f57fa899911f7d1e1
clob in

Wywołanie procedury SQLowej jest dość standardowe:

https://gist.github.com/jezinka/5bc21c226656b0b683c9b3fa650a3882

Pod kolejne ’?’ będą podstawiane pod kolejne argumenty z tablicy przekazanej jako drugi parametr w wywołaniu funkcji call.

Jako, że na wyjściu procedury też jest CLOB, trzeba jeszcze dorzucić jeden parametr do wywołania funkcji call. To groovy, więc jeśli ostatni parametr jest typu closure to można go wynieść poza nawias:

https://gist.github.com/jezinka/be25fbdd33af38e8a86dc9e6376b0e11
closure

Podłączam się pod strumień i pobieram text. Korzystam z characterStream żeby nie zgubić unicode’ów. Do tego zabezpieczam się przed nullami, bo bazie nigdy nie można ufać 😉 

Na koniec można zebrać wszystko w jedno, zadeklarować odpowiednie zmienne i otoczyć na wszelki wypadek try/catchem:

https://gist.github.com/jezinka/b2e5af740508df54514fde7501f6fdd5
clob in – clob out

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.