2013-05-20 3 views
5

JDBC SQL 쿼리에서 문자열을 사용하는 것에 대한 질문이 있습니다. 여기에 두 가지 예가 나와 있습니다. 둘 다 기대하지만 작동하지는 않습니다. 오류 변형에서

작업 버전 ...

tabl = "Action" 
    query = "SHOW FULL COLUMNS FROM `Action`;" 
    println " "+ query 
    dbConnection.eachRow(query){ 

는 :

tabl = "Action" 
    query = "SHOW FULL COLUMNS FROM `${tabl}`;" 
    println " "+ query 
    dbConnection.eachRow(query){ 

오류는 다시는 SQL 구문 오류로 제공됩니다. 보시다시피 문장은 문자 그대로 동일합니다. 나는 그 범인을 찾기 위해 노력하고 단지 그루비 생각

SHOW FULL COLUMNS FROM `Action`; 
    May 20, 2013 10:52:01 AM groovy.sql.Sql eachRow 
    WARNING: Failed to execute: SHOW FULL COLUMNS FROM `?`; because: 
     Parameter index out of range (1 > number of parameters, which is 0). 
    May 20, 2013 10:52:01 AM groovy.sql.Sql eachRow 

:

출력은 오류, 명령문을 보여줍니다. 리터럴 문자열을 JDBC 연결에 공급할 때 'Action'테이블에서 정상적으로 작동합니다.

누군가가 오류를 설명하고 수정 사항을 제공 할 수 있기를 바랍니다. 그 독서에 대한

, 나는 해결 방법으로이 옵션 발견

query = "SHOW FULL COLUMNS FROM `"+ tabl.toString() +"`;" 

를 사용하여 덜 자세한 옵션을,이있을 수도 있지만 "+"; 나에게 그것은 $ {tabl}을 사용하는 것이 효과가있는 것처럼 느낀다. 사전에

덕분에,

+0

당신이'사용하여 시도 되세요 '$ FROM {TABL을} SHOW FULL COLUMNS를,'(대신 큰 따옴표의 단일 인용 부호에주의)'? – dmahapatro

+0

가능한 중복 [SQL 쿼리에서 db를 동적으로 설정] (http://stackoverflow.com/questions/2267756/dynamically-set-the-db-in-a-sql-query) –

답변

3

나는 문제가 당신이 사용하는 경우에 문자열 변수가 당신이 그것을 사용하지 않는 경우와 다른 개체 유형을 생산하고 있다고 생각합니다. 하나는 String이고 다른 하나는 GString입니다.

def a = "123" 
def b = "abc"+a 
def c = "abc${a}" 
println b.class 
println c.class 

>> 

class java.lang.String 
class org.codehaus.groovy.runtime.GStringImpl 

eachRow 기능이 어떤 이유로 이러한 차이에 민감한 것 같다 :

예컨대,이 스크립트 출력을 참조하십시오.

또 다른 해결 방법은 toString를 호출하는 것입니다 ... 당신이 사용하는 두 가지 기능은 http://groovy.codehaus.org/api/groovy/sql/Sql.html#eachRow(groovy.lang.GString,%20groovy.lang.Closure)

  • http://groovy.codehaus.org/api/groovy/sql/Sql.html#eachRow(java.lang.String,%20groovy.lang.Closure)
    • 하지만 그들은 다르게 행동 줄 이유는 볼 수 없습니다 query 변수에서 - String으로 다시 캐스팅합니다.

      def d = c.toString() 
      println d.class 
      
      >> 
      
      class java.lang.String 
      
    3

    나는 이것을 또한 만났다. 해결 방법이 있지만 더 깨끗한 방법은 org.codehaus.groovy.runtime.GStringImpl 버전에서 toString()으로 전화하는 것입니다. 즉, 준비된 명령문 기능이나 실행에 대한 보호 기능이 필요하지 않은 경우입니다. 이는 원래 문자열을 GString으로보고 있기 때문에 Groovy SQL 엔진이 준비된 명령문으로 변환하려고하기 때문입니다. SQL 주입 공격을 막기 위해 최종 사용자가 제공 할 수있는 값을 사용할 때는이 방법이 필요합니다. 귀하의 경우와 내 관심사가 아니므로 toString() 잘 작동합니다.

    참조 : http://groovy.codehaus.org/Tutorial+6+-+Groovy+SQL

    +0

    이것은 내가 가지고 있었던 것입니다. 해야 할 것. 내 eachRow 메서드는 GString을 사용하여 내 쿼리를 준비된 문으로 변환하려고했습니다. 읽기 전용이므로 사용자가 입력하지 않습니다. sql.eachRow (query.toString()) {// stuff} – Shastings