Usando funções da Oracle com HSQLDB

Essa é uma dica simples e rápida para quem usa o banco de dados HSQLDB

No meu caso específico, uso o HSQLDB para execução de testes funcionais e como a maioria desses projetos usam BD Oracle para desenvolvimento/produção, algumas queries acabam por conter funções específicas do Oracle, como: to_char, to_date, etc.

Antes de dar a dica, é preciso dizer que esse recurso só funciona para as versões > 2.x do HSQLDB, portanto caso tentem usá-lo na versão 1.8 por exemplo, não será possível. Inclusive tive esse problema no meu projeto, pois como estou usando Grails 1.3.7, o framework por si só já vem com a dependência do HSQLDB 1.8 incluída por padrão e a solução encontrada para contornar isso foi usar o arquivo BuildConfig.groovy, primeiro removendo a dependência da versão 1.8 e depois incluindo a dependência da versão 2.x. Segue:

  1. grails.project.dependency.resolution = {   
  2.     inherits("global") {
  3. 		excludes([group: 'hsqldb', name: 'hsqldb', version:'1.8.0.10'])
  4. 	}
  5.  
  6.     log "warn"
  7.  
  8.     repositories {
  9. 		// Repositorios para os plugins do grails
  10. 		grailsHome()
  11. 		grailsRepo "http://plugins.grails.org"
  12. 		grailsRepo "http://svn.codehaus.org/grails/trunk/grails-plugins"
  13.  
  14. 		// Repositorio necessario pois o maven baixa as dependencias e o grails as encontra no repositorio local
  15. 		mavenLocal()
  16.  
  17. 		// Repositorios da Ideais
  18. 		mavenRepo "http://intranet/archiva/repository/internal/"
  19. 		mavenRepo "http://intranet/archiva/repository/ideais/"
  20. 		mavenRepo "http://intranet/archiva/repository/ideais-snapshots/"
  21. 		mavenRepo "http://intranet/archiva/repository/thirdparty/"
  22.  
  23. 		// Repositorio necessario para que o grails baixe suas proprias dependencias
  24. 		mavenCentral()
  25.     }
  26.  
  27.     dependencies {
  28. 		runtime(
  29. 			[group:'com.oracle', name:'ojdbc14', version:'10.2.0.3.0'],
  30. 		)
  31. 		compile(
  32. 			//Lib para criptografia/descriptografia/mascaramento de numeros de cartao de credito
  33. 			[group:'com.b2w.billing', name:'jsitef', version:'1.0'],
  34.  
  35. 			//Lib para resolver a dependencia do JAXB em ambiente de producao
  36. 			[group:'xalan', name:'serializer', version:'2.7.1'],
  37.  
  38. 			//Libs para o spring-ws plugin
  39. 			[group:'org.springframework.ws',name:'spring-ws',version:'1.5.8', transitive: false],
  40. 			[group:'javax.activation',name:'activation',version:'1.1.1', transitive: false],
  41. 			[group:'com.russmiles.groovy.webservices',name:'client',version:'1.0-SNAPSHOT', transitive: false],
  42. 			[group:'org.springframework.security', name:'spring-security-core', version:'2.0.4', transitive: false],
  43. 			[group:'javax.xml.soap', name:'saaj-api', version:'1.3', transitive: false],
  44. 			[group:'javax.xml.soap', name:'saaj-impl', version:'1.3.2', transitive: false],
  45. 			[group:'org.bouncycastle', name:'bcprov-jdk14', version:'1.43', transitive: false],
  46. 			[group:'stax', name:'stax-api', version:'1.0.2', transitive: false],
  47. 			[group:'wsdl4j', name:'wsdl4j', version:'1.6.2', transitive: false],
  48. 			[group:'org.apache.ws.security', name:'wss4j', version:'1.5.8', transitive: false],
  49. 			[group:'org.apache.ws.commons.schema', name:'XmlSchema', version:'1.4.5', transitive: false], 
  50. 			[group:'xml-security', name:'xmlsec', version:'1.4.3', transitive: false],
  51.  
  52. 			//Libs para o export plugin
  53. 			[group:'com.lowagie',name:'itext',version:'2.1.4', transitive: false],
  54. 			[group:'com.lowagie',name:'iTextAsian',version:'2.1.5', transitive: false],
  55. 			[group:'com.lowagie',name:'itext-rtf',version:'2.1.5', transitive: false],
  56. 			[group:'net.sourceforge.jexcelapi',name:'jxl',version:'ideais-commerce', transitive: false],
  57. 			[group:'org.openoffice.odf',name:'odfdom',version:'ideais-commerce', transitive: false],
  58. 			[group:'net.sf.opencsv',name:'opencsv',version:'1.8', transitive: false],
  59. 			[group:'xerces',name:'xercesImpl',version:'ideais-commerce', transitive: false],
  60.  
  61. 			//Libs para o WSClient
  62. 			[group:'org.codehaus.groovy.modules',name:'groovyws',version:'0.5.1', transitive: false],
  63. 			[group: 'org.apache.cxf', name: 'cxf-bundle', version: '2.2.4', transitive: false],
  64. 			[group: 'com.sun.xml.fastinfoset', name: 'FastInfoset', version: '1.2.7', transitive: false],
  65. 			[group: 'org.apache.geronimo.specs', name: 'geronimo-activation_1.1_spec', version: '1.0.2', transitive: false],
  66. 			[group: 'org.apache.geronimo.specs', name: 'geronimo-annotation_1.0_spec', version: '1.1.1', transitive: false],
  67. 			[group: 'org.apache.geronimo.specs', name: 'geronimo-javamail_1.4_spec', version: '1.6', transitive: false],
  68. 			[group: 'org.apache.geronimo.specs', name: 'geronimo-jaxws_2.1_spec', version: '1.0', transitive: false],
  69. 			[group: 'org.apache.geronimo.specs', name: 'geronimo-stax-api_1.0_spec', version: '1.0.1', transitive: false],
  70. 			[group: 'org.apache.geronimo.specs', name: 'geronimo-ws-metadata_2.0_spec', version: '1.1.2', transitive: false],
  71. 			[group: 'javax.xml', name: 'jaxb-api', version: '2.1', transitive: false],
  72. 			[group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.1.12', transitive: false],
  73. 			[group: 'com.sun.xml.bind', name: 'jaxb-xjc', version: '2.1.12', transitive: false],
  74. 			[group: 'jaxen', name: 'jaxen', version: '1.1', transitive: false],
  75. 			[group: 'jdom', name: 'jdom', version: '1.1', transitive: false],
  76. 			[group: 'org.apache.neethi', name: 'neethi', version: '2.0.4', transitive: false],
  77. 			[group: 'woodstox', name: 'wstx-asl', version: '3.2.7', transitive: false],
  78. 			[group: 'xml-resolver', name: 'xml-resolver', version: '1.2', transitive: false],
  79.  
  80. 		) 
  81. 		test(
  82.  
  83.  
  84. 			//Libs para integracao do GEB com SPOCK e do GEB com Webdriver
  85. 			[group:"org.codehaus.geb", name:"geb-spock", version:"0.6.0"],
  86. 			[group:'org.seleniumhq.selenium', name:'selenium-firefox-driver', version:'2.0.0'],
  87. 			[group:'org.seleniumhq.selenium', name:'selenium-chrome-driver', version:'2.0.0'],
  88. 			[group:'org.seleniumhq.selenium', name:'selenium-ie-driver', version:'2.0.0'],
  89. 			[group:'org.hsqldb', name:'hsqldb', version:'2.2.4'],
  90. 		)
  91.     }
  92. }

Já para usar sintaxes do Oracle com o HSQLDB, basta incluir a seguinte instrução no início do script SQL:

SET DATABASE SQL SYNTAX ORA TRUE;

Para deixar isso automático, foi criado no arquivo BootStrap.groovy a seguite rotina:

  1. def init = { servletContext ->
  2. 		def envs = [Environment.DEVELOPMENT, Environment.TEST ]
  3. 		if (Environment.current in envs) {
  4. 			if(Environment.current == Environment.TEST) {
  5. 				executeHSQLDBWithOracleQuerySyntax()
  6. 			}
  7. 		}
  8.  
  9. 	}
  10.  
  11. def executeHSQLDBWithOracleQuerySyntax() {
  12. 		def sqlString = "SET DATABASE SQL SYNTAX ORA TRUE;"
  13.  
  14. 		def sql = Sql.newInstance(
  15. 			ConfigurationHolder.config.dataSource.url, 
  16. 			ConfigurationHolder.config.dataSource.username, 
  17. 			ConfigurationHolder.config.dataSource.password, 
  18. 			ConfigurationHolder.config.dataSource.driverClassName
  19. 		)
  20. 		sql.execute(sqlString)
  21. 	}

Simples assim, agora a todo start-up da aplicação, quando o escopo for de teste, o HSQLDB já estará pronto para aceitar funções inerentes ao banco de dados Oracle.

Tecnologia, Software & Desenvolvimento

Se você gostou desse tópico, por favor considere deixar um comentário ou se inscreva no feed e tenha no futuro todos os tópicos entregues diretamente no seu agregador.

Comentários

Uma resposta para “Usando funções da Oracle com HSQLDB”

Deixe seu Comentário

(obrigatório)

(obrigatório)