Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sam.surf

Probremas com procedures Oracle no PHP

Recommended Posts

Bom é o seguinte ...tenho uma aplicação em php que utiliza uma procedure oracle, so que essa procedure me retorna dados , mais nao consigo capturar pelo php jogo uma variavel para receber a resposta e nao vem , da erro, segue abaixo a procedure:

 

$sql="Begin prc_ALTERA_SITUACAO('$_SESSION[cod_curso]',

'$_SESSION[cod_periodo]',

'$vl_media_f',

'$_SESSION[qtd_horas]',

'$_SESSION[val_aprovacao]',

'$_SESSION[val_aprov_exame]',

nvl($qtd_faltas,0) ,

null,

$_SESSION[tpo_avaliacao1],

'$ind_confirma_b1',

'$ind_confirma_b2',

null,

'$dat_fim', <==== RECEBO DADOS

'$sta_conceito_final', <==== RECEBO DADOS

'$ind_aprovacao', <==== RECEBO DADOS

'$v_erro'); end;"; <==== RECEBO DADOS

 

$exec_sql = ora_open($conn);

ora_parse($exec_sql, $sql);

ora_exec($exec_sql);

 

Abaixo a msg de erro que dá ...

 

Warning: Ora_Parse failed (ORA-06550: line 1, column 33: PLS-00103: Encountered the symbol "" when expecting one of the following: ( - + mod not null others avg count current exists max min prior sql stddev sum variance cast -- while processing OCI function OPARSE) in c:\arquivos de programas\apache group\apache\htdocs\webw9010ok.php on line 149

 

Aguardo ajuda ....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha só, eu uso um esquema meio diferente para passar e receber parametros para procedures:

 

PHP [/tr][tr]

function insCidade($insEstado, $insCidade)

{

$db_conn = ocilogon($_SESSION['lg'], $_SESSION['pw'], $_SESSION['db']);

$s = OCIParse($db_conn, "BEGIN DOAR.SP_CIDADE_INSERE(:insEstado, :insCidade, :erro); END;");

OCIBindByName($s, ":insEstado", $insEstado);

OCIBindByName($s, ":insCidade", $insCidade);

OCIBindByName($s, ":erro", $erro, 7); // 7 é o tamanho do retorno

 

$r = OCIExecute($s, OCI_DEFAULT);

 

$val = ($erro != 0) ? $erro : 0 ;

 

return $val;

 

ocilogoff($db_conn);

}

[/tr]

 

Ou seja, passo $insEstado e $insCidade para a procedure e recebo $erro como retorno da procedure. Em caso de erro vem o número do erro, se não, vem 0 indicando q não há erros. Entendeu?

 

Outra coisa, vi você usando $_SESSION[cod_periodo]. Está certo isso? Não seria $_SESSION['cod_periodo'] ?

 

 

[]s,

Cassão

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função ora_bind seria referente ao ocibindbyname ???????

ora_bind: Essa função passa variáveis nomeadas do PHP com um parâmetro SQL. O parâmetro SQL deve ser no formato ":name". Com o parâmetro type opcional, você pode definir se o parâmetro SQL são in/out (0, default), in (1) ou out (2).

 

http://br.php.net/manual/pt_BR/function.ora-bind.php

 

ocibindbyname: Passa uma variável PHP variable para um ambiente de armazenamento no Oracle ph_name. Se isso for usado para entrada ou saída de dados irá ser determinado "run-time", e o espaço necessário para armazenagem será alocado. O parâmetro length seta o comprimento máximo para passar. Se você setar length como -1 ocibindbyname() irá usar o comprimento atual da variable para setar o comprimento máximo.

 

http://br.php.net/manual/pt_BR/function.ocibindbyname.php

 

A ocibindbyname seria, digamos, um avanço da ora_bind.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra coisa qual a diferença entre se usar os ORAs e os OCIs ambos nao sao voltatdo para ORACLE ??????

Copiando do site php.net:

 

Sobre OCI8:

 

Essas funções permitem que você acesse Banco de Dados Oracle8 and Oracle7. Elas usam uma interface de comunicação para Oracle8 chamada (OCI8)

 

Essa extensão é mais flexível do que a extensão standard Oracle. Ela tem suporte para passar variáveis PHP locais e globais para o "Oracle placeholders", tem suporte completo à LOB, FILE e ROWID e permite que você use variáveis definidas pelo usuário.

 

Poderíamos dizer que é uma biblioteca para Oracle melhorada.

 

E funciona que é uma beleza. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teu code ficaria mais ou menos assim(fiz rápido, não verifiquei se existem erros):

 

PHP [/tr][tr]$sql = OCIParse($db_conn, "BEGIN prc_ALTERA_SITUACAO(:cod_curso, :cod_periodo, :vl_media_f, :qtd_horas, :val_aprovacao, :val_aprov_exame, :qtd_faltas, :var_null, :tpo_avaliacao1, :ind_confirma_b1, :ind_confirma_b2, :var_null2, :dat_fim, :sta_conceito_final, :ind_aprovacao, :v_erro); END;");

 

OCIBindByName($sql, ":cod_curso", $_SESSION['cod_curso']);

OCIBindByName($sql, ":cod_periodo", $_SESSION['cod_periodo']);

OCIBindByName($sql, ":vl_media_f", $vl_media_f);

OCIBindByName($sql, ":qtd_horas", $_SESSION['qtd_horas']);

OCIBindByName($sql, ":val_aprovacao", $_SESSION['val_aprovacao']);

OCIBindByName($sql, ":val_aprov_exame", $_SESSION['val_aprov_exame']);

OCIBindByName($sql, ":qtd_faltas", nvl($qtd_faltas,0));

OCIBindByName($sql, ":var_null", $null);

OCIBindByName($sql, ":tpo_avaliacao1", $_SESSION['tpo_avaliacao1']);

OCIBindByName($sql, ":ind_confirma_b1", $ind_confirma_b1);

OCIBindByName($sql, ":ind_confirma_b2", $ind_confirma_b2);

OCIBindByName($sql, ":var_null2", $null);

OCIBindByName($sql, ":dat_fim", $dat_fim);

OCIBindByName($sql, ":sta_conceito_final", $sta_conceito_final);

OCIBindByName($sql, ":ind_aprovacao", $ind_aprovacao);

OCIBindByName($sql, ":v_erro", $v_erro, 7);

 

$r = OCIExecute($sql, OCI_DEFAULT);

[/tr]

 

[]s,

Cassão

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara ja consegui fazer usando ORA .... valeu mesmo ... o estranho é que na documentação o OCI diz ser para Oracle 7 e 8 aqui usamos 9 e 10G sem problemas .... o codigo ficou assim :

 

$sql="declare dat_fim date; sta_conceito_final varchar2(2); ind_aprovacao varchar2(2); v_erro  varchar2(2); begin prc_ALTERA_SITUACAO('$_SESSION[cod_curso]',$_SESSION[cod_periodo],replace('$vl_media_f','.',','),$_SESSION[qtd_horas],$_SESSION[val_aprovacao],$_SESSION[val_aprov_exame],nvl($qtd_faltas,0),null,$_SESSION[tpo_avaliacao1],'$ind_confirma_b1','$ind_confirma_b2',null,dat_fim,sta_conceito_final,ind_aprovacao,v_erro); :dat_fim := dat_fim; :sta_conceito_final := sta_conceito_final; :ind_aprovacao := ind_aprovacao; :v_erro := v_erro; end;";

$exec_sql = ora_open($conn);

ora_parse($exec_sql, $sql, 0) or die('<center>Problemas com o Select Oracle !</center>');

$r1=ora_bind($exec_sql,"dat_fim",":dat_fim",10,0);

$dat_fim = NULL;

$r2=ora_bind($exec_sql,"sta_conceito_final",":sta_conceito_final",2,0);

$sta_conceito_final = NULL;

$r3=ora_bind($exec_sql,"ind_aprovacao",":ind_aprovacao",2,0);

$ind_aprovacao = NULL;

$r4=ora_bind($exec_sql,"v_erro",":v_erro",2,0);

$v_erro = NULL;

ora_exec($exec_sql);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza cara, o importante é que tá funcionando.Mas não deixe de dar uma olhada na OCI, pode ser que precise de algo mais.O pessoal do PHP recomenda usar a OCI no lugar da ORA.[]s,Cassão

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal,

 

Tenho uma dúvida em relação a esse tópico. Nesse exemplo que foi postado pelo cassão:

 

function insCidade($insEstado, $insCidade){$db_conn = ocilogon($_SESSION['lg'], $_SESSION['pw'], $_SESSION['db']);$s = OCIParse($db_conn, "BEGIN DOAR.SP_CIDADE_INSERE(:insEstado, :insCidade, :erro); END;");OCIBindByName($s, ":insEstado", $insEstado);OCIBindByName($s, ":insCidade", $insCidade);OCIBindByName($s, ":erro", $erro, 7); // 7 é o tamanho do retorno$r = OCIExecute($s, OCI_DEFAULT);$val = ($erro != 0) ? $erro : 0;return $val;ocilogoff($db_conn);}

Posso usá-lo como inserção de dados no banco???

Não sei se entendi bem, mas estava tentando fazer em cima desse modelo um meio para inserção. Veja o que eu fiz:

 

<?php//procedure de inseção:$conn = OCILogon("usuario","senha","desenv");$curs = OCINewCursor($conn);$stmt = OCIParse($conn,"begin sipesca.pescasp012_inclui_proprietario(:p_nu_proprietario,nome_propi,endereco,CD_MUNICIPIO,null,null,tel,ddd,observacao); end;");OCIBindByName($stmt,":p_nu_proprietario",$nu_proprietario);OCIExecute($stmt,OCI_DEFAULT);while(OCIFetchInto($curs,$data,OCI_RETURN_NULLS|OCI_ASSOC)){...}OCIFreeStatement($stmt);//OCIFreeCursor($curs);OCILogoff($conn);

Ta correto?

Se voces puderem me orientar agradeço muito!!!

 

Abraços,

Flávia

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.