Pesquisar este blog

segunda-feira, 24 de janeiro de 2011

sábado, 11 de setembro de 2010

Função para validar CPF em PHP

/*
     Delphi-like function para converter string para inteiro
*/
function StrToInt($value){
  return (int)$value; } /*   Função para validar CPF.   Baseado na função validaCPF (Delphi) do PoliGestor da empresa Polidados Informática Ltda. */ function validaCPF($cpf){   $CPFInvalido = array ('00000000000', '11111111111', '22222222222', '33333333333', '44444444444',                         '55555555555', '66666666666', '77777777777', '88888888888', '99999999999');   $digitado = "";   $calculado = "";   $Result = false;   try {      // verifica CPF inválido      for ($i = 0; $i < 9; $i++)        if ($cpf == $CPFInvalido[$i])          return false;      if ($cpf != ''){        $n1 = StrToInt($cpf[0]);        $n2 = StrToInt($cpf[1]);        $n3 = StrToInt($cpf[2]);        $n4 = StrToInt($cpf[3]);        $n5 = StrToInt($cpf[4]);        $n6 = StrToInt($cpf[5]);        $n7 = StrToInt($cpf[6]);        $n8 = StrToInt($cpf[7]);        $n9 = StrToInt($cpf[8]);        $d1 = $n9*2+$n8*3+$n7*4+$n6*5+$n5*6+$n4*7+$n3*8+$n2*9+$n1*10;        $d1 = 11-($d1 % 11);        if ($d1>=10)           $d1 = 0;        $d2 = $d1*2+$n9*3+$n8*4+$n7*5+$n6*6+$n5*7+$n4*8+$n3*9+$n2*10+$n1*11;        $d2 = 11-($d2 % 11);        if ($d2>=10)          $d2 = 0;        $calculado = $d1 . $d2;        $digitado = $cpf[9] . $cpf[10];        return ($calculado == $digitado) ? true : false;      }   }   catch (Exception $e) {     $Result = false;   } } ?>

sábado, 4 de setembro de 2010

Principais Visões para ORACLE

Lista das principais visões do ORACLE utilizadas no desenvolvimento PL/SQL e na administração do banco de dados. 


Fonte: http://www.techonthenet.com/oracle/sys_tables/index.php


ALL_ARGUMENTS Arguments in object accessible to the user
ALL_CATALOG All tables, views, synonyms, sequences accessible to the user
ALL_COL_COMMENTS Comments on columns of accessible tables and views
ALL_CONSTRAINTS Constraint definitions on accessible tables
ALL_CONS_COLUMNS Information about accessible columns in constraint definitions
ALL_DB_LINKS Database links accessible to the user
ALL_ERRORS Current errors on stored objects that user is allowed to create
ALL_INDEXES Descriptions of indexes on tables accessible to the user
ALL_IND_COLUMNS COLUMNs comprising INDEXes on accessible TABLES
ALL_LOBS Description of LOBs contained in tables accessible to the user
ALL_OBJECTS Objects accessible to the user
ALL_OBJECT_TABLES Description of all object tables accessible to the user
ALL_SEQUENCES Description of SEQUENCEs accessible to the user
ALL_SNAPSHOTS Snapshots the user can access
ALL_SOURCE Current source on stored objects that user is allowed to create
ALL_SYNONYMS All synonyms accessible to the user
ALL_TABLES Description of relational tables accessible to the user
ALL_TAB_COLUMNS Columns of user's tables, views and clusters
ALL_TAB_COL_STATISTICS Columns of user's tables, views and clusters
ALL_TAB_COMMENTS Comments on tables and views accessible to the user
ALL_TRIGGERS Triggers accessible to the current user
ALL_TRIGGER_COLS Column usage in user's triggers or in triggers on user's tables
ALL_TYPES Description of types accessible to the user
ALL_UPDATABLE_COLUMNS Description of all updatable columns
ALL_USERS Information about all users of the database
ALL_VIEWS Description of views accessible to the user
DATABASE_COMPATIBLE_LEVEL Database compatible parameter set via init.ora
DBA_DB_LINKS All database links in the database
DBA_ERRORS Current errors on all stored objects in the database
DBA_OBJECTS All objects in the database
DBA_ROLES All Roles which exist in the database
DBA_ROLE_PRIVS Roles granted to users and roles
DBA_SOURCE Source of all stored objects in the database
DBA_TABLESPACES Description of all tablespaces
DBA_TAB_PRIVS All grants on objects in the database
DBA_TRIGGERS All triggers in the database
DBA_TS_QUOTAS Tablespace quotas for all users
DBA_USERS Information about all users of the database
DBA_VIEWS Description of all views in the database
DICTIONARY Description of data dictionary tables and views
DICT_COLUMNS Description of columns in data dictionary tables and views
GLOBAL_NAME global database name
NLS_DATABASE_PARAMETERS Permanent NLS parameters of the database
NLS_INSTANCE_PARAMETERS NLS parameters of the instance
NLS_SESSION_PARAMETERS NLS parameters of the user session
PRODUCT_COMPONENT_VERSION version and status information for component products
ROLE_TAB_PRIVS Table privileges granted to roles
SESSION_PRIVS Privileges which the user currently has set
SESSION_ROLES Roles which the user currently has enabled.
SYSTEM_PRIVILEGE_MAP Description table for privilege type codes. Maps privilege type numbers to type names
TABLE_PRIVILEGES Grants on objects for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee
TABLE_PRIVILEGE_MAP Description table for privilege (auditing option) type codes. Maps privilege (auditing option) type numbers to type names

terça-feira, 31 de agosto de 2010

Exemplo de Midlet

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.util.Date;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;


/**
 * @author agilar
 */
public class CadastroCliente extends MIDlet {
    private Display display;
    private Form frmCadastro;
    private TextField txtNome, txtEndereco, txtFone, txtEmail;
    private DateField txtDtCadastro;
    private ChoiceGroup sexo, casado;

    private void createGUI(){
        txtNome = new TextField("Nome", "", 70, TextField.ANY);
        frmCadastro.append(txtNome);

        txtEndereco = new TextField("Endereço", "", 70, TextField.ANY);
        frmCadastro.append(txtEndereco);

        txtFone = new TextField("Fone", "", 20, TextField.PHONENUMBER);
        frmCadastro.append(txtFone);

        txtEmail = new TextField("E-mail", "", 30, TextField.EMAILADDR);
        frmCadastro.append(txtEmail);

        txtDtCadastro = new DateField("Data Cadastro", DateField.DATE);
        txtDtCadastro.setDate(new Date());
        frmCadastro.append(txtDtCadastro);
        
        sexo = new ChoiceGroup("Sexo", ChoiceGroup.EXCLUSIVE);
        sexo.append("Masculino", null);
        sexo.append("Feminino", null);
        frmCadastro.append(sexo);
        
        casado = new ChoiceGroup("Casado", ChoiceGroup.EXCLUSIVE, new String[] {"Sim", "Não"}, null);
        frmCadastro.append(casado);

    }

    public void startApp() {
        display = Display.getDisplay(this);
        frmCadastro = new Form("Cadastro de Clientes");
        createGUI();
        display.setCurrent(frmCadastro);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

quinta-feira, 12 de agosto de 2010

Arvore binária simples com os três métodos de caminhamento

/*
 * Árvore binária simples com os três métodos de caminhamento: 
 *   Pré-Fixado 
 *      Central 
 *   Pós-Fixado
 * 
 * Autor: Everton Agilar 
 * Data: 12/08/2010
 * 
 */


package aula.arvore;

public class Arvore {
 int valor;
 Arvore esq;
 Arvore dir;

 public Arvore(int valor){
  this.valor = valor;
  this.esq = null;
  this.dir = null;
 }
 
 public void add(Arvore no){
  if (no.valor < this.valor){
   if (esq == null){
    esq = no;
   }else {
    esq.add(no);
   }
  }
  else {
   if (no.valor > this.valor){
    if (dir == null){
     dir = no;
    }
    else {
     dir.add(no);
    }
   }
  }
 }
 
 public void caminhamentoPreFixado(){
  System.out.printf("%d%n", valor);  // a raiz é acessada por primeiro
  if (esq != null) 
   esq.caminhamentoPreFixado();
  if (dir != null) 
   dir.caminhamentoPreFixado();
 }
 
 public void caminhamentoCentral(){
  if (esq != null) 
   esq.caminhamentoCentral();
  System.out.printf("%d%n", valor);  // a raiz é acessada no meio   
  if (dir != null) 
   dir.caminhamentoCentral();
 }

 public void caminhamentoPosFixado(){
  if (esq != null) 
   esq.caminhamentoPosFixado();
  if (dir != null) 
   dir.caminhamentoPosFixado();
  System.out.printf("%d%n", valor);  // a raiz é a última acessada
 }

 public static void main(String[] args) {
  System.out.println("Demonstração de formas de caminhamento em árvore binária\n");
  
  Arvore arv = new Arvore(10);
  arv.add(new Arvore(8));
  arv.add(new Arvore(12));
  arv.add(new Arvore(4));
  arv.add(new Arvore(14));
  arv.add(new Arvore(2));
  arv.add(new Arvore(1));
  
  System.out.println("Caminhamento Pré-Fixado:");
  arv.caminhamentoPreFixado();
  
  System.out.println("\nCaminhamento In-Fixado ou Central:");
  arv.caminhamentoCentral();

  System.out.println("\nCaminhamento Pós-Fixado:");
  arv.caminhamentoPosFixado();
 }
}

quarta-feira, 11 de agosto de 2010

Regras Firewall Pessoal - iptables

#/bin/bash
# Regras de Firewall
# Autor: Everton Agilar
# Última alteração: 11/08/2010

# Limpa todas as tabelas
iptables -t filter -F INPUT
iptables -t filter -F OUTPUT
iptables -t filter -F FORWARD

# Define política padrão (DROP)
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP

# Permite pacotes de loopback
iptables -t filter -A INPUT -i lo -j ACCEPT

# Permite pacotes de entrada gerados dentro da rede
iptables -t filter -A INPUT -i wlan0 -p tcp -m state --state related,established -j ACCEPT
iptables -t filter -A INPUT -i wlan0 -p udp -m state --state related,established -j ACCEPT
iptables -t filter -A INPUT -i wlan0 -p icmp -m state --state related,established -j ACCEPT
iptables -t filter -A INPUT -i wlan0 -p tcp --sport 20:21 -j ACCEPT
iptables -t filter -A INPUT -i wlan0 -p tcp --sport 1863 -j ACCEPT
iptables -t filter -A INPUT -i wlan0 -p tcp --sport 443 -j ACCEPT


# Permite pacotes de saída para icmp,www,domain,ftp,msn,https
iptables -t filter -A OUTPUT -o wlan0 -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -o wlan0 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -o wlan0 -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -o wlan0 -p tcp --dport 20:21 -j ACCEPT
iptables -t filter -A OUTPUT -o wlan0 -p tcp --dport 1863 -j ACCEPT
iptables -t filter -A OUTPUT -o wlan0 -p tcp --dport 443 -j ACCEPT

segunda-feira, 26 de julho de 2010

Exemplo de Applet e os eventos de ativação

package aula.applet;

import java.applet.*;
import java.awt.Graphics;

public class HelloWorldApplet extends Applet implements Runnable {
    Thread anime = null;
    
    public void init(){
        System.out.println("Inicializando...");
        
    }

    public void start(){
        System.out.println("Startando...");
        if (anime == null){
            System.out.println("Cria animador...");
            anime = new Thread(this);
            anime.start();
        };    
    }
    
    public void stop(){
        System.out.println("Parando...");
        anime.interrupt();
        anime = null;
    }
    
    
    public void destroy(){
        System.out.println("Morrendo...");
    }
    
    public void paint(Graphics g){
        int x = new java.util.Random().nextInt(100);
        int y = new java.util.Random().nextInt(100);
        g.drawString("Ola Mundo", x, y);
        System.out.println("pintando...");
    }

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()){ 

            try {
                Thread.currentThread().sleep(2000);
            } catch (InterruptedException e) {
            }

            if (isActive())
                repaint();
            else {
                break;
            }    
        }
        
        System.out.println("Finalizando animador...");
        return;
    }

}

sexta-feira, 23 de julho de 2010

Comandos diversos

1 - Para listar somente diretórios
 
  ls -l | grep "^d"

   Sinopse: ^ significa primeira letra, que nesse caso é d

2 - Para listar somente arquivos executáveis

  ls -l | grep "^-..x"

  Sinopse: ^ significa lista primeira letra, nesse caso - significa arquivo comum, pula
     dois caracteres de permissão (rw) e encontra o x se o arquivo estiver com permissão de
     executável

3 - Como listar arquivos somente em uma linha
 
  ls -1

  Sinopse: -1 significa 1 linha

4 - Como listar arquivos pelo mais recente (o que foi modificado por último)

  ls -1t

  Sinopse: Use -1 para listar apenas uma coluna e -t para listar pela data de modificação


5 - Como alterar a data/hora

  date 092713202006
  clock -w

  Sinopse: O comando date serve para alterar a data/hora.
           Foi passado no formato mêsdiahoraminutoano.
           Logo em seguinda foi usado o comando clock -w para gravar a data/hora na bios.

6 - Copiando usando tar
    Use o comando tar.

    $ (cd /origem && tar cf - . ) | (cd /destino && tar xvfp -)

    Preste atenção nos parêntesis, eles fazem com que a operação seja executada em uma subshell,
    não afetando a shell que vc está usando.

7 - Como saber o tamanho de um diretório em MB?
     du -sm nome_do_diretório

8 - Como se tornar o root sem efetuas logou

   su root ou su -

   Sinopse: Digite o comando e após informe a senha


RPM
-------------------------------------------------

8 - Saber se um arquivo pertence a um pacote

   rpm -qf nomearquivo

9 - Saber os arquivos de um pacote

  rpm -ql koules-1.2-2.i386.rpm

10 - Obter informações sobre um pacote

  rpm -qi coreutils


11 - Ver uma lista de todos os pacotes instalados

  rpm -qa

12 - Como instalar, atualizar e remover pacotes
 
  rpm -ivh nompacote.rpm
  rpm -U nomepacote.rpm
  rpm -e nomepacote

13 - Como testar se um pacote pode ser instalado corretamente

  rpm -i --test nomepacote.rpm

14 - Reinstalar um pacote

  rpm -U --replacedpkgs nomepacote.rpm


Redes
---------------------------------------------------

1 - Como saber as portas TCP abertas

  netstat -an | grep LISTEN

 


diff e patch
-------------------------------------------------------------------

1 - Como comparar dois arquivos e gerar um arquivo das diferenças

   diff -a arq1 arq2 > dif.txt

   Sinopse: A opção -a foi usada para ser modo texto


G++
-------------------------------------------------------------------

1 - Compilar um programa usando uma bibliteca externa

  g++ -o app1.exe -Wl,--add-stdcall-alias,L.,-msgdll app1.c


2 - Compilar sem usar a rtl cygwin1.dll

  Incluir a opção -mno-cygwin no g++


--------------------------------------------------------------------

1 - Como redirecionar dispositivos no Windows

   Ver comando MODE

  Ex.: MODE LPT1:=COM1:    
       Este comando redireciona tudo que vai para LPT1 para COM1




    

terça-feira, 6 de julho de 2010

Criando objetos com javascript


Exemplo de código em javascript para criar e instânciar objetos

        // Classe Pessoa

    function pessoa(nome, idade, endereco){


      this.nome = nome;
      this.idade = idade;
      this.endereco = endereco;
      function gritar(){
        if (this.idade >= 30)
     document.write("aaaaaaaaaaaaaaaa! ");
        else
  document.write("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa! ");
      } 
   
      this.gritar = gritar;
    }

    // Classe Calc 
    function Calc(){
   
      function add(x, y){
        return x + y;
      } 
      function subtract(x, y){
        return x - y;
      } 
      this.add = add;
      this.subtract = subtract; 
    }

    // instância a calculadora e faz cálculos matemáticos
    var c = new Calc();
    document.write("2+2=" + c.add(2, 2) + " ");
    document.write("2-2=" + c.subtract(2, 2) + " ");

    // instância pessoas e imprime seus nomes
    var joao = new pessoa("Joao", 30, "rua X");
    document.write(" My name is " + joao.nome + " e tenho " + joao.idade + " anos ");
    joao.gritar();
    // instância Maria e imprime seu nome
    var maria = new pessoa("Maria", 25, "rua Y");
    document.write(" My name is " + maria.nome + " e tenho " + maria.idade + " anos ");
    maria.gritar();

 

sábado, 26 de junho de 2010

Base de fatos e regras família em Prolog

homem(everton).
homem(joao).
homem(marcos).
homem(jader).
homem(henrique).
homem(jonas).
homem(leo).
homem(rodrigo).

mulher(thaise).
mulher(mara).
mulher(carol).
mulher(melina).

marido(everton, thaise).
marido(joao, carol).

esposa(mara, jader).

filho(henrique, everton).
filho(jonas, marcos).
filho(leo, melina).
filho(rodrigo, mara).

casado_com(X, Y):- homem(X),
               mulher(Y),
               marido(X, Y), !.
casado_com(X, Y):- homem(X),
               mulher(Y),
               esposa(Y, X), !.           
casado_com(X, Y):- mulher(X),
               homem(Y),
               esposa(X, Y), !.
casado_com(X, Y):- mulher(X),
               homem(Y),
               marido(Y, X), !.           

tem_filho(X):- homem(X),
           filho(Y, X), !.    

tem_filho(X):- mulher(X),
           filho(Y, X), !.    

tem_filho(X):- casado_com(X, Y),   
           filho(K, Y), !.   

sábado, 19 de junho de 2010

Questões sobre Gerenciamento de Projetos

1 - O QUE É UM PROJETO
   
    É um esforço progressivo e temporário para criar um produto ou serviço único.

2 - O QUE É GERENCIAMENTO DE PROJETOS

    É a aplicação de ferramentas, técnicas, conhecimentos e habilidades de gerência de projetos
    a fim de atender a seus requisitos.

3 - QUAIS OS PROCESSOS DO GERENCIAMENTO DE PROJETOS

    São cinco: iniciação, planejamento, execução, controle e encerramento

4 - QUAIS AS ÁREAS DE CONHECIMENTO DO GERENCIAMENTO DO PROJETO

    São nove áreas:

    * Gerenciamento de Integração - processos necessários para gerenciar e coordenar
      os diversos grupos do gerenciamento de projetos;
        Palavra chaves: Termo de abertura, plano de gerenciamento de projeto, 
                    controle e monitoramento.

    * Gerenciamento do Escopo - processos envolvidos na verificação de que o projeto
      inclui todo o trabalho e somente o necessário para concluir com sucesso.
        Palavras chaves: coletar requisitos, definir escopo, criar EAP, verificar e controlar escopo.

    * Gerenciamento do Tempo - processos necessários para assegurar o termino
      do projeto no tempo definido.
        Palavras chaves: Definir e sequenciar atividades, estimar recursos e duração das atividades,
                 desenvolver e controlar cronograma.

    * Gerenciamento de Custos - processos envolvidos no planejamento, estimativa, orçamentação
      e controle de custos de modo que o projeto termine dentro do orçamento aprovado.
        Palavras chaves: estimar custo, determinar orçamento, controlar custo.

    * Gerenciamento da Qualidade - processos envolvidos na garantia de que o projeto 
      irá satisfazer os objetivos para os quais foi realizado.
        Palavras chaves: Planejar qualidade, realizar garantia e controle da qualidade.

    * Gerenciamento de Recursos Humanos - processos que organiza e gerencia a equipe do projeto.
        Palavras chaves: desenvolver plano de RH, mobilizar equipe, desenvolver e gerenciar equipe.

    * Gerenciamento das comunicações - processos relativos a geração e disseminação da informação
      do projeto as pessoas interessadas.
        Palavras chaves: Identificar interessados, planejar comunicação, reportar desempenho, 
                 gerenciar expectativas.

    * Gerenciamento de Riscos - processos para realizar o gerenciamento dos riscos do projeto.
        Palavras chaves: planejar e identificar riscos, fazer análise 
                 qualitativa e quantitativa dos riscos, monitorar e controlar riscos.

    * Gerenciamento de Aquisições - processos para compra e aquisição de produtos, serviços, 
          resultados e contratos.
        Palavras chaves: planejar e realizar aquisições, administrar e encerrar aquisições.


5 - QUAIS AS HABILIDADES DE UM GERENTE DE PROJETO

    São cinco:
        Habilidades organizacionais - organização e planejamento
        Habilidades para finanças e contabilidade - estimar custos e desenvolver orçamentos
        Habilidades de liderar - direcionamento e envolvimento da equipe
        Habilidades de negociar e influênciar - dialogar e obter consenso
        Habilidades de comunicação - comunicação clara e objetiva


6 - DEFINA O CONTEXTO DO GERENCIAMENTO
   
    São cinco:
        Portfólio - carteira de negócios (conj. de programas e/ou projetos)
        Programas - são conj. de projetos administrados juntos. Ex.: Programa Educacional
        Projeto - é um esforço progressivo e temporário para criar um produto ou serviço único.
        Tarefa - elemento de trabalho com duração, custo e recurso definido.
        Pacote de trabalho - menor unidade de trabalho possível de ser planejada, controlada e executada.

7 - O QUE É UM PMO

    Escritório de projetos. Orienta e fornece suporte aos gerentes de projeto.


8 - PORQUE ESTUDAR GERENCIAMENTO DE PROJETOS

    Porque falhas em projetos em suas definições de tempo, prazo e custo são elevadas 
    quando não se aplicam técnicas consistentes de gerenciamento de projetos. Estudos
    mostram que o uso de gerenciamento de projetos aumenta as chances do projeto concluir no    prazo e no orçamento estipulado.


9 - PARA GESTÃO DE UM PROJETO, QUAIS OS CICLOS DE VIDA QUE PRECISAMOS CONSIDERAR

    São três:   
    Ciclo de vida do produto - permanência do produto no mercado
        Palavras chaves: idealização, concepção, construção, uso e descarte.

    Ciclo de vida do projeto - descreve o que deve ser feito para completar o projeto (definem inicio, meio e fim)
        Palavras chaves: Termo de abertura, plano do projeto, declaração do escopo, progresso, aceitação, aprovação, entrega

    Cicle de vida da GP - descreve o que deve ser feito para gerenciar o projeto (grupos de processos)
        Palavras chaves: iniciação, planejamento, execução, controle, encerramento.


10 - CARACTERÍSTICAS DO CICLO DE VIDA DE UM PROJETO DE SOFTWARE

    - fases geralmente sequenciadas
    - custos e uso do pessoal baixos no início, aumentam durante a execução e cai rapidamente no final
    - no início do projeto, nível de incerteza e riscos maiores e caem no final
    - capacidade dos stakeholders em influênciar no projeto são maiores no início
    - mudanças tem maior impacto a medida que a execução do projeto avança


11 - QUEM SÃO OS STAKEHOLDERS

    São os interessados no projeto, ou seja, pessoas ou organizações que influênciam
    ou são influênciados, positivamente ou negativamente, pelos resultados de um projeto.


12 - QUEM SÃO OS PRINCIPAIS STAKEHOLDERS

    Gerente do projeto, cliente, usuário, membros da equipe, patrocinador, fornecedores, PMOs.
   

13 - QUAIS OS FATORES DE SUCESSO DE UM PROJETO

    - seleção dos processos adequados
    - uso de abordagem definida
    - atendimento aos requisitos do cliente
    - balançeamento de interesses entre os vários interessados


14 - FATORES QUE DETERMINAM A NECESSIDADE OU NÃO DE GERENCIAMENTO DE PROJETO

    - Tamanho do empreendimento
    - Importãncia do empreendimento
    - Reputação da organização
    - Compartilhamento de recursos
    - Não familiaridade - empreendimento completamente novo


15 - TIPOS DE PROCESSOS

    - Orientado ao Projeto - Iniciação, planejamento, execução, controle, monitoramento, encerramento.
    - Orientado ao Produto - Especificação e criação do produto do projeto.

quarta-feira, 12 de maio de 2010

Formatando datas no ORACLE para importar scripts do IBExpert

Ao executar scripts com inserts ou updates gerados pelo IBExpert do banco de dados Firebird no ORACLE, precisamos configurar corretamente a sessão para tratar o formato de data corretamente, caso contrário, ocorrerá erros na execução dos scripts.

Dois parâmetros no ORACLE devem ser configurados:
  • nls_date_format
  • nls_timestamp_format

A máscara default utilizado pelo IBExpert para formatar as datas é 'YYYY-MM-DD' para o tipo DATE e 'YYYY-MM-DD HH:MI:SS' para o tipo TIMESTAMP. No ORACLE pode-se executar os seguintes comandos para configurar as máscaras:

Para o tipo DATE:

ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';

Para o tipo TIMESTAMP:

ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS';

Seguindo estes procedimentos, consegue-se importar registros que contém campos de data e timestamp de forma simples.

Uma observação é quanto ao tipo TIME do Firebird, inexistente no ORACLE. Para este tipo de dados pode-se armazenar como VARCHAR2(8).

Até o próximo post!

sexta-feira, 7 de maio de 2010

Oracle Pipelined Table Functions

Material sobre como implementar procedures selecionável, um recurso do Firebird em ORACLE através de funções pipelined table functions:

http://www.akadia.com/services/ora_pipe_functions.html
http://mail.firebase.com.br/pipermail/lista_firebase.com.br/2008-February/049950.html

quinta-feira, 6 de maio de 2010

Ativar teclas de atalho para o sqlplus no Linux

Muitos sabem que ao trabalhar com sqlplus no Linux, não temos a opção de utilizar teclas de atalho para navegar entre os comandos digitados.

Recentemente descobri uma software que pode ser instalado, que permite ativar as teclas de atalho para o sqlplus. Para instalar digite o seguinte comando no prompt de comando.

sudo apt-get install rlwrap

Após instalado, precisamos invocar o sqlplus desta forma:

rlwrap sqlplus user/senha

Com isso, teremos um histórico de comandos da mesma forma que em ambiente Windows.

quarta-feira, 5 de maio de 2010

Usando sudo para executar comandos como root no Linux

No Linux, quando você precisar executar um comando que exige permissões de root, pode-se usar o comando sudo. Ao usar o comando sudo, o Linux vai pedir a senha do root e executar o comando.

Para que qualquer usuário possa utiliza-lo é necessário informar ao Linux que o usuário pertence ao grupo sudo. Podemos fazer isso através do usuário root da seguinte forma:
usermod -G sudo agilar

O comando acima adiciona o usuário agilar no grupo sudo. A partir dai, pode-se utilizar sudo toda vez que precisarmos executar um comando com permissões de root para o usuário agilar.

domingo, 7 de março de 2010

Windows Seven com Delphi 7

1 - Ao instalar o Delphi 7 diversos arquivos BPL são instalados na pasta C:\Windows\SysWOW64.

A pasta SysWOW64 contém as DLLs de 32 bits. Já a pasta C:\Windows\System32 contém arquivos DLLs de 64 bits. Quando um programa necessita de uma DLL de 32 bits, automaticamente é redirecionado para a pasta C:\Windows\SysWOW64. Pode parecer estranho, mas é assim que o Windows funciona. A pasta C:\Windows\System32 ainda continua existindo, mas seu conteúdo é de 64 bits!

2 - Como substituir o QuickReport do Delphi 7 por outra versão.

Antes de instalar a bpl qrpt70.bpl deve-se primeiro excluir o arquivo c:\windows\SysWOW64\qrpt70.dll e reabrir o Delphi.

3 - Mostrar arquivos e pastas ocultas do Windows

No Windows Explorer, clique no botão Organizar, Opções de pasta e pesquisa. Na janela "Opções de Pasta" possui diversos opções para mostrar pastas e arquivos ocultos.

4 - Como acessar a pasta "Arquivos de Programas" no menu Executar.

Digite "program files".

Obs.: Se você digitar "arquivos de programas" como no Windows XP, aparece a mensagem acesso negado.

segunda-feira, 25 de janeiro de 2010

Usando condições ANY ou SOME

Dado o esquema a seguir:
SQL> desc valores
Nome                Nulo?    Tipo
------------------- -------- ---------
V                            NUMBER(38)

SQL> select * from valores;

V
----------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

18 linhas selecionadas.

SQL>


Exemplos de Condições SQL
EXEMPLO 1
SQL> select * from valores
  2  where v = some(1, 3, 10);

         V
----------
         1
         3
        10

3 linhas selecionadas.

EXEMPLO 2

  1  select * from valores
  2* where v > some(3, 10, 11)
SQL> /

         V
----------
         4
         5
         6
         7
         8
         9
        10
        11
        12
        13
        14
        15
        16
        17
        18

15 linhas selecionadas.

EXEMPLO 3

  1  select * from valores
  2* where v > all(3, 10, 11)
SQL> /

         V
----------
        12
        13
        14
        15
        16
        17
        18

7 linhas selecionadas.



sexta-feira, 22 de janeiro de 2010

Desafio SQL: Alias em SQL

Ola, vou iniciar este post com uma questão para resolvermos.
Considere a seguinte questão:
SQL>
1 select id "Produto ID", sum(preco) "Preco"
2 from estoque
3 where Preco > 50
4 group by "Produto ID"
5* order by sum(preco)

Qual linha causa um erro ?


Analisando a questão, pode-se perceber várias partes que podem dar a entender estar errado. Olhando o SQL, vemos que os campos utilizam-se de alíases, e o campo preco tem um alias semelhante ao nome do campo: "Preco". Isso pode passar despercebido ou confundir, fazendo alguém pensar que a linha 3 está errado, pois o alias está sendo referênciado.

Então a primeira regra que temos que saber: na cláusula WHERE, devemos referênciar o campo e não o alias, senão um erro ocorre.

Na consulta acima, agora não resta dúvida, estamos acessando o campo preco, pois SQL é case insensitive, não importa como escrevemos: preco, Preco, PRECO, PReco, etc. Com isso, podemos concluir também que, se fizermos uma prova para certificação em SQL e aparecer um alias na cláusula WHERE, é certo que há um erro ai.

Para não restar dúvida, segue um SQL de exemplo:

SQL> select codigo "Codigo" from estoque
  2  where "Codigo" <> 0;
where "Codigo" <> 0
      *
ERRO na linha 2:
ORA-00904: "Codigo": identificador invßlido

Seguindo o exercício da questão, alguns podem dizer que a linha 4 está errado. E de fato, está. A mesma regra do WHERE vale no GROUP BY, na cláusula WHERE e GROUP BY, devemos referênciar o campo e não o alias, senão um erro ocorre.

Segue dois exemplos, o primeiro SQL referenciou um alias no group by e o segundo o próprio campo:

EXEMPLO 1:
SQL>
  1  select codigo as num
  2  from estoque
  3* group by num
SQL> /
group by num
         *
ERRO na linha 3:
ORA-00904: "NUM": identificador invßlido

EXEMPLO 2:
SQL>
  1  select codigo as num
  2  from estoque
  3* group by codigo
SQL> /

NUM
-------------
1255
124
126
125

Bom, sabemos que o erro na questão está na linha 4, onde é referênciado o alias "Produto ID". Mas quero mostrar outra regra, que nesta questão não se aplica, mas que devemos saber mesmo assim:

Na cláusula ORDER BY, podemos acessar tanto o campo, como o alias ou um número que indica a posição do campo na cláusula SELECT.

Isso pode confundir muitos, pois porque não podemos acessar o alias no WHERE e no GROUP BY mas podemos acessar no ORDER BY. E ainda, podemos acessar o campo pela sua posição na lista de campos do SELECT.

Isso mesmo, segue vários exemplos que mostram isso na prática:

EXEMPLO 1:
SQL>
  1  select codigo as num
  2  from estoque
  3* order by codigo
SQL> /

NUM
-------------
124
124
124
125
125
125
1255
126

8 linhas selecionadas.

EXEMPLO 2:
SQL>
  1  select codigo as num
  2  from estoque
  3* order by num
SQL> /

NUM
-------------
124
124
124
125
125
125
1255
126

8 linhas selecionadas.

EXEMPLO 3:
SQL>
  1  select codigo as num
  2  from estoque
  3* order by 1
SQL> /

NUM
-------------
124
124
124
125
125
125
1255
126

8 linhas selecionadas.

SQL>

Então como vemos, o ORDER BY é a cláusula mais flexivel de todas, podemos acessar os campos da consulta de qualquer maneira e vai funcionar. A cláusula ORDER BY tem como finalidade ordenar as tuplas de uma relação, portanto, ela é a última etapa executada e consegue ver a relação pronta, ao contrário das demais cláusulas.


Mais uma vez, espero ter ajudado a comunidade de desenvolvedores, sempre tive muita dúvida a respeito disso, até que resolvi escrever este post e testar de diversas maneiras, vários SQL e terminar de uma vez por todas, estas dúvidas sobre o uso do alias em consultas SQL.


Até o próximo post!

Números randômicos em ORACLE

Neste post, vamos ver uma dica para obter números aleatórios. A ORACLE disponibiliza a package DBMS_RANDOM. Vamos consultar as funções disponíveis usando o seguinte comando no SQL-Plus:

SQL> desc dbms_random
PROCEDURE INITIALIZE
 Nome do Argumento                  Tipo                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 VAL                            BINARY_INTEGER          IN
FUNCTION NORMAL RETURNS NUMBER
FUNCTION RANDOM RETURNS BINARY_INTEGER
PROCEDURE SEED
 Nome do Argumento                  Tipo                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 VAL                            BINARY_INTEGER          IN
PROCEDURE SEED
 Nome do Argumento                  Tipo                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 VAL                            VARCHAR2                IN
FUNCTION STRING RETURNS VARCHAR2
 Nome do Argumento                  Tipo                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OPT                            CHAR                    IN
 LEN                            NUMBER                  IN
PROCEDURE TERMINATE
FUNCTION VALUE RETURNS NUMBER
FUNCTION VALUE RETURNS NUMBER
 Nome do Argumento                  Tipo                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 LOW                            NUMBER                  IN
 HIGH                           NUMBER                  IN

Como se pode ver, existem diversas funções para gerar números aleatórios. No exemplo a seguir, vou demonstrar como gerar números aleatórios inteiros entre 1 e 100:

SQL> select trunc(dbms_random.value(1, 100)) num  from dual;

       NUM
----------
        89

SQL> select trunc(dbms_random.value(1, 100)) num  from dual;

       NUM
----------
         9

SQL> select trunc(dbms_random.value(1, 100)) num  from dual;

       NUM
----------
        39

No exemplo, três instruções SQL consecutivas exibem como a função DBMS_RANDOM.VALUE funciona. Ela retorna um valor NUMBER. Como sabemos o tipo NUMBER pode armazenar tanto números inteiros como números ponto flutuante. Para retornar um inteiro, foi utilizado a função TRUNC. A função utilizada permite passar o range da randomização, o que pode ser muito útil.


É isso ai, espero ter ajudado a quem procura uma maneira de gerar números randômicos em ORACLE.
Até mais!