quinta-feira, 21 de novembro de 2013

JSF: jquery.maskMoney.js

1º) Faça o download do plug-in:
   http://plugins.jquery.com/?s=money

2º) Coloque o arquivo no seu projeto
  /SeuProjeto/WebContent/resources/scripts

3º) Adicione o arquivo na sua página XHTML
  <h:head>
    <h:outputScript library="scripts" name="jquery.maskedinput-1.2.2.js" target="head" rendered="true"/>
    <h:outputScript library="scripts" name="jquery.maskMoney.js" target="head" rendered="true" />
  </h:head>

4º) Dentro do form onde está seu h:inputText. (Se não colocar no form terá problemas se utilizar ajax)
  <h:form prependId="false">
    <script type="text/javascript">
      $(document).ready(function() {
        setarMascara();
      });

     function setarMascara() {
       $("#SALARIO").maskMoney({showSymbol:false, symbol:"", precision: 2, decimal:",", thousands:"."});
     }
  </script>

  <h:outputLabel value="Salário" />
    <h:inputText value="#{funcionarioMB.historicoCargo.dbl_salarioflex}" 
        id="SALARIO" styleClass="valor">
     <f:convertNumber pattern="#,##0.00" locale="pt_BR" maxFractionDigits="2"/>
  </h:inputText>
 </h:form>

terça-feira, 12 de novembro de 2013

Formatar data em h:selectOneMenu / Formatar data em f:selectItems

<h:outputText value="Data" />
<h:selectOneMenu value="#{funcionarioMB.ausencia.int_ferias}">
   <f:selectItem noSelectionOption="true" itemValue="" />
   <f:selectItems value="#{funcionarioMB.funcionario.ferias}" var="ferias" itemValue="#{ferias.int_id}"      itemLabel="#{dateUtil.formatDate(ferias.dt_periodoaquisitivoinicio,'dd/MM/yyyy')}" />
</h:selectOneMenu>

 public static String formatDate(Date date, String pattern) {
     if (date == null) {
         return null;
     }

     if (pattern == null) {
         throw new NullPointerException("pattern");
     }

     Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
     return new SimpleDateFormat(pattern, locale).format(date);
}    

terça-feira, 5 de novembro de 2013

org.hibernate.AssertionFailure: null identifier

Erro: org.hibernate.AssertionFailure: null identifier

Causa:

dao = new FuncionarioDao<Funcionario>(HibernateUtil.getSession(), Funcionario.class);
dao.refresh(cliente);

Correto:

dao = new FuncionarioDao<Funcionario>(HibernateUtil.getSession(), Funcionario.class);
dao.refresh(funcionario);

quinta-feira, 17 de outubro de 2013

Passar sessão do Hibernate para o Jasper

String pathRel = servletContext.getRealPath("/jasper/relatorio.jasper");

Map<String, Object> parametros = new HashMap<String, Object>();
parametros.put(JRHibernateQueryExecuterFactory.PARAMETER_HIBERNATE_SESSION, HibernateUtil.getSession());

JasperPrint print = JasperFillManager.fillReport(pathRel,parametros);

sexta-feira, 20 de setembro de 2013

JSF - Exemplo de utilização do ValueChangeEvent

Um ValueChangeEvent é gerado quando o valor de uma caixa de texto ou a opção de uma
caixa de seleção são alterados.

<h: outputLabel value ="Nome: " for ="nome" />
<h: inputText valueChangeListener ="#{usuarioMB.teste}" id="nome" />

@ManagedBean
public class usuarioBean{
     public void teste( ValueChangeEvent e) {
          System . out . println ("Nome anterior: " + e. getOldValue ());
          System . out . println ("Nome atual: " + e. getNewValue ());
     }
}

ou

<h: outputLabel value =" Preço : " for =" preco " />
 <h: inputText id=" preco ">
     <f: valueChangeListener type ="br.com.alexandrepalmeira.TesteChangeListener" />
</h: inputText >


package br.com.alexandrepalmeira;

public class TesteChangeListener implements ValueChangeListener {
     @Override
     public void processValueChange (ValueChangeEvent e) {
          System . out . println ("Nome anterior: " + e. getOldValue ());
          System . out . println ("Nome atual: " + e. getNewValue ());
     }
}


Os métodos são executados na fase Process Validations.

JSF - Associar mais de dois métodos a um evento


<h: commandLink value ="Salvar" action ="acao1" actionListener ="acao2">
     <f: actionListener type ="br.com.alexandrepalmeira.MudarCor"/> // acao3 ...
</h: commandLink >


br.com.alexandrepalmeira;
public class MudarCor implements ActionListener {
     @Override
     public void processAction ( ActionEvent e) {
          UICommand c = ( UICommand ) e. getComponent ();
          c. getAttributes (). put(" style ", " color : red ;");
     }
}

quinta-feira, 19 de setembro de 2013

JSF - Considerar strings vazia como null

Adicionar no Web.xml

<context-param>
     <param-name>
          javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
     </param-name>
     <param-value>true </param-value>
</context-param>

JSF - Exemplo de f:validateRegex

Verificando se a propriedade tem pelo menos 5 e no máximo 10 letras.

<h: inputText value ="#{bean.codigo}" id="codigo">
     <f: validateRegex pattern ="[a-zA -Z ]{5 ,10} "/>
</h: inputText >
<h: message for ="codigo"/>

JSF - Exibir dados na forma de porcentagem

<h: outputText value ="#{bean.numero}" >
     <f: convertNumber type =" percent " />
</h: outputText >

JSF - Criar managed bean de aplicação quando a aplicação é incializada


@ManagedBean (eager = true)
@ApplicationScoped
 class managedBean{

}

Se não for definido como eager, o managed bean será criado apenas quando for utilizado pela primeira vez

JSF - Exemplo de UI:REPEAT


<h: outputText value ="Alunos:" />
 <ul >
 <ui: repeat value ="#{alunoMB.alunos}" var ="aluno">
 <li >
 <h: outputText value ="#{aluno.nome}" />
 </li >
 </ui: repeat >
 </ul >

Resultado

Alunos
 <ul >
 <li >João </li >
 <li >Maria </li >
 <li >Paulo </li >
 </ul >

JSF - Comentar ou excluir partes de código XHTML


<h: outputText value =" Nome : #{usuarioMB . nome}" />
<ui: remove >
     <h: outputText value =" Sobrenome : #{usuarioMB.sobrenome}" />
</ui: remove >

Dessa forma o código dentro do ui:remove não será processado pelo JSF. Se você comentar o código com <!-- xxx --> o JSF vai processar o código comentado, executar as chamadas ao bean, porém, não vai exibir o resultado na tela.

JSF - h:selectOneMenu sem valor default

<h:selectOneMenu value ="#{cidadesBean.cidadeEscolhida}">
     <f: selectItem itemLabel ="Selecione um item" noSelectionOption =" true "/>
     <f: selectItems
          value ="#{cidadesBean.cidades}"
          var ="cidade"
          itemValue ="#{cidade}"
          itemLabel ="#{cidade.nome}" />
</h: selectOneMenu >

terça-feira, 2 de julho de 2013

org.hibernate.exception.GenericJDBCException: Overflow Numérico / Caused by: java.sql.SQLException: Overflow Numérico

Solução: Altere a propriedade @Fetch de alguns mapeamentos para @Fetch(FetchMode.SELECT).

De:
public class ProcessoImp extends Processo implements Serializable, Cloneable{
@OneToOne
@JoinColumn(name="transportadorinternacional_id", insertable=false,updatable=false)
private Contato transportadorInternacional;

@OneToOne
@Fetch(FetchMode.JOIN)
@JoinColumn(name="moeda_valor_vmld", insertable=false,updatable=false)
private Moeda moedaVmld;
}

Para:
public class ProcessoImp extends Processo implements Serializable, Cloneable{
@OneToOne
@Fetch(FetchMode.SELECT)
@JoinColumn(name="transportadorinternacional_id", insertable=false,updatable=false)
private Contato transportadorInternacional;

@OneToOne
@Fetch(FetchMode.SELECT)
@JoinColumn(name="moeda_valor_vmld", insertable=false,updatable=false)
private Moeda moedaVmld;
}

terça-feira, 25 de junho de 2013

org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations):

// Estrutura

public class LancamentoCc implements Serializable, Comparable<LancamentoCc>,Cloneable{
      
       @ManyToOne(fetch = FetchType.EAGER)
       @JoinColumn(name="str_nro_processo",referencedColumnName="nref", insertable=false,updatable=false)
       private AbreProcesso processo;
      
       @ManyToOne(fetch=FetchType.LAZY)
       @JoinColumn(name="int_movimento_conta", insertable=false, updatable=false)
       private MovimentoCc movimento;
}
public class AbreProcesso implements Serializable,Cloneable {
      
       @OneToMany(mappedBy="processo", cascade = CascadeType.ALL,fetch=FetchType.EAGER, orphanRemoval = true)
       @Fetch(FetchMode.SUBSELECT)
       protected Collection<LancamentoCc> movimentos = new ArrayList<LancamentoCc>();
}
public class MovimentoCc implements Serializable{
      
@OneToMany(mappedBy="movimento", cascade = CascadeType.ALL, fetch = FetchType.EAGER ,orphanRemoval=false)
       @Fetch(FetchMode.SELECT)
       private List<LancamentoCc> lancamentos = new ArrayList<LancamentoCc>();
}

// Dessa forma ocorre o erro
public
String delete(ContaReceber conta) {
       try{
              dao = new LancamentoContaDao<ContaReceber>(HibernateUtil.getSession(), ContaReceber.class);
             dao.delete(conta);                                         
       }catch (Exception e) {
              e.printStackTrace();
       }
       return null;
}

// Dessa forma funciona
public
String delete(ContaReceber conta) {
       try{
              Dao<AbreProcesso> dao = new Dao<AbreProcesso>(HibernateUtil.getSession(), AbreProcesso.class);
              AbreProcesso processo = conta.getProcesso();
              processo.getMovimentos().remove(conta);
              dao.save(processo);                                        
       }catch (Exception e) {
              e.printStackTrace()
       }
       return null;
}


segunda-feira, 17 de junho de 2013

java.util.ConcurrentModificationException


Causa do erro
for(Lancamento lanc : processo.getLancamentos() ){
  if(lanc.getStrOrigem() != null && lanc.getStrOrigem().equals("FE")){
  processo.getLancamentos().remove(lanc);
  }
}

Solução, usar iterator
for (Iterator<Lancamento> iterator = processo.getLancamentos().iterator(); iterator.hasNext();) {
Lancamento lancamento = iterator.next();

if(lancamento.getStrOrigem() != null && lancamento.getStrOrigem().equals("FE")){
iterator.remove();
}
   
}

Fonte: http://www.guj.com.br/java/30323-erro-com-collections-javautilconcurrentmodificationexception

sexta-feira, 14 de junho de 2013

h:selectOneMenu com converter


Classe a ser convertida
@Entity
public class Comissao implements Serializable{

  @Id
  private Integer id;
     private String descricao;

}

Classe onda a classe a ser convertida é utilizada
@Entity
public class Processo implements Serializable{
     // Podem ocorrer problemas durante o carregamento do h:selectOneMenu, se marcado como LAZY
  @OneToOne(fetch = FetchType.EAGER)
  @JoinColumn(name="comissaoId")
  protected Comissao comissao;
}

Converter
public class ConverterComissao implements Converter{

@Override
public Object getAsObject(FacesContext context, UIComponent component, String string) {
if(string == null || string.isEmpty()){
return null;
}

Dao<Comissao> dao = new Dao<Comissao>(HibernateUtil.getSession(),Comissao.class);

Integer id = Integer.valueOf(string);

return dao.get(id);
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object object) {
Comissao comissao = (Comissao) object;
if(comissao == null || comissao.getInt_id() == null){
return null;
}
return String.valueOf(comissao.getId());
}

}

Função para popular o h:selectOneMenu
public List<Comissao> comboComissao(){
Dao<Comissao> dao;
dao = new Dao<Comissao>(HibernateUtil.getSession(),Comissao.class);

Comissao comissao =  new Comissao();
comissao.setStr_descricao("");
comissao.setInt_id(null);

List<Comissao> list = new ArrayList<Comissao>();

list.add(comissao);

try{
list.addAll( dao.findAll("int_id", false) );
}catch (Exception e) {
new GeraFacesMessage("ATENÇÃO: OCORREU UM ERRO DURANTE O PROCESSAMENTO, A OPERAÇÃO NÃO FOI EFETUADA! \n",e);
e.printStackTrace();
}

return list;
}

O h:selectOneMenu
<h:selectOneMenu value="#{fechamentoMB.processo.comissao}" maxListHeight="50px;" converter="converterComissao">

     <f:selectItems value="#{selectItems.comboComissao}" var="comissao" itemValue="#{comissao}" itemLabel="#{comissao.descricao}" />

<f:ajax event="change" render="optPanel" listener="#fechamentoMB.changeListenerComissao()}"/>

</h:selectOneMenu>

quarta-feira, 15 de maio de 2013

JSF: Exibir um popup durante a execução de um evento



<a4j:commandButton
status="waitModalStatus"
title="Enviar arquivo via FTP"
actionListener="#{processoMB.sendFtp(upload)}"
image="/resources/images/16x16/up.png">


<rich:popupPanel
    id="waitModal" style="text-align:center" autosized="true" modal="true" width="200" >
<h:graphicImage library="images" name="ajaxloader32.gif" alt="ai"/><br />
    <h:outputText value="Transmitindo o arquivo, aguarde!" />
</rich:popupPanel>

<a4j:status name="waitModalStatus">
    <f:facet name="start">
        <rich:componentControl event="start" operation="show" target="waitModal" />
    </f:facet>  
    <f:facet name="stop">
        <rich:componentControl event="stop" operation="hide" target="waitModal" />
    </f:facet>
</a4j:status>

segunda-feira, 13 de maio de 2013

Copiar arquivos no Java

Dessa forma o arquivo de destino não é alterado durante a cópia:


  1.  public static void copyFile(File source, File destination) throws IOException {  
  2.      if (destination.exists())  
  3.          destination.delete();  
  4.   
  5.      FileChannel sourceChannel = null;  
  6.      FileChannel destinationChannel = null;  
  7.   
  8.      try {  
  9.          sourceChannel = new FileInputStream(source).getChannel();  
  10.          destinationChannel = new FileOutputStream(destination).getChannel();  
  11.          sourceChannel.transferTo(0, sourceChannel.size(),  
  12.                  destinationChannel);  
  13.      } finally {  
  14.          if (sourceChannel != null && sourceChannel.isOpen())  
  15.              sourceChannel.close();  
  16.          if (destinationChannel != null && destinationChannel.isOpen())  
  17.              destinationChannel.close();  
  18.     }  
  19. }  

Dessa forma o arquivo de destino pode sofrer alterações:

  1. public class Teste {  
  2.     public static void main(String[] args) throws IOException {  
  3.         File arquivoOrigem = new File("c:/temp/original.txt");  
  4.         FileReader fis = new FileReader(arquivoOrigem);  
  5.         BufferedReader bufferedReader = new BufferedReader(fis);  
  6.         StringBuilder buffer = new StringBuilder();  
  7.         String line = "";  
  8.         while ((line = bufferedReader.readLine()) != null) {  
  9.             buffer.append(line).append("\n");             
  10.         }  
  11.           
  12.         fis.close();  
  13.         bufferedReader.close();  
  14.           
  15.         File arquivoDestino = new File("C:/temp/copia.txt");  
  16.         FileWriter writer = new FileWriter(arquivoDestino);  
  17.         writer.write(buffer.toString());  
  18.         writer.flush();  
  19.         writer.close();  
  20.           
  21.           
  22.           
  23.           
  24.     }  

quarta-feira, 17 de abril de 2013

JSF: Setar foco em um elemento que foi renderizado



<p:outputPanel id="optPanel">
   <h:inputText value="#{myBean.nome}" id="nome"/>

   <h:inputText>
      <a4j:ajax event="complete"  render="optPanel" oncomplete="nome.focus();"/>
   </h:inputText>
</p:outputPanel>

sexta-feira, 15 de março de 2013

limitar o número de registros retornados em uma consulta SQL


DB2 -- select * from table fetch first 10 rows only 
Informix, InterBase/Firebird, SKIP  -- select first 10 * from table 
Microsoft SQL Server and Access -- select top 10 * from table 
MySQL, PostgreSQL, SQLite, HSQL/H2 -- select * from table limit 10 
Oracle -- select * from table where rownum <= 10
Fonte: http://pontodebug.blogspot.com.br/2011/01/como-limitar-o-numero-de-registros.html

sexta-feira, 22 de fevereiro de 2013

JSF: selectBooleanCheckbox não funciona no primeiro click

Problema:
selectBooleanCheckbox não funciona no primeiro click, apenas do segundo em diante.


<a4j:commandButton
image="/resources/images/16x16/add.png"
execute="@form"
render="baixaPane"
oncomplete="#{rich:component('baixaPane')}.show();">
</a4j:commandButton>


<rich:column>

<f:facet name="header">BAIXAR</f:facet>
<h:selectBooleanCheckbox  value="#{lancamento.baixar}"
valueChangeListener="#{movimentoContaMB.receptor}" >
<a4j:ajax execute="@form" render="@form" />
</h:selectBooleanCheckbox>
</rich:column>

Solução:
Remover o render do a4j:commandButton.
<a4j:commandButton
image="/resources/images/16x16/add.png"
execute="@form"
oncomplete="#{rich:component('baixaPane')}.show();">
</a4j:commandButton>

terça-feira, 5 de fevereiro de 2013

Hibernate: Multipos @DiscriminatorValue / Multiple discriminator values



// Classe Base 
@DiscriminatorFormula("case when str_origem in ('CP','FE') then 'CP' when str_origem in ('CR','FE') then 'CR'  when str_origem in ('CP','CR','FE') then 'AL' end")
@DiscriminatorValue(value="AL")
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class LancamentoCc implements Serializable{
}

// SubClasse
@Entity
@DiscriminatorValue(value="CP")
public class ContaPagar extends LancamentoCc implements Serializable,Cloneable{
}

JSF: Exibir valor de h:inputText em managed bean

FacesContext ctx = FacesContext.getCurrentInstance();

Map<String,String> request = ctx.getExternalContext().getRequestParameterMap();
String data = request.get("NRO_PROCESSO");

sexta-feira, 1 de fevereiro de 2013

Firebird: Exibir total de registros de todas as tabelas


CREATE PROCEDURE SOMAREGISTROS
RETURNS (
    TABELA VARCHAR (31),
    QTD_REG INTEGER)
AS  declare variable comando varchar(100);
  declare variable qtdtot integer;
  declare variable qtdtab integer;

begin
     qtdtot = 0;
     qtdtab = 0;
   
     for select rdb$relation_name
         from rdb$relations
         where rdb$flags = 1 and rdb$view_blr is null
         order by 1
         into :tabela do
     begin
          qtdtab = qtdtab + 1;
          comando = 'select count(*) from ' || :tabela;
          execute statement :comando into :qtd_reg;
          qtdtot = :qtdtot + :qtd_reg;
          suspend;
     end
     tabela = :qtdtab || ' Tabelas - Total:';
     qtd_reg = :qtdtot;
     suspend;
end

segunda-feira, 21 de janeiro de 2013

Ignorar acentos no Oracle/Hibernate


No HibernateUtil:
Funciona para todas as queries, porém, pode haver perda de performance.


    public static Session getSession() {   
        if (SESSION_THREAD.get() == null) {   
            Session session = factory.openSession();   
            session.createSQLQuery("alter session set nls_comp=linguistic").executeUpdate();
            session.createSQLQuery("alter session set nls_sort=binary_ai").executeUpdate();
            SESSION_THREAD.set(session);   
        }   
        return (Session) SESSION_THREAD.get();   
    }

Diretamente no método de pesquisa:

public List<ContaPagar> findContaPagar(String campoPesquisa, String valor,Integer startRow, Integer MaxRows) {
List<ContaPagar> list = new ArrayList<ContaPagar>();
try{
    session.createSQLQuery("alter session set nls_comp=linguistic").executeUpdate();
    session.createSQLQuery("alter session set nls_sort=binary_ai").executeUpdate();
  Criteria c = session.createCriteria(ContaPagar.class,"contaPagar");
  c.createAlias("contaPagar.historicoFinanceiro", "historico",JoinType.LEFT_OUTER_JOIN);
  c.setCacheable(true);
  c.setMaxResults(MaxRows);
  c.setFirstResult(startRow);
  c.add(Restrictions.eq(campoPesquisa, StringToObject.toObject(valor)));
  
  list = c.list();
}catch (Exception e) {
e.printStackTrace();
}
return list;
}

Ignorando acentos no Oracle



Ignorando acentos no Oracle


 Hoje vamos falar um pouco sobre usabilidade utilizando o Oracle. É muito comum vermos
em grande sites de e-commerce, buscas e relacionamentos, entre outros,
que mesmo digitando uma palavra, sem sua acentuação correta, ou até
mesmo com acento colocado errado, encontramos a informação
desejada. Pois bem, veremos como isso é possível utilizando um banco
de dados Oracle.
Para
a consulta funcionar, devemos alterar os parâmetros nls_comp
e nls_sort.
O
parâmetro nls_comp
determina qual método de comparação será considerado na consulta.
Após a instalação do banco de dados seu valor inicial é “binary”.
  • Binary: todo SQL executado e baseado no
    método binário, exatamente da forma que está escrita a
    informação.
  • Linguistic: todo SQL executado e baseado no Método lingüístico, considerando
    a busca e a ordenação como a palavra e falada.
O
Parâmetro nls_sort
define qual combinação lingüística será utilizada. Para
instalações em que o idioma escolhido é o Português
(nls_language= portuguese),
o valor para o padrão lingüístico é o “Binário” (nls_sort
= binary).
Por
exemplo, utilizando a combinação binária, temos as seguintes
opções:
O
sufixo _ci indica que será utilizada a combinação binária
com Case-Insensitive Sort.
O
sufixo _ai indica que será utilizada a combinação binária
com Accente Insensitive Sort. Pode haver outros valores para o
parâmetro como, por exemplo, xspanish_ia, mas isso já é
assunto para outro artigo.
  • Binary: segue
    exatamente da mesma forma que foi escrita.
  • Binary_ci: o algoritmo compara exatamente como a palavra foi
    escrita, desconsiderando as letras maiúsculas e minúsculas.
    (Case-Insensitive Sort).
  • Binary_ai: o algoritmo compara as palavras ignora a acentuação
    e os maiúsculos e minúsculos. (Accent Insensitive Sort).
Por exemplo:
A letra “a”
pode ser comparada com as letras “ã,á,ä,à,â,ä”; a
letra “é” pode ser comparada com as letras “e,è,ê,ë”,
dentre outras acentuações.
Estes
parâmetros podem ser definidos para todo o banco de dados ou somente
para uma seção. O ideal é utilizar em locais apenas onde há real
necessidade, pois se utilizado para todo ambiente, pode degradar a
performance do banco de dados.
Vamos praticar.
Em
nosso cenário vamos considerar um cadastro de produto, que será
utilizando em um E-Commerce.
Logo, se um cliente
digitar o nome do produto sem a acentuação necessária ou com a
acentuação errada, o sistema deve ser capaz de identificar e
retornar o produto que ele procura.
Vamos criar um simples
cadastro de produtos:

create table tb_produto(nome varchar2(40), valor number(16,4));
insert into tb_produto(nome,valor) values ('Fogão 4 bocas',300);
insert into tb_produto(nome,valor) values ('Fogao 6 bocas',600);
insert into tb_produto(nome,valor) values ('Lava-louças',800);
insert into tb_produto(nome,valor) values ('Jogo de Faca',120);

Primeira situação:

Digamos
que o cliente digitou o nome do produto com a acentuação correta,
mas toda a palavra em minúscula, e que estamos utilizando o método
binário para consulta. Logo, ele não encontrará o produto que
procura!
SQL> select * from tb_produto where nome = 'lava-louças';

NOME                                                  VALOR
---------------------------------------- ------------------
Vamos
mudar os nossos parâmetros para não diferenciar maiúsculos e
minúsculos.
SQL> alter session set nls_comp=linguistic;

Session 
altered

SQL> alter session set nls_sort=binary_ai;

Session
 altered
Veja
que agora o Oracle encontra o produto solicitado.
SQL>  select * from tb_produto where nome = 'lava-louças';

NOME                                                  VALOR
---------------------------------------- ------------------
Lava-louças                                        800,0000

Segunda situação:

Vamos
simular que o usuário digitou o nome do produto sem a acentuação
devida.
SQL> select * from tb_produto where nome = 'lava-louças';

NOME                                                  VALOR
---------------------------------------- ------------------
Agora
vamos mudar o método de comparação para lingüístico, na seção
que estamos trabalhando.
SQL> alter session set nls_comp=linguistic;

Session altered

SQL> alter session set nls_sort=binary_ai;

Session altered
Veja
que o Oracle interpretou a letra “c”
sendo a mesma que “ç”.
Ou seja, ignorou o acento.
SQL> select * from tb_produto where nome = 'lava-loucas';

NOME                                                  VALOR
---------------------------------------- ------------------
Lava-louças                                        800,0000
Veja que, mesmo se
forçarmos um acento indevido, poderemos saber o preço da
lava-louça.
SQL> select * from tb_produto where nome = 'lava-loucás';

NOME                                                  VALOR
---------------------------------------- ------------------
Lava-louças                                        800,0000
Assim chegamos ao final
de mais um artigo, espero que tenham gostado!