Bogos

setembro 16, 2008

PHP X Oracle

Filed under: PHP, SQL — Tags:, , , , , — Bogos @ 12:46 am
Bom, depois de ter começado a trabalhar com o Oracle, vi que é realmente fantástico, suas ferramentas, capacidade, simplicidade, velocidade, enfim, um banco incrível, posso dizer que eu particularmente achei que ele deixa o SQL Server quase que no chinelo.
Bom, agora vamos fazer a união, PHP e Oracle!
Pra quem usa linix, prepare-se já pra botar a mão na massa forte, instalar Oracle em linux não é uma tarefa muito agradável, mas também não é impossível.

Bom, primeiramente, vamos listar as bibliotecas disponíveis:

Ora X OCI

OCI – A mais completa, permite acessar Oracle 9 e 7. Usa o Oracle 8 ‘Call-Interface’ (pode ser usada em versões mais novas além do 8).
Essa extensão é mais flexível do que a extensão padrão Oracle (Ora).
O mais importante dela é que ela suporta alocar as variáveis globais e locais do PHP para o Oracle.
LOB, FILE e ROWID permitem que você use variáveis definidaspelo usuário.
Para utilizar essa biblioteca é necessário:

Em ambiente Windows, habilite no php.ini a dll: php_oci8.dll

Em ambiente linix, há a necessidade de compilar com –with-oci8=[ PASTA_DO_ORACLE] (notável a diferença entre Windows e linux não? santo contole do linux, santo notepad do Windows kKk)

Ora – Essa extensão adiciona o suporte ao Oracle Database Server. Para ativá-la para seu uso, você deve, no linux, compilar o PHP com –with-oracle[=PAST_DO_ORACLE]

Agora as tão esperadas e importantes funções da biblioteca OCI8:

OCIBindByName = passa variáveis ho PHP para o Oracle
OCICancel = cancela a leitura de um cursor (depois de um SELECT)
OCIColumnIsNull = verifica se um resultado da coluna é NULL
OCIColumnName = retorna o número de colunas (isso mesmo, o número!)
OCIColumnSize = retorna o resultado do tamanho de uma coluna
OCIColumnType = retorna o tipo de dados de uma coluna
OCIColumnTypeRAW = retorna o RAW de uma coluna RAW Type
OCICommit = necessário explicar? executa o commit após um bloco SQL não-SELECT
OCIDefineByName = permite usar as variáveis do PHP (lembra-se do OCIBindByName?) durante um SELECT
OCIError = retorna o último erro stmt|conn|global
OCIExecute = executa um ‘bloco de comando’
OCIFetch = precisa explicar também? coloca os dados de um SELECT em um “result-buffer”
OCIFetchInto = coloca os dados de um SELECT em um “result-array”
OCIFetchStatement = coloca os resultados de um SELECT em uma variável array
OCIFreeCursor = torna o cursor livre de qualquer recurso associado ao mesmo
OCIFreeDesc = deleta um descritor de objeto muito grande
OCIFreeStatement = libera os recursos associados á um bloco de comando
OCIInternalDebug = liga/delisga a saída de debug interna
OCILogoff = …! desconecta do Oracle
OCILogon = putz… Conecta com o Oracle
OCINewCollection = retorna uma nova coleção de dados
OCINewCursor = retorna um novo cursor (Statement-Handle)
OCINewDescriptor = inicializa um LOB ou FILE vazio
OCInLogon = abre uma conexão com o Oracle
OCINumCols = aiai… retorna o número de colunas de um resultado SELECT
OCIParse = verifica a integridade de uma query
OCIpLogon = abre uma conexão persistente com o Oracle
OCIResult = retorna os valores das linhas requisitadas
OCIRollBack = grr… executa um rollback
OCIRowCount = retorna a quantidade de registros retornados em um SELECT
OCISetPreFetch = seta o número de linhas que serão afetadas
OCIStatementType = retorna um tipo de bloco de comando

Essas ainda não são todas as funções, porém as que restam ainda não foram documentadas.

Mão na massa!

Vamos dar um exemplo de conexão. Para isso é necessário o uso de um login e senha válidos usando a função OCILogon(); O Oracle vem com alguns logins e senhas padrões, um deles é Login: scott – Senha: tiger

Exemplo prático:

Código:
<?php
/* passa a variável do ORACLE_HOME */
putenv(“ORACLE_HOME=/path/pro/diretorio/do/oracle”);

/* passa a variável do Oracle_SID */
putenv(“ORACLE_SID=NOME_DO_BANCO”); //nome do banco

$login = “scott”;
$pwd = “tiger”;

/* Configuração do Oracle */
$bd = “(DESCRIPTION=
          (ADDRESS_LIST=
            (ADDRESS=(PROTOCOL=TCP)
              (HOST=ENDEREÇO_DO_HOST_DO_BANCO)(PORT=1521) //endereço do host
            )
          )
          (CONNECT_DATA=(SERVICE_NAME=NOME_DO_BANCO)) //nome do banco
       )”;

if ($conexao = OCILogon($login,$pwd,$bd) )
   echo “Conexão efetuada com sucesso!”;
else
   echo “Não foi possível conectar ao Oracle.”;
?>

Este é um exemplo prático que criei de uma conexão com o Oracle via PHP. Há inúmeras maneiras de faze-la, esta é uma delas. Abaixo alguns erros eventuais:

– as linhas que setam as variáveis de ambiente ORACLE_HOME e ORACLE_SID são para evitar surpresas, sem elas provavelmente vá apontar um erro de conexão;

– a variável $bd pode ser deixada em branco caso esteja acessando de uma máquina local $bd = “”;

– a linha da variável $conexao inclui um IF para validar ou nao a expressao da função OCILogon que tenta conectar com o Oracle, retornando sucesso ou erro.

Para executar uma query, o bloco abaixo da conta do recado porém…

Código:
<?php
$sql = OCIParse(“UPDATE clientes SET nome=’José’ WHERE nome=’João'”); //query
OCIExecute($sql, OCI_COMMIT_ON_SUCCESS); //executa a query
OCICommit($conectar); // comita
?>

com essa função, há certas validações que passam em branco e são importantes.
Agora uma função que desenvolvi para executar um comando SQL com algumas validações:

Código:
<?php
function bQuery($query)
{
    /* pega os 6 primeiros caracteres da string ou o verbo do comando SQL */
    $vl_cmd = substr($query,0,6);
   
   switch(strtolower($vl_cmd)); //transforma os 6 caracteres em minúsculas
        case “select”: $sql = OCIExecute(OCIParse($query));
        break;

        /* se for SELECT executa
           se nao for SELECT executa o bloco com uma
           constante da função OCIExecute.. e dá um commit */

        default: $sql = OCIExecute(OCIParse($query, OCI_COMMIT_ON_SUCCESS)); OCICommit($conexao);
 
    endswitch;
   
   return $sql; // retorna $sql
}
?>

O básico é isso, o resto é fazendo como eu, fuçando. Algumas coisas que eu descobri fuçando foram:

Citação:
Alguns pontos relevantes pra quem está saindo de um MySQL da vida e fuçando num Oracle.

– É interessante o uso da função OCIParse(); para verificar integridade de comandos SQL.

– O OCIExecute() executa “efetivamente” um “bloco de comando”, ou uma instrução SQL.

– Para validar ou desfazer as possíveis caquinhas usamos OCIRollback e OCICommit (valida tudo) ou seja, se está usando o commit valida todos os comandos SQL passados após o último que foi dado.

Importante: se você tem uma ordem de comandos assim:

UPDATE, DELETE, SELECT.. e sem commit e depois você dá um CREATE TABLE, é feito um Commit que valida o UPDATE e o DELETE anteriores.. então, um OCIRollBack conhecido como anti-caquinha neste caso não vai funcionar porque você deu um CREATE TABLE que tem “embutido” um Commit.

– O OCI não tem função que retorna a quantidade de colunas de um select (isso é mal)

– Há diferenças de uso na função OCIExecute para UPDATE, SELECT, INSERT e DELETE.

– Há duas constantes importantes no OCIExecute são elas: OCI_COMMIT_ON_SUCCESS e OCI_DEFAULT a última é usado por padrão como o nome sugere, e se não especificar um OCI_COMMIT_ON_SUCCESS não poderá ser usado um OCICommit.

– O caractere de concatenação no Oracle é o ||

É isso ae! Abraços!!

Anúncios

5 Comentários »

  1. Legal a i´deia de vcs pra ajudar em relação a phpo e oracle, gostaria de saber se vcs podem me ajudar, não entendo muito desse assunto e estopu com uma tarefa pra tentar fazer aqui na empresa, e espero que vcs possam me ajudar. Tenho servidor windows 2003 server, onde nele ta instalado o Vertrigo (apache) e o Oracle 10g, criei o banco de dados e populei as tabelas, colcoquei as páginas no apache no diretorio www e esta ok, nas estações digito o ip e aparece a index. So que preciso acertar agora a conexão, alterei o ora_conecta.php da seguinte forma :

    o que pode estar errado ?

    Obrigado

    Comentário por Carlos — setembro 30, 2008 @ 12:23 pm

  2. Comentário por Carlos — setembro 30, 2008 @ 12:23 pm

  3. Bom dia amigo! Olha o código que você enviou não apareceu no comentário, mas tudo bem, vejamos no que posos lhe ajudar.
    Dá algum erro? Se sim, qual?
    Você instalou o client do oracle? Sem ele é impossível realizar qualquer conexão com o banco. Abraços!

    Comentário por Bogos — setembro 30, 2008 @ 12:28 pm

  4. Bom dia Amigos,
    Já fiz a liberação do php_oci8.dll, estou utilizando windons 8, com wampserver, mesmo depois de fazer as configurações para tirar o “;” no php.ini a função oci_ não é reconhecida, o que pode ser?
    (O bando não está na minha máquina, está em outro ambiente, mas já verifiquei e tenho acesso ao mesmo).
    A minha dúvida seria: eu tenho que instalar o oracle client para fazer essa integração na máquina onde está sendo rodada a aplicação (no caso no meu computador win 8)?

    Comentário por milrak — agosto 29, 2014 @ 3:25 pm

  5. Muito legal seu artigo, ja mexo a um bom tempo com mysql, mas agora tenho que ler uma view em um banco de dados oracle remoto e não estou conseguindo fazer em php.
    A view esta ok porque consegui ver com o ORACLE SQL developer. Estou usando Linux.

    quando tento qualquer exemplo ele para na seguinte linha :

    $conexao = oci_connect(‘xuxu’, ‘pera’, ‘x.x.x.x/multimed’);

    ja preenchi com as informações correta e nada.

    O servidor é remoto e tenho apenas permissão de leitura.

    dados adcionais que me passaram :

    Usuário: xuxu
    Senha: pera
    View: DBA_EQUIPAMENTOS

    String de Conexão:

    MULTIMED =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = x.x.x.x)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = multimed)
    )
    )

    Obrigado .

    Comentário por Antonio Cesario — agosto 25, 2017 @ 12:59 pm


RSS feed for comments on this post. TrackBack URI

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Blog no WordPress.com.

%d blogueiros gostam disto: