Dispara Trigger no acesso JDBC/ODBC

Discussão em 'Banco de Dados / Database' iniciado por gbouvie, Fevereiro 23, 2010.

  1. gbouvie

    gbouvie Membro Participativo

    Marcos!

    Descobri o problema. Faltava instalar o JDK na pasta da instalação do progress. Agora consegui criar a trigger e dispara-la. Muito obrigado por todas as idéias e soluções. Se não fossem elas, não teria conseguido fazer isso funcionar. Falta agora eu criar a trigger que vai valer mesmo. Vou fazer isso agora e incluo um post informando se funcionou.

    Obrigado

    Giovani Boovié
  2. kirchner

    kirchner Membro Participativo Moderador

    Giovani,

    Que bom que funcionou. Mas você não estava testando no Windows? O Progress já tem o java embutido neste caso.
    Eu não instalo o java e consigo usar as funcionalidades normalmente.
  3. gbouvie

    gbouvie Membro Participativo

    Marcos!

    Acredito que no momento da instalação do progress no servidor o JDK não tenha sido instalado ou deu algum problema na hora da instalação dele. O fato é que depois que copiei a pasta JDK para a pasta de instalação do progress, consegui incluir a trigger.

    Depois de conseguir incluir a trigger tentei rodá-la inserindo um campo na tabela e, como eu esperava, não funcionou. O erro que aparece é o seguinte:

    === SQL Exception 1 ===
    SQLState=HY000
    ErrorCode=-20142
    [DataDirect][OpenEdge JDBC Driver][OpenEdge] Erro na execucao da stored procedur
    e. (7853)

    Esta anexado um arquivo com o conteudo da trigger a ser criada.

    A classe Connection é uma classe que estava em um pacote da pasta java de instalação do progress. Através do eclipse eu consegui usar essas classes. Ela é que faz o papel de proxy e se comunica com o AppServer. Depois tem a classe ParamArray que também acredito ser uma de um pacote na mesma pasta. Ambos estão importados na clausula IMPORT e os .JAR estão na pasta DLC/jre/lib/ext e na pasta DLC/JDK/jre/lib/ext.

    Se eu comentar tudo que esta dentro do try, a trigger funciona.

    Tem alguma idéia do que possa ser.
  4. gbouvie

    gbouvie Membro Participativo

    Marcos,

    Não consegui anexar o arquivo. Segue o código:

    Código:
    CREATE TRIGGER PUB.CriaTituloAssociado
    AFTER INSERT
    ON PUB."c-tit-associado"
    REFERENCING NEWROW
    FOR EACH ROW
    IMPORT
       import java.math.*;
       import com.progress.open4gl.javaproxy.*;
       import com.progress.open4gl.Parameter;
       import java.io.File;
       import java.io.FileWriter;
       import java.io.IOException;
    BEGIN
       String ticket;
       String conexao;
       Integer emitente;
       BigDecimal valor;
       Connection myConn;
       String retVal;
       ParamArray parms;
       Boolean erro;
       ticket = (String)NEWROW.getValue(4, VARCHAR);
       emitente = (Integer)NEWROW.getValue(1, INTEGER);
       valor = (BigDecimal)NEWROW.getValue(2, DECIMAL);
       conexao = "AppServer://10.0.0.10:5162/ems2teste";
       try{
          myConn = new Connection(conexao,"","","");
          OpenAppObject dynAO;
          dynAO = new OpenAppObject(myConn,"ems2teste");
          parms = new ParamArray(4);
          parms.addInteger(0,emitente,ParamArrayMode.INPUT);
          parms.addDecimal(1,valor,ParamArrayMode.INPUT);
          parms.addCharacter(2,ticket,ParamArrayMode.INPUT);
          parms.addLogical(3,null,ParamArrayMode.OUTPUT);
          dynAO.runProc("quarentena/cosu/crp/teste_titulo.p",parms);
          erro = (Boolean) parms.getOutputParameter(3);
          retVal = (String)(parms.getProcReturnString());
          dynAO._release();
       } catch ( Exception e ){
          try{
             File arquivo1 = new File("c:/temp/excessao_trigger.txt");
             FileWriter writer1 = new FileWriter(arquivo1);
             writer1.write("Exceção em AppServerConexao() \r\n");
             writer1.write("Mensagem de exceção: "  + e.getMessage() + " \r\n");
             writer1.close();
          } catch ( IOException IO){
             IO.printStackTrace();
          }
       }
    END
  5. kirchner

    kirchner Membro Participativo Moderador

    Meu que parto isso.
    Não é a toa que Java é "compile once, debug everywhere!".


    No fim das contas consegui fazer isso:
    Código:
    CREATE TRIGGER PUB.TR_Item
    AFTER INSERT
    ON PUB.Item
    FOR EACH ROW
    IMPORT
    	import java.sql.*;
    	import java.math.*;
    BEGIN
    	info i = new info();
    	int number = i.getNumber();
    
    	SQLIStatement stmt = new SQLIStatement("INSERT INTO PUB.Numbers VALUES (?)");
    	stmt.setParam(1, number);
    	stmt.execute();
    END;
    info é uma classe que eu criei que está no CLASSPATH do meu banco. Mas para isso funcionar, eu tive que parar o banco e carregar novamente. Não sei se o _sqlsrv2.exe lê as classes do CLASSPATH somente no momento da carga, é o que pareceu.

    Antes de eu parar o banco dava o mesmo erro que você reportou, provavelmente não estava carregando a minha classe info.

Compartilhe esta Página