[RESOLVIDO] Erro na Sintaxe do Select

Pessoal estou tentando realizar um consulta em várias tabelas com apenas um SELECT, sendo que meu banco não é relacional, por isso que estou tentando fazer essa gambiarra, quando executo o programa retorna o seguinte erro:

Primeiro o código:


String sql = "SELECT cod_exame FROM ? WHERE cod_exame = ?";
        
        int cod = 0;
        String[] tabelas = {"hemograma", "parasitologico", "planoteste", "sanguineo", "sumario"};
        PreparedStatement stmt = null;
        ResultSet rs = null;

        stmt = this.conexao.prepareStatement(sql);
        

        for(int i = 0; i < tabelas.length; i++){

            stmt.setString(1, tabelas[i]);
            stmt.setInt(2, codigo);

            rs = stmt.executeQuery();

            while(rs.next()){
                cod = rs.getInt("cod_exame");
            }

        }

        rs.close();
        stmt.close();

        return cod;


//Erro mostrado no console:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''hemograma' WHERE cod_exame = 4545' at line 1
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
        at com.mysql.jdbc.Util.getInstance(Util.java:381)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
        at dao.daoCodigoExame.validarCodigoExame(daoCodigoExame.java:45)
        at lab.jFSanguineo.cadastrarSanguineo(jFSanguineo.java:462)
        at lab.jFSanguineo.jBSalvarActionPerformed(jFSanguineo.java:418)
        at lab.jFSanguineo.access$200(jFSanguineo.java:30)
        at lab.jFSanguineo$3.actionPerformed(jFSanguineo.java:257)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
        at java.awt.Component.processMouseEvent(Component.java:6289)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6054)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4652)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4482)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4482)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)
        at java.awt.EventQueue.access$000(EventQueue.java:85)
        at java.awt.EventQueue$1.run(EventQueue.java:603)
        at java.awt.EventQueue$1.run(EventQueue.java:601)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
        at java.awt.EventQueue$2.run(EventQueue.java:617)
        at java.awt.EventQueue$2.run(EventQueue.java:615)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
CONSTRUÍDO COM SUCESSO (tempo total: 1 minuto 2 segundos)

Portanto, não entendi o porque do erro.

Agradeço desde já a colaboração de todos. Valeu!!!

''hemograma' WHERE cod_exame = 4545' Ele está recebendo duas aspas simples antes do nome da tabela e uma aspa simples depois. Esse é o problema.

Cara, o preparedStatement joga Strings com aspas simples, portanto, tua tabela, na forma como você setou, irá ser tratada como varchar e não como uma tabela do banco de dados, por isso o erro.

Então como posso corrigir esse problema?

Não sei qual o motivo da criação de um array de tabelas…
Mas não funcionará.
Então, coloque o nome da tabela diretamente na query…

A questão é que a cada loop do FOR seja verificado um tabela diferente, pois são 5 tabelas diferentes e estou querendo verificar se existe dentro de cada tabela algum cod_exame igual ao que foi digitado pelo usuário, devido a essa necessidade que tentei fazer dessa forma.

Algumas soluções seriam:

  • Concatenar o nome da tabela na query diretamente: já que não vem do usuário não tem risco de sql injection…

  • Transformar tudo numa tabela só com um tipo para identificar o tipo de exame (se todas colunas forem iguais, dá certo)

Não sei se esse código é pra estudo ou para um sistema real…
Se for pra algo sério, tem várias melhorias a se fazer aí…

Edit:

O Mysql é relacional sim, não entendi o que quis dizer com isto.

O que eu quis dizer é que não desenvolvi as tabelas de forma relacional, pois se estivesse feito isso não teria a necessidade de realizar um consulta em cada tabela e respondendo primeira pergunta o código é para estudo, mas vale apena saber quais seriam as melhorias que deveriam ser realizadas.

Não sei se serve, mas poderia ser algo assim:

[code]
int cod = 0;
String[] tabelas = {"hemograma", "parasitologico", "planoteste", "sanguineo", "sumario"};
PreparedStatement stmt = null;
ResultSet rs = null;

    for (int t = 0; t &lt; tabelas.length; t++) {

        String sql = &quot;SELECT cod_exame FROM &quot; + tabelas[t] + &quot;WHERE cod_exame = ?&quot;;

        stmt = this.conexao.prepareStatement(sql);


        for (int i = 0; i &lt; tabelas.length; i++) {
            stmt.setInt(1, codigo);
            rs = stmt.executeQuery();
            while (rs.next()) {
                cod = rs.getInt(&quot;cod_exame&quot;);
            }
        }

    }
    rs.close();
    stmt.close();

    return cod;
}[/code]

Mas é muita gambiarra isso.

Valeu romacio pela ajuda, dessa forma deu certo. Quero também agradecer todos que ajudaram para solucionar este problema.

:thumbup: