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?
|
|
Gabriel da Silva Vaz |
-----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