Powered By Blogger

sexta-feira, 25 de novembro de 2011

PHP - Conversor de DBF para Oracle

 Requisitos:
- SQLLOADER
- SQLPLUS
- Extensão DBASE habilitada no php.ini

 /* Exemplo de utilização da Classe loader */

$loader = new Loader();
//CAMINHO DO DBF
$loader->arquivo_dbf = 'dbf/transcdd.dbf';

//ARQUIVOS GERADOS PELO PROCESSO
$loader->arquivo_ctl = 'tmp/transcdd.ctl';
$loader->arquivo_csv = 'tmp/transcdd.csv';
$loader->arquivo_sql = 'tmp/transcdd.sql';
$loader->arquivo_log = 'tmp/transcdd.log';

//DADOS DE CONEXAO COM O ORACLE
$loader->tabela_oracle = 'transcdd_teste';
$loader->user_db = 'usuario';
$loader->pass_db = 'senha123';
$loader->host_db = '192.168.0.25';
$loader->port_db = '1521';
$loader->service = 'SERVORACLE';


$loader->separador = ';';
$loader->terminador = '||';
$loader->executar();
?>

/* Implementação da Classe loader */


class Loader{
   
    public $arquivo_dbf;
    public $arquivo_csv;
    public $arquivo_sql;
    public $arquivo_log;
    public $tabela_oracle;
   
    public $user_db;
    public $pass_db;
    public $host_db;
    public $port_db;
    public $service;
    public $separador;
    public $terminador;
   
    public function __construct(){
        set_time_limit(0);
    }
   
    public function executar(){
        $this->abrir_dbf();
        $this->obter_campos();
        $this->criar_sql();
        $this->criar_ctl();
        $this->criar_csv();
        $this->criar_tabela();
        $this->popular_tabela();
        $this->fechar_dbf();
    }
   
    public function abrir_dbf() {
        $this->dbf = dbase_open( $this->arquivo_dbf, 0 );
        if( $this->dbf ) {
            return true;
        } else {
            return false;
        }   
    }
   
    public function fechar_dbf() {
        return dbase_close($this->dbf);
    }
   
    //OBTEM INFORMACOES DO DBF
    public function obter_campos() {
        if ($this->dbf) {
            $nf  = dbase_numfields($this->dbf);
            $column_info = dbase_get_header_info($this->dbf);
            $this->campos = array();
            $cont=0;
            for ($e = 0; $e < $nf; $e++) {
                $name         = $column_info[$e]['name'];
                $length     = $column_info[$e]['length'];
                $precision     = $column_info[$e]['precision'];
                switch( $column_info[$e]['type'] ) {
                    case 'date':
                        $this->campos['SQL'][$e]     = "\"$name\" DATE NULL  \r\n";
                        $this->campos['CTL'][$e]     = "$name DATE \"YYYYMMDD\" NULLIF ($name=BLANKS) \r\n";
                        $this->campos['NOME'][$e]     = $column_info[$e]['name'];
                        $this->campos['POS'][$e]     = $cont;
                        $cont++;
                        break;
                    case 'character':
                        $this->campos['SQL'][$e]     = "\"$name\" VARCHAR2($length BYTE) \r\n";
                        $this->campos['CTL'][$e]     = "$name \r\n";
                        $this->campos['NOME'][$e]     = $column_info[$e]['name'];
                        $this->campos['POS'][$e]     = $cont;
                        $cont++;
                        break;
                    case 'boolean':
                        $this->campos['SQL'][$e]     = "\"$name\" CHAR(1 BYTE) \r\n";
                        $this->campos['CTL'][$e]     = "$name \r\n";
                        $this->campos['NOME'][$e]     = $column_info[$e]['name'];
                        $this->campos['POS'][$e]     = $cont;
                        $cont++;
                        break;
                    case 'memo':
                        break;
                    case 'number':
                        $this->campos['SQL'][$e]     = "\"$name\" NUMBER($length,$precision) \r\n";
                        $this->campos['CTL'][$e]     = $name . ( ($precision) ? "\"REPLACE(:$name, '.', ',')\" \r\n" :  " \r\n"   );
                        $this->campos['NOME'][$e]     = $column_info[$e]['name'];
                        $this->campos['POS'][$e]     = $cont;
                        $cont++;
                        break;
                    default:
                        $this->campos['SQL'][$e]     = "\"$name\" \r\n";
                        $this->campos['CTL'][$e]     = "$name \r\n";
                        $this->campos['NOME'][$e]     = $column_info[$e]['name'];
                        $this->campos['POS'][$e]     = $cont;
                        $cont++;
                        break;
                }
            }
        }
    }
   
    //CRIA O CTL DA TABELA
    public function criar_ctl() {
          $campos = implode( ',', $this->campos['CTL'] );
        $fp = fopen( $this->arquivo_ctl, 'w+' );
          fwrite( $fp, "LOAD DATA \r\n" );
          fwrite( $fp, "INFILE '$this->arquivo_csv' \r\n" );
          fwrite( $fp, "INTO TABLE {$this->tabela_oracle} \r\n" );
          fwrite( $fp, "FIELDS TERMINATED BY \"$this->separador\" OPTIONALLY ENCLOSED BY '$this->terminador' \r\n" );
          fwrite( $fp, "TRAILING NULLCOLS \r\n" );
          fwrite( $fp, "(       \r\n" );
          fwrite( $fp, $campos );
          fwrite( $fp, ")       \r\n" );
          fclose( $fp );
    }
   
    //CRIA O CSV DA TABELA
    public function criar_csv() {
        $fp = fopen( $this->arquivo_csv, 'w+' );
        $record_numbers = dbase_numrecords($this->dbf);
        for ($i = 1; $i <= $record_numbers; $i++) {
            $campos = array();
            $rec = dbase_get_record($this->dbf, $i);
            foreach ( $this->campos['POS'] as $e ) {
                $campos[] = $this->terminador.$rec[$e].$this->terminador;
            }
              $campos = implode( "$this->separador", $campos );
              fwrite( $fp, $campos."\r\n" );
        }
        fclose( $fp );
    }
   
    //CRIA O DDL DA TABELA
    public function criar_sql(){
          $campos = implode( ',', $this->campos['SQL'] );
        $fo = fopen( $this->arquivo_sql, 'w+' );
          fwrite( $fo, "DROP TABLE {$this->tabela_oracle}; \r\n" );
          fwrite( $fo, "CREATE TABLE {$this->tabela_oracle} ( \r\n " . $campos ."); \r\n" );
          fwrite( $fo, "EXIT; \r\n" );
          fclose( $fo );
    }

    //EXECUTA A DDL DA TABELA
    public function criar_tabela(){
        $comando = "sqlplus -S $this->user_db/$this->pass_db@$this->host_db:$this->port_db/$this->service @{$this->arquivo_sql}";
        exec( $comando );   
    }
   
    //EXECUTA A CARGA DE DADOS
    public function popular_tabela(){
        $comando = "sqlldr $this->user_db/$this->pass_db@$this->host_db:$this->port_db/$this->service control=$this->arquivo_ctl log=$this->arquivo_log";
        exec( $comando );   
    }
   
}
?>

quinta-feira, 17 de março de 2011

Exemplo de Trigger no Oracle

CREATE OR REPLACE
TRIGGER FDV_DETALHE_LIBERACAO
AFTER INSERT OR DELETE OR UPDATE ON RH_SALARIO
FOR EACH ROW
BEGIN
    IF UPDATING THEN
              INSERT INTO RH_AUDITORIA_SALARIO ( CPF, MOTIVO, DATA_ALTERACAO, USUARIO, VALOR_SALARIO ) VALUES ( :OLD.CPF, :OLD.MOTIVO, :OLD.DATA_ALTERACAO, :OLD.USUARIO, :OLD.VALOR_SALARIO );
    ELSIF DELETING THEN
        INSERT INTO RH_AUDITORIA_SALARIO ( CPF, MOTIVO, DATA_ALTERACAO, USUARIO, VALOR_SALARIO ) VALUES ( :OLD.CPF, :OLD.MOTIVO, :OLD.DATA_ALTERACAO, :OLD.USUARIO, :OLD.VALOR_SALARIO );
    ELSIF INSERTING THEN
        INSERT INTO RH_AUDITORIA_SALARIO ( CPF, MOTIVO, DATA_ALTERACAO, USUARIO, VALOR_SALARIO ) VALUES (:NEW.CPF, :NEW.MOTIVO, :NEW.DATA_ALTERACAO, :NEW.USUARIO, :NEW.VALOR_SALARIO );
    END IF;
END;

terça-feira, 27 de julho de 2010

Utilizando ADODB do PHP para inserir registros em campos do tipo CLOB no Oracle

Quando precisamos registrar em uma tabela do Oracle um campo que possua mais de 4000 caractéres, temos como opção o tipo CLOB, que é um dos "equivalentes" ao tipo TEXT do MySQL por exemplo. A única coisa que deve ser observada para utilizar esse tipo de formato de dado, é que o procedimento de inserir o registro na tabela é feito em duas etapas, sendo que na primeira etapa é realizado o insert com um valor nulo para o campo CLOB, e na segunda etapa é realizado o update do mesmo registro que acabou de ser inserido, só que desta vez deve ser passado o valor do campo CLOB.

Abaixo segue um exemplo utilizando os métodos Execute e UpdateClob da classe AdoDB para PHP.

1) DDL de criação da tabela que contém um campo CLOB:

CREATE TABLE XML_SERASA
(
"CNPJ" VARCHAR2(30 BYTE),
"DATA_SERASA" NUMBER(8,0),
"XML" CLOB
) ;

2) Código que implementa a inserção de um registro na tabela XML_SERASA.

$this->db->StartTrans();
$this->db->Execute("insert into XML_SERASA ( CNPJ, DATA_SERASA, XML ) values ( '$requisitado', '$data_cons', null)");
$sucesso = $this->db->UpdateClob('XML_SERASA', 'XML', $xml, "CNPJ = '$requisitado' AND DATA_SERASA = '$data_cons'");
$this->db->CompleteTrans();

quinta-feira, 1 de julho de 2010

Configurar o PHP para acessar o Oracle em servidor remoto

Habilitar o PHP para acessar o banco de dados Oracle em um servidor remoto não é algo complicado, porém não é tão simples como habilitar outras extensões como por exemplo mysql e postgresql. Isso porque além de editar o arquivo php.ini para ficar com a extensão oci8 (extensão que permite acesso ao Oracle), é necessário instalar um software client da Oracle, o chamado Oracle Instant Client. Outro detalhe é que para a versão 11g do Oracle, é recomendado habilitar a extensão oci8_11g ao invés da oci8.

No site da Oracle é possível garimpar algumas informações técnicas sobre o assunto.

Leitura recomendada:
http://wiki.oracle.com/page/PHP+Oracle+FAQ
http://www.oracle.com/technetwork/articles/technote-php-instant-084410.html
http://www.oracle.com/technology/pub/notes/technote_php_instant.html

segunda-feira, 3 de maio de 2010

Zend Debugger com Zend Optimizer no XAMPP

Depois de baixar o Zend Debugger, as instruções padrões do LEIAME não funcionarão - o PHP se recusa a carregar o Zend Debugger antes do Zend Optimizer.

Você precisa configurar o Zend Debugger usando o mesmo Zend Extension Manager, que o Zend Optimizer usa para se carregar.

Coloque o conteudo do ZendDebugger-5.2.x-cygwin_nt-i386.zip na pasta C:\xampp\php\zendOptimizer\lib.



então renomeie a pasta "ZendDebugger-5.2.x-cygwin_nt-i386? para "Debugger",



A seguir renomeie as pastas para 4_3_x_comp, 5_2_x_comp, etc. para php-4.3.x, php-5.2.x etc. ( procure no diretório ..\Optimizer para referência ). Cada dir …\lib\Debugger\php-X.X.x contêm ZendDebugger.dll.



A seguir edite a seção [Zend] em C:\xampp\php\php.ini (ou C:\xampp\apache\bin\php.ini – verifique seu phpinfo() para ver qual seu PHP está usando).




A opção crítica é "zend_extension_manager.debug_server_ts", que aponta para o diretório contendo os diretórios dll php-X.X.x debugger. Após a edição, o conteúdo da secão Zend no php.ini ficará como a seguir:


[Zend]
zend_extension_ts = "C:\xampp\php\zendOptimizer\lib\ZendExtensionManager.dll"
zend_extension_manager.verbose=On
zend_extension_manager.optimizer_ts = "C:\xampp\php\zendOptimizer\lib\Optimizer"
zend_optimizer.enable_loader = 0
zend_optimizer.optimization_level=15
;zend_optimizer.license_path =
zend_extension_manager.debug_server_ts = "C:\xampp\php\zendOptimizer\lib\Debugger"
zend_debugger.expose_remotely=allowed_hosts
zend_debugger.allow_hosts=127.0.0.1/24,192.168.0.0/16
zend_debugger.allow_tunnel=127.0.0.1/32

Em seguida reinicie o Apache, abra http://localhost/xampp/phpinfo.php e veja se o Zend Debugger está habilitado.

Veja na figura a seguir o processo de Debug no Zend Studio 5.1.



Boa sorte.

fonte original: http://tomasz.sterna.tv/2009/03/zend-debugger-with-zend-optimizer-on-xampp/

Tradução, Adaptação e Imagens por Genivan S. Souza

quarta-feira, 28 de abril de 2010

Problema quando o localhost do Windows XP não responde no ip 127.0.0.1

Para que o Windows XP entenda que o ip 127.0.0.1 responde pelo localhost, é necessário que o arquivo C:\WINDOWS\system32\drivers\etc\hosts tenha este formato:

# Copyright (c) 1993-1999 Microsoft Corp.
#
# Este é um arquivo HOSTS de exemplo usado pelo Microsoft TCP/IP para Windows.
#
# Este arquivo contém os mapeamentos de endereços IP para nomes de host. Cada
# entrada deve ser mantida em uma linha individual. O endereço IP deve
# ser colocado na primeira coluna, seguido do nome de host correspondente.
# O endereço IP e o nome do host devem ser separados por pelo menos um
# espaço.
#
# Adicionalmente, comentários (como estes) podem ser inseridos em linhas
# individuais ou após o nome de computador indicado por um símbolo '#'.
#
# Por exemplo:
#
# 102.54.94.97 rino.acme.com # servidor de origem
# 38.25.63.10 x.acme.com # host cliente x

127.0.0.1 localhost

domingo, 18 de abril de 2010

Script para fazer redução de espaço dos arquivos de dados e de log no SQL Server

/* o limite de redução é o da ocupação física dos arquivos */


DECLARE @bancodedados varchar(50)
DECLARE @arquivodata varchar(50)
DECLARE @arquivolog varchar(50)
DECLARE @tamanhoarquivolog int
DECLARE @tamanhoarquivodata int


SET @bancodedados = 'TreinaUniversus' -- entre com o nome da base de dados
SET @arquivodata = 'Universus_Data' -- entre com o nome LÓGICO do arquivo de dados
SET @arquivolog = 'Universus_Log' -- entre com o nome LÓGICO do arquivo de LOG
SET @tamanhoarquivodata = '1000' -- em MB
SET @tamanhoarquivolog = '1000' -- em MB


Use @bancodedados
dbcc shrinkfile(@arquivodata, @tamanhoarquivodata)
go


Use @bancodedados
go
dbcc shrinkfile(@arquivolog, @tamanhoarquivolog)
go