Dificuldade em funcionar pelo PHP uma Procedure Oracle que retorna dados

281 views
Skip to first unread message

Eduardo Alexandre

unread,
Sep 15, 2010, 6:42:36 AM9/15/10
to php-b...@googlegroups.com
Olá pessoal,

Estou com o seguinte problema:
Preciso executar uma stored procedure no Oracle com passagem de 1 argumento e o retorno serão vários argumentos.
Está instalado no servidor o instantclient 10 (O bd é o Oracle 10g), Apache2, PHP5, PDO com oci.

Quando executava em Java, era a seguinte linha que comunicava:

// O primeiro argumento é o ID do funcionário e os demais argumentos são os retornos dos dados
CallableStatement cs = con.prepareCall("{call PROC_EXP_DADOS(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}");

Fiz o seguinte código em PHP que conectou corretamente:
//Nome de usuário do banco de dados.
$ora_user = "USUARIO"; 

//Senha do usuário no banco de dados.
$ora_senha = "SENHA"; 

//Definições do banco de dados.
$BD = "(DESCRIPTION = 
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = IP1-DO-SERVIDOR)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = P1-DO-SERVIDOR)(PORT = 1521))
      (LOAD_BALANCE = yes)
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = BD)
      (FAILOVER_MODE = 
        (TYPE = SELECT)
        (METHOD = BASIC)
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )"; 

// Conexão ao bd
if ($ora_conexao = OCILogon($ora_user,$ora_senha,$BD) ){
echo "Conexão bem sucedida. Usuário conectado: $ora_user"; 
}
else{
echo "Erro na conexão com o Oracle.";  
}

Mas não estou conseguindo trazer os dados do banco de dados.

Tentei o seguinte código para, após a conexão, trazer os dados dos funcionários:
// id do funcionário
$var1 = "30402"; 

$sql = "BEGIN PROC_EXP_DADOS($var1, :bind2, :bind3, :bind4, :bind5, :bind6, :bind7, :bind8, :bind9, :bind10, :bind11, :bind12, :bind13, :bind14, :bind15, :bind16, :bind17, :bind18, :bind19, :bind20, :bind21, :bind22, :bind23, :bind24, :bind25); END; ";

//INTERPRETA 
$sql = OCIParse($VEGA,$sql);

//EXECUTA 
OCIExecute($sql, OCI_DEFAULT);

//LOGOFF 
OCILogoff($VEGA); 

Mas obtive o seguinte erro:
Conexão bem sucedida. Usuário conectado: USUARIO
Warning: ociparse() expects parameter 1 to be resource, string given in C:\www\integraweb\index2.php on line 51
Warning: ociexecute() expects parameter 1 to be resource, null given in C:\www\integraweb\index2.php on line 54
Warning: ocilogoff() expects parameter 1 to be resource, string given in C:\www\integraweb\index2.php on line 58

Alguém poderia me sugerir como devo montar a comunicação com essa procedure pelo PHP?
Estou com interesse pois tenho pretensão de migrar o sistema de Java para PHP, porém essa procedure é um ponto crítico.

Quem puder colaborar, fico grato.

Abraços,

Eduardo

Rodrigo da Rosa Elesbão

unread,
Sep 15, 2010, 7:12:11 AM9/15/10
to php-b...@googlegroups.com
Opa amigo, eu nunca trabalhei com Oracle, mas interpretando o erro php que lhe retorna, tente fazer assim:

// Conexão ao bd
if ($ora_conexao = OCILogon($ora_user,$ora_senha,$BD) ){
echo "Conexão bem sucedida. Usuário conectado: $ora_user"; 
}
else{
echo "Erro na conexão com o Oracle.";  
}

Mas não estou conseguindo trazer os dados do banco de dados.

Tentei o seguinte código para, após a conexão, trazer os dados dos funcionários:
// id do funcionário
$var1 = "30402"; 

$sql = "BEGIN PROC_EXP_DADOS($var1, :bind2, :bind3, :bind4, :bind5, :bind6, :bind7, :bind8, :bind9, :bind10, :bind11, :bind12, :bind13, :bind14, :bind15, :bind16, :bind17, :bind18, :bind19, :bind20, :bind21, :bind22, :bind23, :bind24, :bind25); END; ";

//INTERPRETA 
$sql = OCIParse($ora_conexao,$sql);

//EXECUTA 
OCIExecute(($ora_conexao, $sql);

//LOGOFF 
OCILogoff($ora_conexao);


Segundo eu entendi o php espera o objeto de conexao (resource) como primeiro parametro, que no caso esta salvo na sua variavel $ora_conexao.

Espero ter ajudado. Abraços.



Eduardo Alexandre

unread,
Sep 15, 2010, 7:33:44 AM9/15/10
to php-b...@googlegroups.com
É... Parece que é por aí mesmo.
Alterei o código conforme sugerido e ficou com o seguinte erro:
Warning: ociexecute(): supplied resource is not a valid oci8 statement resource in C:\ wwww .... on line 54.

Pelo jeito só precisa agora resolver esse erro do ociexecute e saber como trazer os dados para variáveis do PHP.
Obrigado pela ajuda!
Tem ideia de como fazer essa associação dos dados ao PHP?

Abraços,
____________________
Eduardo Alexandre



--
Você está recebendo esta mensagem porque se inscreveu no grupo "php-brasil" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para php-b...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para php-brasil+...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/php-brasil?hl=pt-BR.

Thiago Rigo

unread,
Sep 15, 2010, 8:08:19 AM9/15/10
to php-b...@googlegroups.com
Fala ae.
Entao cara, nunca testei, mas ja me falaram que vc tem q passar as variaveis direto do php como parametro INOUT pro oracle.
Ai dessa forma ele execiuta e seta as vars pra vc.
Ao inves de bagin proc end, nao seria execute proc???

Flw

2010/9/15 Eduardo Alexandre <eduar...@gmail.com>



--
www.thiagorigo.com
Reply all
Reply to author
Forward
0 new messages