[DÚVIDA] - Executar SCRIPT SQL via código

Galera,

Sei que não participo do forum, mas realmente é por falta de conhecimento.
Minha dúvida é:

String sql = "create table teste_release_nova(codigo number(9) default 0);\n alter table teste_release_nova add codigo1 number(9) default 0; ";

tenho o código acima, nele existem 2 sentenças SQL.
Gostaria de executar essas duas sentenças via código, não chamar um SQLPLUS.exe ou algo semelhante.

Tentei com o método EXECUTEBATCH()
porém não obtive sucesso, ele retorna uma exception dizendo que tem INVALID CARACTER.
Porem, se eu fizer separadamente ele executa.

Meu código esta abaixo:

public void executaBatch() {
	String sql = "create table teste_release_nova(codigo number(9) default 0);\n" +
			"alter table teste_release_nova add codigo1 number(9) default 0; ";
		
	try {
		PreparedStatement pstmt = connPre.prepareStatement(sql);
		connPre.setAutoCommit(false);
		pstmt.clearBatch();
		pstmt.addBatch();
		int[] result = pstmt.executeBatch();
		pstmt.close();
		connPre.commit();
		connPre.close();
		System.out.println("SQL " + sql + " executado com sucesso.");
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		System.out.println(e.getErrorCode());		
	} catch (Exception e) {
		// TODO: handle exception
		e.printStackTrace();
	}
}

Estou utilizando banco ORACLE 8,9,10,11

Se alguém souber de alguma solução.

Tira o caracter ; do seu código!

Se o código SQL estiver correto irá funcionar.

   String sqlCriarTabela = "create table teste_release_nova(codigo number(9) default 0)";
   String sqlAltera = "alter table teste_release_nova add codigo1 number(9) default 0 ";  

O caracter inválido é o \n,

tire ele

Mas com isso terei que executar duas vezes o método, certo?

É que a String que mandei foi um exemplo, no dia-a-dia receberei um arquivo NOME_DO_ARQUIVO.sql
e dentro dele terá todos os tipos de SQL.
desde CREATE TABLE a PL/SQL.
Então terei N SQL para executar de uma só vez por arquivo.

Só para ilustrar melhor também, este processo ira fazer a atualização de todas as bases de dados que temos na empresa, apartir de desenvolvimentos concluidos.
Projeto para uma Fabrica de Software. Não conseguimos solucionar internamente este problema.

Não sei se me fiz entender.

[quote=Felagund]O caracter inválido é o \n,

tire ele[/quote]

Tentei tirar também, ai acabei colocando pra ver se era.
:cry:

Quando eu tive de fazer isso em um outro banco SQL, tive de pegar a string SQL original e quebrar em várias. Aí tive de executar cada linha (é claro que se a linha inteira fosse um comentário ou uma linha em branco, eu não preciso executar a linha).

String sqlMuitoGrande = "insert into()...; outro comando; mais um comando; um milhao de comandos;";


String[] sqlsSeparadas = sqlMuitoGrande.split("[;]");       //VAI QUEBRAR OS COMANDOS NO ;

for (String sqlCMD : sqlsSeparadas){
        System.out.println(sqlCMD);
}

Se voce quiser coloca o autocommit = false e depois do for voce da o commit

[]s

Kemper

[quote=kemperacc][code]
String sqlMuitoGrande = “insert into()…; outro comando; mais um comando; um milhao de comandos;”;

String[] sqlsSeparadas = sqlMuitoGrande.split("[;]"); //VAI QUEBRAR OS COMANDOS NO ;

for (String sqlCMD : sqlsSeparadas){
System.out.println(sqlCMD);
}
[/code]

Se voce quiser coloca o autocommit = false e depois do for voce da o commit

[]s

Kemper[/quote]

Pois é caros amigos, tive que fazer assim…
mas como trabalho em uma softwarehouse o que nasce que SQL maluco aqui, não é brincadeira.

Em um primeiro momento, acho que vou ter que me render a chamar o SQLPLUS e executar (se alguem souber como já comenta ai tbm rsrs)

Mas quero continuar tentando fazer tudo via JAVA.
Acho impossível não ser possível fazer esse tipo de execução, numa linguagem que hoje é dita como uma das melhores.
Vou conseguir…rs

Só para continuar o tópico…
surgiu esse agora:

Tenho SQL normais (create, alter, comment,…) e logo abaixo dessas linhas tenho um PL/SQL para atualização de campos
mais ou menos assim

create table tabela1(
   campo01 number(9)
);

alter table tabela1
add constraint pk_tabela1 primary_key (campo01);

comment on column tabela1.campo01
is 'COMENTARIO LEGAL';

--Agora vem o PL/SQL
declare
   var1 number(1);
begin
   begin
      update tabela 1
          set campo01 = 1;
   end;
end;

Como é que vou tratar isso né, tenho duas situações totalmente distintas no mesmo sql.
O que me dizem? alguma idéia?
Desculpem ser chato, mas realmente não sei como olhar um horizonte, imagina caminhar para ele.

[quote=xolla][quote=kemperacc][code]
String sqlMuitoGrande = “insert into()…; outro comando; mais um comando; um milhao de comandos;”;

String[] sqlsSeparadas = sqlMuitoGrande.split("[;]"); //VAI QUEBRAR OS COMANDOS NO ;

for (String sqlCMD : sqlsSeparadas){
System.out.println(sqlCMD);
}
[/code]

Se voce quiser coloca o autocommit = false e depois do for voce da o commit

[]s

Kemper[/quote]

Pois é caros amigos, tive que fazer assim…
mas como trabalho em uma softwarehouse o que nasce que SQL maluco aqui, não é brincadeira.

Em um primeiro momento, acho que vou ter que me render a chamar o SQLPLUS e executar (se alguem souber como já comenta ai tbm rsrs)

Mas quero continuar tentando fazer tudo via JAVA.
Acho impossível não ser possível fazer esse tipo de execução, numa linguagem que hoje é dita como uma das melhores.
Vou conseguir…rs

Só para continuar o tópico…
surgiu esse agora:

Tenho SQL normais (create, alter, comment,…) e logo abaixo dessas linhas tenho um PL/SQL para atualização de campos
mais ou menos assim

create table tabela1(
   campo01 number(9)
);

alter table tabela1
add constraint pk_tabela1 primary_key (campo01);

comment on column tabela1.campo01
is 'COMENTARIO LEGAL';

--Agora vem o PL/SQL
declare
   var1 number(1);
begin
   begin
      update tabela 1
          set campo01 = 1;
   end;
end;

Como é que vou tratar isso né, tenho duas situações totalmente distintas no mesmo sql.
O que me dizem? alguma idéia?
Desculpem ser chato, mas realmente não sei como olhar um horizonte, imagina caminhar para ele.
[/quote]

Por que você não grava essas coisas em arquivos texto e passa para o SQLPLUS via paramentro?

[quote=truck1n][quote=xolla][quote=kemperacc][code]
String sqlMuitoGrande = “insert into()…; outro comando; mais um comando; um milhao de comandos;”;

String[] sqlsSeparadas = sqlMuitoGrande.split("[;]"); //VAI QUEBRAR OS COMANDOS NO ;

for (String sqlCMD : sqlsSeparadas){
System.out.println(sqlCMD);
}
[/code]

Se voce quiser coloca o autocommit = false e depois do for voce da o commit

[]s

Kemper[/quote]

Pois é caros amigos, tive que fazer assim…
mas como trabalho em uma softwarehouse o que nasce que SQL maluco aqui, não é brincadeira.

Em um primeiro momento, acho que vou ter que me render a chamar o SQLPLUS e executar (se alguem souber como já comenta ai tbm rsrs)

Mas quero continuar tentando fazer tudo via JAVA.
Acho impossível não ser possível fazer esse tipo de execução, numa linguagem que hoje é dita como uma das melhores.
Vou conseguir…rs

Só para continuar o tópico…
surgiu esse agora:

Tenho SQL normais (create, alter, comment,…) e logo abaixo dessas linhas tenho um PL/SQL para atualização de campos
mais ou menos assim

create table tabela1(
   campo01 number(9)
);

alter table tabela1
add constraint pk_tabela1 primary_key (campo01);

comment on column tabela1.campo01
is 'COMENTARIO LEGAL';

--Agora vem o PL/SQL
declare
   var1 number(1);
begin
   begin
      update tabela 1
          set campo01 = 1;
   end;
end;

Como é que vou tratar isso né, tenho duas situações totalmente distintas no mesmo sql.
O que me dizem? alguma idéia?
Desculpem ser chato, mas realmente não sei como olhar um horizonte, imagina caminhar para ele.
[/quote]

Por que você não grava essas coisas em arquivos texto e passa para o SQLPLUS via paramentro?[/quote]

Porque processo velho é assim, (mas para continuar o desenvolvimento vou com a sua idéia sim truck1n) e quando enviamos os SQLs para os clientes, eles tem que nos acessar para saber o que houve de problema.
Alguém sabe se o SQLPLUS retorna CODIGO DE ERRO DOS SQL?
Eu preciso saber quais os ORA- que retornou pra tratar em uma exception e fazer um email de possível suporte.

Ahhhh

não sei se pode ajudar em uma possível dica…
mas o metodo EXECUTEBATCH()

que falei lá no primeiro post, ele funciona para MYSQL, mas para oracle ele “mia”.

Galera, consegui…
Realmente tive que editar o arquivo TXT que tinha as senteças SQL e separar em uma lista e executar separadamente.

Se quiser posso passar o codigo, mas fiz assim

Separei uma lista de FILES todos os arquivos que tinham SQL
Com a lista eu leio os arquivos e mando para uma classe que contém minhas regras do arquivo
** separando por ponto e virgual (:wink:
** separando por barra (/)
** separando por uma determinada string

e essa classe devolve uma lista de SQL dizendo se é uma SQL normal ou TRIGGER, FUNCYION, PROCEDURE (que deve ser chamda)

quando o SQL é normal utilizo o preparedStament normalmente, e quando é TRIGGER, FUNCTION, PROCEDURE utilizo CallAbleStament para chamar.

valeu pela atenção.