2009-11-09 8 views
0

J'ai le petit script Groovy suivant qui fait juste le nombre de lignes dans la base de données pour une date spécifique.Comment utiliser PL/SQL to_date avec une variable dans Groovy?

import groovy.sql.Sql 

def today= new GregorianCalendar() 
def dateString = "${today.get(Calendar.MONTH)+1}/${today.get(Calendar.DAY_OF_MONTH)-1}/${today.get(Calendar.YEAR)}" 

def sql = Sql.newInstance("jdbc:oracle:thin:bc/[email protected]:1521:billctr", "bc","bc", "oracle.jdbc.OracleDriver") 

def sqlLine = "select count(id) as count from bc_payment where trunc(paymentdate) = to_date(${dateString}, \'MM/DD/YYYY\')" 
println(sqlLine) 
def payCount = sql.execute(sqlLine) 
println payCount 

to_date nécessite Si je les laisse guillemets simples autour de la date où vous passez. Off, je reçois SQLException: Invalid column type mais si je mets \ » autour de la variable, je reçois un avertissement de Groovy

WARNING: In Groovy SQL please do not use quotes around dynamic expressions (which start with $) as this means we cannot use a JDBC PreparedStatement and so is a security hole. Groovy has worked around your mistake but the security hole is still there. The expression so far is: select count(id) as count from bc_payment where trunc(paymentdate) = to_date('?', 'MM/DD/YYYY') 

Y a-t-il une meilleure façon de le faire sans to_date ou en formatant la variable différemment? Je suis nouveau à Groovy donc toutes les suggestions sont les bienvenues. Merci d'avance!

Répondre

2

Essayez ce qui suit (je l'espère, je ne l'ai pas introduit une erreur de syntaxe, pas Groovy ici ...)

import groovy.sql.Sql 

def today= new java.sql.Date(new java.util.Date().getTime()) 

def sql = Sql.newInstance("jdbc:oracle:thin:bc/[email protected]:1521:billctr", "bc","bc", "oracle.jdbc.OracleDriver") 

def sqlLine = "select count(id) as count from bc_payment where trunc(paymentdate) = ?" 
println(sqlLine) 
def payCount = sql.execute(sqlLine, [today]) 
println payCount 

Edit: remplacé

def today = new Date() 

avec

def today= new java.sql.Date(new java.util.Date().getTime()) 
+0

Je pense que vous avez besoin d'une instance java.sql.Date afin de la comparer à une colonne Date sans horodatage. –

+0

Merci Christoph, je pense que je l'ai réparé. –

1

En fait, vous pouvez lire les paramètres de l'instance SQL à partir de la source de données en faisant le suivant:

def _url  = ConfigurationHolder.config.dataSource.url 
def _username = ConfigurationHolder.config.dataSource.username 
def _password = ConfigurationHolder.config.dataSource.password 
def _driver = ConfigurationHolder.config.dataSource.driverClassName 

def sql = Sql.newInstance(_url, _username, _password, _driver) 

// For the paging 
def int max = Math.min(params.max ? params.max.toInteger() : 25, 100) 
def int offset = params.offset.toInteger() 
def int last = offset + max 

def month= params.month_value 

J'utilise Oracle TO_DATE et TO_TIMESTAMP fonction. Dans mon cas, il est comme suit:

query = "select * from " + 
      "(SELECT reporting.id, " + 
      "company_id as comp, " +  
      "to_date(TO_CHAR(invoice,'dd.mm.YYYY')) as invoice, " + 
      "TO_CHAR(last_updated,'dd.mm.YYYY HH:MI') as erstelltAm, " + 
      "row_number() over (" + sortByStr + ") as row_num FROM reporting, company " + 
      "WHERE reporting.company_id = company.id) " + 
       "reporting.month = TO_TIMESTAMP(" + month + ", 'dd.mm.yy')"" 
     "where ROW_NUM between " + offset + " and " + last; 
2

Réponse tardive par un développeur avec des problèmes similaires.

J'ai trouvé que le problème pourrait être résolu en changeant la déclaration:

def sqlLine = "... ${yourString} ..." 

... qui crée sqlline comme GStringImpl-objet. Si à la place, vous déclarez sqlLine comme ceci:

... nous résolvons les variables en ligne et recevons un objet String. De cette façon, groovy.sql.Sql ne sait jamais que nous avons créé le sql dynamiquement.

+0

Vous n'avez pas fixé le risque de sécurité, vous avez juste fait croire à Groovy qu'il n'était pas capable de le repérer et qu'il ne montre donc pas l'avertissement. –

Questions connexes