Re: Oracle + sfDoctrinePager

35 views
Skip to first unread message

Gabriel Vaz

unread,
Nov 6, 2009, 7:20:28 AM11/6/09
to symfo...@googlegroups.com

Mr. Regis,

 

Agora estou com problema de Paginação.

 

O Doctrine gera o SQL:

 

SELECT COUNT(*) AS num_results

FROM (SELECT DISTINCT e.cd_evento FROM evento e WHERE e.deleted = 0 GROUP BY e.cd_evento) AS dctrn_count_query

 

Porém, o ORACLE só executa essa query sem esse AS final (em destaque)

 

Vc teve esse problema, tbm? Como resolveu?

 

 

http://mail.ctis.com.br/pls/portal/docs/page/INTRANET/Assinaturas/it_serv_df.gif

Gabriel da Silva Vaz 
Analista de Sistemas
Diretoria Operacional de Service Desk e Contact Center
tel: (61) 3426-9468 cel: (61) 9226-5942
www.ctis.com.br ou www.lojactis.com.br

 

 

-----Mensagem original-----

De: symfo...@googlegroups.com [mailto:symfo...@googlegroups.com] Em nome de Mr. Regis

Enviada em: terça-feira, 27 de outubro de 2009 11:30

Para: symfony-pt

Assunto: Re: RES: [symfony-pt] Re: Oracle + doctrine

 

 

Olá a todos.

 

Uso aqui PHP com Oracle 11G na boa. Com Propel e Doctrine não tem

diferença para conexão pois ambos usam PDO.

 

Segue os principais problemas que enfrentei com Oracle + PHP + PDO

 

** Dificuldade de conexão ligado a falta de Listeners. É

imprescindível ter um Client Oracle instalado e perfeitamente

configurado. Não adianta só ter o driver, precisa ter o client que

pode ser o instant client. Ele vai criar variáveis de ambiente no S.O.

que vão apontar para o diretório de instalação do client e criar um

arquivo chamado TSNames.ora (normalmente em instalações Windows fica

em C:\Oracle\product\10.2.0\client_1\NETWORK\ADMIN).

 

** Alguns problemas de conexão são resolvidos modificando um pouco o

dns de conexão para algo como :

$dsn = "oci:dbname=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL

= TCP)(HOST = $hostname )(PORT = 1521)) ) (CONNECT_DATA =

(SERVICE_NAME = $service_name) ) );charset=WE8ISO8859P1";

 

// Para testar no PDO estas opções são importantes para uma série de

problemas, principalmente quando se trabalha com Stored Procedures

 

$options = array(PDO::ATTR_ORACLE_NULLS =>PDO::NULL_TO_STRING,

                                                                              PDO::ATTR_STRINGIFY_FETCHES=>TRUE,

                                                                              PDO::ATTR_AUTOCOMMIT=>FALSE,

                                                                              PDO::ATTR_CASE=>PDO::CASE_NATURAL);

$pdo = new PDO($dsn,$user,$pass,$options);

 

 

** Existem um bug (que ainda não sei se foi resolvido) quando da

utilização de PDO com Oracle e Stored Procedures que retornam um

Cursor. O PDO não suporta REF CURSOR e portanto não adianta usar O ORM

para este caso.

A solução que encontrei foi criar uma classe que extende PDOStatement

que usa internamete funções oci nativas do PHP mas a inclui ainda para

uso com Propel/Doctrine e por isso nem posso recomendar.

 

** Quando tudo está funcionando surgem os problemas da falta de

conhecimento de SQL ANSI. O MySQL possui alguns 'facilitadores' que no

momento de usar outro SGBD simplesmente dão erro. O uso de Group By é

o principal responsável.

 

EM MySQL isso funciona

SELECT a,b,c,d, COUNT(e) as qt

FROM tabela

GROUP BY a

 

Porém esta sintaxe está incorreta. O MySQL simplesmente 'adivinha'

quais registros virão em b,c e d.

Em SQL ANSI é obrigatório adicionar o campo quen NÃO possui agregação

na cláusula GROUP BY

 

Portanto o correto seria

SELECT a,b,c,d, COUNT(e) as qt

FROM tabela

GROUP BY a,b,c,d (Atenção, a ordem tem interferencia caso registros se

repitam)

 

 

On 26 out, 18:04, "Gabriel Vaz" <gabriel....@ctis.com.br> wrote:

> No meu caso acontece o oposto: consigo carregar mas não consigo criar a

> base.

> 

> Para conectar tive q fazer um gato no Adapter no Oracle.

> 

> Estou com problema no uso do Group by: ORA-00937: not a single-group group

> function

> 

> Monto a dql

> 

>                                $q = Doctrine_Query::create();

> 

>                                $q->select('a.*')

> 

>                                  ->addSelect('c.name camara')

> 

>                                  ->addSelect('COUNT(a.cd_acao)

> qt_total_acao')

> 

>                                  ->from("Acao a")

> 

>                                  ->leftJoin('a.Proposicao p')

> 

>                                  ->leftJoin('p.Camara c');

> 

>                                  if

> ($this->getRequestParameter('cd_camara')) { $q->andWhere('p.cd_camara = ?',

> $this->getRequestParameter('cd_camara') ); }

> 

>                                  if

> ($this->getRequestParameter('cd_usuario')){

> $q->andWhere('c.cd_usr_secretario = ?',

> $this->getRequestParameter('cd_usuario') ); }

> 

>                                  if ($this->getRequestParameter('dt_start'))

> { $q->andWhere('dt_limite_conclusao >= ?', $this->dt_start ); }

> 

>                                  if ($this->getRequestParameter('dt_end'))

> { $q->andWhere('dt_limite_conclusao <= ?', $this->dt_end ); }

> 

>                                  switch

> ($this->getRequestParameter('tp_agrupador')) {

> 

>                                                case 1:

> 

> $q->groupBy('c.cd_camara, c.name');

> 

>                                                                break;

> 

>                                                case 2:

> 

> $q->groupBy('c.cd_usr_secretario');

> 

>                                                                break;

> 

>                                  };         

> 

> Pelo que entendi da bíblia do Doctrine, preciso colocar o a.* para retornar

> mais de 1 registro;

> 

> Porém na qndo o Adapter monta o query ele coloca todos os campos de a. e não

> agrupa:

> 

> ORA-00937: not a single-group group function : SELECT a.cd_acao AS

> a__cd_acao, a.cd_proposicao AS a__cd_proposicao, a.name AS a__name,

> a.de_acao AS a__de_acao, a.dt_limite_conclusao AS a__dt_limite_conclusao,

> a.dt_conclusao AS a__dt_conclusao, a.deleted AS a__deleted, a.created_at AS

> a__created_at, a.updated_at AS a__updated_at, a.slug AS a__slug, c.name AS

> c__0, COUNT(a.cd_acao) AS a__1 FROM acao a LEFT JOIN proposicao p ON

> a.cd_proposicao = p.cd_proposicao LEFT JOIN camara c ON p.cd_camara =

> c.cd_camara

> 

> No desenvolvimento local com MySql funciona de boa, mas no Oracle... algum

> palpite?? Solução de contorno??

> 

> http://mail.ctis.com.br/pls/portal/docs/page/INTRANET/Assinaturas/it_...

> .gif

> 

> Gabriel da Silva Vaz

> Analista de Sistemas

> Diretoria Operacional de Service Desk e Contact Center

> tel: (61) 3426-9468 cel: (61) 9226-5942

>  <http://www.ctis.com.br>www.ctis.com.brou  <http://www.lojactis.com.br>www.lojactis.com.br

> 

> De: symfo...@googlegroups.com [mailto:symfo...@googlegroups.com] Em nome

> de Arian Maykon de Araújo Diógenes

> Enviada em: quinta-feira, 24 de setembro de 2009 10:13

> Para: symfo...@googlegroups.com

> Assunto: [symfony-pt] Re: Oracle + doctrine

> 

> Conectar também consigo, o problema é na hora de usar o data-load (fazer a

> carga de registros).

> Mas a conexão e create tables está funcionando corretamente.

> 

> 2009/9/24 Pedro Casado <pdr...@gmail.com>

> 

> Acho que a Andreia Bohner (andreiabohner.wordpress.com) usa Oracle +

> Symfony.

> 

> Eu ja conectei o sf 1.0 com Oracle e foi de boa..

> 

> Att,

> Pedro Casado

> 

> 2009/9/24 Arian Maykon (Dead_Thinker) <arian.may...@gmail.com>

> 

> Opa galera blz?

> 

> Estou apanhando pra kct pra fazer funcionar o Symfony 1.2.8 + Propel +

> Oracle ou usando Doctrine, isso seguindo o tutorial do Jobeet, para

> avaliação do framework e uma possível adoção.

> Com Doctrine consegui criar as tabelas, mas na hora de fazer o insert

> (doctrine:data-load) ele não grava, dá erro.

> Já com Propel ele nem chegava a criar as tabelas, mas depois de muito

> fuçar e tentar consegui fazê-lo criar as tabelas, mas o mesmo erro no

> data-load persiste.

> 

> Já pesquisei em vários sites, google, o escambau.

> 

> Se alguém puder me ajudar agradeço :)

> 

> Estou usando PHP 5.2.10 + Apache 2.2.13 e Windows XP com Oracle 10g

> (XE).

> 

> Obrigado.

> 

> --

> _________________________________________________

> Arian Maykon de Araújo Diógenes

> 

> Fortaleza - Ceará - Brasil

> Linux User #: 467310

> Blog:http://arianmaykon.blogspot.com/

> Contatos:http://meadiciona.com/dead_thinker

> 

> On 3 set, 23:57, Júlio César <juliomart...@gmail.com> wrote:

> 

> > Ola,

> 

> > Estou com problemas no server de producao para conectar ooracle

> > usando Doctrine com symfony1.2.

> 

> > O PHP esta compilado com suporte ao pdo_oci.

> 

> > No log a seguinte mensagem eh exibida:

> > {Doctrine_Connection_Exception} PDO Connection Error: SQLSTATE[HY000]:

> > pdo_oci_handle_factory: Error while trying to retrieve text for error

> > ORA-12514  (/usr/src/php5-5.2.6.dfsg.1/ext/pdo_oci/oci_driver.c:581)

> 

> > O arquivo databases.yml:

> > all:

> >   doctrine:

> >     class: sfDoctrineDatabase

> >     param:

> >       dsn: 'oci:host=172.xx.x.xxx;dbname=smartreport;charset=AL32UTF8'

> >       username: usuario

> >       password: senha

> 

> > Cheguei ate a checar esse

> 

> artigo:http://forum.symfony-project.org/index.php/m/6951/

> 

> 

> 

> > Onde uma pessoa esta com o mesmo problema e disse que resolveu

> > incluindo PUTENV com as variaveis ORACLE_SID e ORACLE_HOME no arquivo

> > config.php, mas no caso do Symfony1.2 esse arquivo nao existe. Alguem

> > sabe me dizer se nesse caso o correspondente em symfony 1.2 eh o

> > ProjectConfiguration.class.php?

> 

> > Eu tentei colocar mas nao funcionou:

> 

> > <?php

> 

> > require_once '/var/www/lib/symfony12/lib/autoload/

> > sfCoreAutoload.class.php';

> > sfCoreAutoload::register();

> 

> > class ProjectConfiguration extends sfProjectConfiguration

> > {

> >   public function setup()

> >   {

> >     // for compatibility / remove and enable only the plugins you want

> >     $this->enableAllPluginsExcept(array('sfPropelPlugin',

> > 'sfCompat10Plugin'));

> 

> >    PutEnv("ORACLE_SID=teste");

> >    PutEnv("ORACLE_HOME=/usr/local/instantclient/");

> >   }

> 

> > }

> 

> > Alguem ja passou por esse problema?? Alguma ideia de como posso

> > resolver?

> 

> > Obrigado pessoal, qq ajuda sera bem-vinda.

> 

> > []s;

> > Julio Cesar

> 

> --

> _________________________________________________

> Arian Maykon de Araújo Diógenes

> 

> Fortaleza - Ceará - Brasil

> Linux User #: 467310

> Blog:http://arianmaykon.blogspot.com/

> Contatos:http://meadiciona.com/dead_thinker

> 

>  image001.gif

> 26KExibirDownload

 

Mr. Regis

unread,
Nov 6, 2009, 11:23:55 AM11/6/09
to symfony-pt
Então Gabriel, eu ainda não usei Doctrine com Oracle, somente Propel e
não tive problemas.
Realmente não pode usar esse 'AS'.
Dando uma olhada no plugin do Doctrine encontrei onde um ponto de
montagem de query count em

symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine

linha 1859 (para Symfony 1.2.5)

Tente remover o AS pq ele é um item opcional na maioria dos SGBDs

On 6 nov, 10:20, "Gabriel Vaz" <gabriel....@ctis.com.br> wrote:
> Mr. Regis,
>
> Agora estou com problema de Paginação.
>
> O Doctrine gera o SQL:
>
> SELECT COUNT(*) AS num_results
>
> FROM (SELECT DISTINCT e.cd_evento FROM evento e WHERE e.deleted = 0 GROUP BY
> e.cd_evento) AS dctrn_count_query
>
> Porém, o ORACLE só executa essa query sem esse AS final (em destaque)
>
> Vc teve esse problema, tbm? Como resolveu?
>
> http://mail.ctis.com.br/pls/portal/docs/page/INTRANET/Assinaturas/it_...
> .gif
>
> Gabriel da Silva Vaz
> Analista de Sistemas
> Diretoria Operacional de Service Desk e Contact Center
> tel: (61) 3426-9468 cel: (61) 9226-5942www.ctis.com.brouwww.lojactis.com.br
>  image001.gif
> 26KExibirDownload

Gabriel Vaz

unread,
Nov 6, 2009, 2:02:11 PM11/6/09
to symfo...@googlegroups.com
Valeu!

Funcionou!
 

Gabriel da Silva Vaz 
Analista de Sistemas
Diretoria Operacional de Service Desk e Contact Center
tel: (61) 3426-9468 cel: (61) 9226-5942
www.ctis.com.br ou www.lojactis.com.br
 




-----Mensagem original-----
De: symfo...@googlegroups.com [mailto:symfo...@googlegroups.com] Em nome
de Mr. Regis
Enviada em: sexta-feira, 6 de novembro de 2009 14:24
Para: symfony-pt
Assunto: [symfony-pt] Re: Oracle + sfDoctrinePager

Mr. Regis

unread,
Nov 6, 2009, 3:12:37 PM11/6/09
to symfony-pt
Será que é o caso de reportar isso como um BUG ?

On 6 nov, 17:02, "Gabriel Vaz" <gabriel....@ctis.com.br> wrote:
> Valeu!
>
> Funcionou!
>  
>
> Gabriel da Silva Vaz 
> Analista de Sistemas
> Diretoria Operacional de Service Desk e Contact Center
> ...
>
> mais »

Gabriel Vaz

unread,
Nov 6, 2009, 3:34:21 PM11/6/09
to symfo...@googlegroups.com
Claro! Vc tem login no symfony-project??



-----Mensagem original-----
De: symfo...@googlegroups.com [mailto:symfo...@googlegroups.com] Em nome
de Mr. Regis
Enviada em: sexta-feira, 6 de novembro de 2009 18:13
Para: symfony-pt
Assunto: Re: RES: [symfony-pt] Re: Oracle + sfDoctrinePager
Reply all
Reply to author
Forward
0 new messages