Problemas com to_date no oracle+php

224 views
Skip to first unread message

Digital 3i Soluções em Website

unread,
Jul 8, 2009, 9:13:50 AM7/8/09
to phpav...@googlegroups.com
Amigos, bom dia

estou com um problema aqui na empresa que nem o DBA Oracle conseguiu resolver.

Eu tenho uma procedure no oracle que atualiza uma sequência de campos. Esta procedure possui um campo data como parâmetro.

Quando eu executo esta procedure pelo OCIEXECUTE do PHP a mesma dá mensagem de erro, mas se eu pegar o script e rodar no sqlplus ou pl/sql ela executa normalmente. Gostaria de saber se alguém ja passou por este problema e se conseguiu resolver

grato.

--
André Luiz Pinheiro
Digital 3i Soluções em Websites
www.digital3i.com.br

Frederico Macedo

unread,
Jul 8, 2009, 9:23:11 AM7/8/09
to phpav...@googlegroups.com

Favor colocar os fontes...

2009/7/8 Digital 3i Soluções em Website <digi...@gmail.com>



--
Frederico Macedo de Assunção

Digital 3i Soluções em Website

unread,
Jul 8, 2009, 9:41:53 AM7/8/09
to phpav...@googlegroups.com
Segue

Cabeçalho da procedure
fdrj_inseri_adiantamento(id_usuario varchar2,
                                    v_data date,
                                    v_valor_total double,
                                    v_historico varchar2,
                                    v_centro_custo number);

begin
fdrj_inseri_adiantamento('F793',sysdate,100.00, 'NR',1);
end;

Está gerando o erro:
ORA-01843: not a valid month
ORA-06512: at line 2

2009/7/8 Frederico Macedo <fred....@gmail.com>

Frederico Macedo

unread,
Jul 8, 2009, 9:50:00 AM7/8/09
to phpav...@googlegroups.com
Esta procedure retorna uma row ou várias rows?

Digital 3i Soluções em Website

unread,
Jul 8, 2009, 9:53:01 AM7/8/09
to phpav...@googlegroups.com
null


2009/7/8 Frederico Macedo <fred....@gmail.com>

Digital 3i Soluções em Website

unread,
Jul 8, 2009, 9:53:51 AM7/8/09
to phpav...@googlegroups.com
Esta procedure apenas executa alguns inserts que são gigantescos e não retorna informação alguma.

Frederico Macedo

unread,
Jul 8, 2009, 10:01:38 AM7/8/09
to phpav...@googlegroups.com
vc vai ter q usar o bind:

exemplo:

$query = "begin
  fdrj_inseri_adiantamento(:id_usuario,:data,:historico,:centro_custo);
end;";

$data = date("d-M-Y H:i:s"); // ou $data = 'SYSDATE';

$historico = "asdasda";
$centrocusto = 20;
$id_usuario = 'FX123';

$stmt = OCIParse($conn,$query);
OCIBindByName($stmt,":id_usuario",$id_usuario);
OCIBindByName($stmt,":data",$data);
OCIBindByName($stmt,":historico",$historico);
OCIBindByName($stmt,":centro_custo",$centrocusto);
ociexecute($stmt);


Frederico Macedo

unread,
Jul 8, 2009, 10:05:46 AM7/8/09
to phpav...@googlegroups.com
Se não funcionar...adicione cursor...


$query = "begin
  fdrj_inseri_adiantamento(:id_usuario,:data,:historico,:centro_custo);end;";

$curs = OCINewCursor($conn);
$stmt = OCIParse($conn,$query);

$data = date("d-M-Y H:i:s"); // ou $data = 'SYSDATE';

$historico = "asdasda";
$centrocusto = 20;
$id_usuario = 'FX123';

$stmt = OCIParse($conn,$query);

OCIBindByName($stmt,":id_usuario",$id_usuario);
OCIBindByName($stmt,":data",$data);
OCIBindByName($stmt,":historico",$historico);
OCIBindByName($stmt,":centro_custo",$centrocusto);
ociexecute($stmt);

ociexecute($curs);

Digital 3i Soluções em Website

unread,
Jul 8, 2009, 10:29:37 AM7/8/09
to phpav...@googlegroups.com
Frederico, segue o novo erro:

$parse = ociparse($oracle, $sql);
   
    OCIBindByName($parse,":usuario",$this->id_unicoo);
    OCIBindByName($parse,":data",date('d/m/y'));
    OCIBindByName($parse,":valor",$this->vl_adiantamento);
    OCIBindByName($parse,":hist",$historico);
    OCIBindByName($parse,":centro_custo",$this->id_centro_custo);
   
   if (!ociexecute($parse,OCI_COMMIT_ON_SUCCESS)){
        echo var_dump(ocierror($parse));
    }

==========================
==========================

PARAMETER VALUE
NLS_LANGUAGE BRAZILIAN PORTUGUESE
NLS_TERRITORY BRAZIL
NLS_CURRENCY R$
NLS_ISO_CURRENCY BRAZIL
NLS_NUMERIC_CHARACTERS ,.
NLS_CHARACTERSET WE8ISO8859P1
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD/MM/RR
NLS_DATE_LANGUAGE BRAZILIAN PORTUGUESE
NLS_SORT WEST_EUROPEAN
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY Cr$
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 10.2.0.1.0
array(4) { ["code"]=> int(1843) ["message"]=> string(49) "ORA-01843: not a valid month ORA-06512: at line 2" ["offset"]=> int(0) ["sqltext"]=> string(91) "begin fdrj_inseri_adiantamento(:usuario,:data,:valor,:hist,:centro_custo); end;" } NULL

2009/7/8 Frederico Macedo <fred....@gmail.com>
$curs = OCINewCursor($conn);

Digital 3i Soluções em Website

unread,
Jul 8, 2009, 10:30:40 AM7/8/09
to phpav...@googlegroups.com
faltou $sql = "begin

      fdrj_inseri_adiantamento(:usuario,:data,:valor,:hist,:centro_custo);
      end;";

2009/7/8 Digital 3i Soluções em Website <digi...@gmail.com>
Frederico, segue o novo erro:

Frederico Macedo

unread,
Jul 8, 2009, 10:37:12 AM7/8/09
to phpav...@googlegroups.com
como vc esta tratando dentro da procedure?

usa to_date();
la dentro...


2009/7/8 Digital 3i Soluções em Website <digi...@gmail.com>:

Frederico Macedo

unread,
Jul 8, 2009, 10:38:35 AM7/8/09
to phpav...@googlegroups.com
tentou passar 'SYSDATE' pro bind?
>> OCIBindByName($parse,":data",'SYSDATE');
e se vc vai usar sysdate...pq nao jogar isso pra dentro da procedure?


2009/7/8 Frederico Macedo <fred....@gmail.com>:

Digital 3i Soluções em Website

unread,
Jul 8, 2009, 10:47:52 AM7/8/09
to phpav...@googlegroups.com
mas voce concorda que sysdate é a mesma data em qualquer sistema de coordenadas, isto é, em qualquer nls_date_format ou nls_language?

mas no mais. obrigado por toda a ajuda....

2009/7/8 Frederico Macedo <fred....@gmail.com>

Frederico Macedo

unread,
Jul 8, 2009, 11:06:22 AM7/8/09
to phpav...@googlegroups.com
Nao concordo, pq vc usa o date do php.... so sera a mesma data se o
oracle estiver no mesmo servidor que o php...
o ideal eh vc trabalhar so com a data do banco ao inves de trabalhar
com a data do servidor php... e a data do php... eh string nao eh um
tipo data pro pro oracle, logo ou vc converte a data toda vez q for
trabalhar no oracle usando to_date, ou vc usa as datas do banco...

Frederico Macedo

unread,
Jul 8, 2009, 11:08:26 AM7/8/09
to phpav...@googlegroups.com
Se nem o dba da sua empresa resolveu esse problema...esta na hora de
troca-lo.... Risos....

Digital 3i Soluções em Website

unread,
Jul 8, 2009, 11:10:50 AM7/8/09
to phpav...@googlegroups.com
Entendi, tem razão.

eu vou dar uma olhada na procedure porque eu acho que deve ter alguma conversão de data dentro da procedure, mas como não fui eu quem fiz tenho que analisar com calma.

no mais,  muito obrigado por toda ajuda...

2009/7/8 Frederico Macedo <fred....@gmail.com>


Se nem o dba da sua empresa resolveu esse problema...esta na hora de
troca-lo.... Risos....


mario almeida

unread,
Jul 8, 2009, 10:50:21 AM7/8/09
to phpav...@googlegroups.com
JÁ passei por este tipo de problemas, desenvolvi toda minha aplicação
em um servidor apache no win mas o servidor de produção era em linux e
começou a dar pau nas datas e resolvi da seguinte maneira "alter
session set nls_date_format='dd/mm/yyyy'" isso e feito na ora da
conexao com o banco.
--
Mário Sampaio de Almeida - MSA_Desenvolvimento

mario almeida

unread,
Jul 8, 2009, 10:10:54 AM7/8/09
to phpav...@googlegroups.com
JÁ passei por este tipo de problemas, desenvolvi toda minha aplicação
em um servidor apache no win mas o servidor de produção era em linux e
começou a dar pau nas datas e resolvi da seguinte maneira "alter
session set nls_date_format='dd/mm/yyyy'" isso e feito na ora da
conexao com o banco.

2009/7/8 Frederico Macedo <fred....@gmail.com>:

phpeia

unread,
Jul 8, 2009, 10:56:16 AM7/8/09
to PHP Avançado

Vc pegou as informações que o mario almeida passouo pra vc ?


On 8 jul, 09:13, Digital 3i Soluções em Website <digita...@gmail.com>
wrote:

Mário Almeida

unread,
Jul 8, 2009, 9:55:55 AM7/8/09
to PHP Avançado
Primeiramente Bom dia, Gostaria se saber em que servidor você está
rodando o php em servidor Linux ou Windows já passei por esse
problema mas preciso saber em que tipo de servidor vc esta rodando a
aplicação, para te retornar a solução.

On 8 jul, 09:41, Digital 3i Soluções em Website <digita...@gmail.com>
wrote:
> Segue
>
> Cabeçalho da procedure
> fdrj_inseri_adiantamento(id_usuario varchar2,
>                                     v_data date,
>                                     v_valor_total double,
>                                     v_historico varchar2,
>                                     v_centro_custo number);
>
> begin
> fdrj_inseri_adiantamento('F793',sysdate,100.00, 'NR',1);
> end;
>
> Está gerando o erro:
> ORA-01843: not a valid month
> ORA-06512: at line 2
>
> 2009/7/8 Frederico Macedo <fred.mac...@gmail.com>
>
>
>
>
>
>
>
> > Favor colocar os fontes...
>
> > 2009/7/8 Digital 3i Soluções em Website <digita...@gmail.com>

Digital 3i Soluções em Website

unread,
Jul 8, 2009, 12:46:59 PM7/8/09
to phpav...@googlegroups.com
são dois servidores linux: um aonde roda o php e outro o oracle.

Eu ainda não tive tempo de fazer as alterações que voces sugeriram. Assim que as fizer posto o resultado.

Obrigado.

Digital 3i Soluções em Website

unread,
Jul 8, 2009, 2:55:31 PM7/8/09
to phpav...@googlegroups.com
Pessoal, muito obrigado pela ajuda de todos, mas "o crime não estava no morto, mas na cor de sua epiderme".

O Corno (só falando deste jeito em respeito as meninas presente) do cara que desenvolveu a procedure me dá um TO_CHAR para preencher um campo data, por isso do erro de data. Só matando um cara destes não acham????

Com relação a opnião de um dos amigos, a data não pode ser cravada no sistema como a data atual pois o adiantamento pode ser computado na data atual ou em uma data posterior.

Obrigado a todos pela ajuda.


--
André Luiz Pinheiro
Digital 3i Soluções em Websites
www.digital3i.com.br

2009/7/8 Digital 3i Soluções em Website <digi...@gmail.com>
Reply all
Reply to author
Forward
0 new messages