Como instalar o PhpUnit 3.4 no ubuntu.# apt-get install php5 php5-dev# pecl install xdebug# pear channel-discover pear.phpunit.de# pear install --alldeps phpunit/PHPUnit Resumo,Quando voce tentar apontar o Zend_Db_Table_Abstract do Zend Framework com o Oracle, para gerar comandos SQL e possivel que voce enfrente o mesmo problema que nos enfrentamos, aspas duplas aparecem e fazem seus comandos SQL invalidos. Para resolver isso adicione a seguinte linha:resources.db.params.options.autoQuoteIdentifiers = 0no seu application.ini e seja feliz.Versao Longa,Quando o Zend_Db_Table_Abstract gera erros ao tentar executar seus comandos SQL triviais, gerados automaticamente, qual e o 1o passo? Eu costumo gerar o assemble() do comando SQL para poder testa-lo diretamente no banco de dados. Como o problema que temos e com qualquer metodo, entao testamos no mais simples, sobrescrevendo o getAll e fazendo isso: public function getAll($where = null, $order = null, $count = null, $offset = null) { var_export( $this->select()->assemble() ); exit(); }Entao obtemos:SELECT "tb_estado".* FROM "db_projeto"."tb_estado"Sabemos agora qual e o problema: As consultas geradas automaticamente pelo Zend estao colocando aspas duplas no nome das tabelas e do schema, o que nao e aceito no Oracle.Apos pesquisar um pouco achei esse link http://doczf.mikaelkael.fr/1.10/pt-br/zend.db.select.html que informa:O metodo quoteIdentifier() usa aspas no SQL para delimitar o identificador, o que deixa claro que ele e um identificador de uma tabela ou coluna e nao parte da sintaxe SQL.Agora qual e o problema: As consultas geradas automaticamente pelo Zend estao colocando aspas duplas no nomes devido ao metodo _quoteIdentifier, que funciona do seguinte modo:http://www.tig12.net/downloads/apidocs/zf/Db/Adapter/Abstract.php.source.html#line10161009 /**1010 * Quote an identifier.1011 *1012 * @param string $value The identifier or expression.1013 * @param boolean $auto If true, heed the AUTO_QUOTE_IDENTIFIERS config option.1014 * @return string The quoted identifier and alias.1015 */1016 protected function _quoteIdentifier($value, $auto=false)1017 {1018 if ($auto === false || $this->_autoQuoteIdentifiers === true) {1019 $q = $this->getQuoteIdentifierSymbol();1020 return ($q . str_replace("$q", "$q$q", $value) . $q);1021 }1022 return $value;1023 } O nosso problema agora tem um foco bem mais especifico. Como fazer o atributo protegido _autoQuoteIdentifiers ser falso. Logicamente se o atributo fosse publico ou ao menos tivesse um setAutoQuoteIndentifiers ou algo similar, estaria agora resolvido o problema, na nossa classe pai que herda o Zend_Db_Table_Abstract, algo muito parecido com: public function init() { $this->_db->setAutoQuoteIndentifiers( false ); }Mas, para nossa tristeza e agonia esse metodo setter nao existe. Entao precisamos descobrir como esse atributo recebe um valor.Fazendo uma busca na classe, vemos que esse atributo pode ter seu valor atribuido caso ele venha no Array que e recebido no metodo construtor da classe http://www.tig12.net/downloads/apidocs/zf/Db/Adapter/Abstract.php.source.html#line240238 239 // obtain quoting property if there is one240 if (array_key_exists(Zend_Db::AUTO_QUOTE_IDENTIFIERS, $options)) {241 $this->_autoQuoteIdentifiers = (bool) $options[Zend_Db::AUTO_QUOTE_IDENTIFIERS];242 }243 Tentando entender como essa variavel $options e montada, vemos que essa variavel e um Array que e inicializado com os valores padroes:185 $options = array(186 Zend_Db::CASE_FOLDING => $this->_caseFolding,187 Zend_Db::AUTO_QUOTE_IDENTIFIERS => $this->_autoQuoteIdentifiers188 );Mas que tem esses valores alterados conforme os elementos que sao recebidos no campo "options" do $config. Sendo $config o Array que e recebido no construtor.190 191 /*192 * normalize the config and merge it with the defaults193 */194 if (array_key_exists('options', $config)) {195 // can't use array_merge() because keys might be integers196 foreach