Ir para conteúdo

Arquivado

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

Uerlen Santos

Erro ao executar Consulta

Recommended Posts

Saudações Galera...

 

Estou com o seguinte erro:

 

SQLSTATE[HY000]: General error: 10007 The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified. [10007] (severity 5) [(null)]

 

Ao executar o seguinte codigo:

$sql = "SELECT p.Pac, pp.Dtp AS DtaAtend, prot.Descricao AS Protocolo,
			ps1.DAB AS Espec, pf.Nome AS Profissional,
			pta.Apresentacao AS Tipo_Atend
			FROM Pacientes p
			INNER JOIN Pacientes_Protocolos pp ON (p.Pac=pp.Pac)
			INNER JOIN Protocolos prot ON (pp.Pro=prot.Pro AND pp.St=1)
			INNER JOIN CorpoClinico cc ON (p.Mps=cc.Mps)
			INNER JOIN Pessoa_Fisica pf ON (cc.Npf=pf.Npf)
			INNER JOIN Produtos_Servicos ps1 ON (p.Esp=ps1.Cod)
			LEFT JOIN Prd_Tipo_Atendimento pta ON (p.Id_Ret=pta.Chv)
			WHERE p.Npf=? ";

		if ($_REQUEST["protocolo"] != null) {
			$sql .= "AND pp.Pro=? ";
		} else {
			$sql .= "AND pp.Pro<>? ";
		}

		$sql .= " UNION SELECT p.Pac, pp.Dtp AS DtaAtend, prot.Descricao AS Protocolo,
			ps1.DAB AS Espec, pf.Nome AS Profissional,
			pta.Apresentacao AS Tipo_Atend
			FROM Historico_Pacientes p
			INNER JOIN Pacientes_Protocolos pp ON (p.Pac=pp.Pac)
			INNER JOIN Protocolos prot ON (pp.Pro=prot.Pro AND pp.St=1)
			INNER JOIN CorpoClinico cc ON (p.Mps=cc.Mps)
			INNER JOIN Pessoa_Fisica pf ON (cc.Npf=pf.Npf)
			INNER JOIN Produtos_Servicos ps1 ON (p.Esp=ps1.Cod)
			LEFT JOIN Prd_Tipo_Atendimento pta ON (p.Id_Ret=pta.Chv)
			WHERE p.Npf=? ";

		if ($_REQUEST["protocolo"] != null) {
			$sql .= "AND pp.Pro=? ";
		} else {
			$sql .= "AND pp.Pro<>? ";
		}

		return $this->getPO()->loadDataWithSortExpression($sql, $startRow, $pageSize, null, array($idPaciente, $idProtocolo,$idPaciente, $idProtocolo));

 

Gostaria de saber se alguém já teve esse problema e conseguiu solucionar.

 

Att

Uerlen Santos

Compartilhar este post


Link para o post
Compartilhar em outros sites

O sql está muito extenso, fica dificil analisar. Já experimentou testar por partes? Do género, dividir o sql em pequenas querys e ir verificando onde está dando erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Ricardo,

 

Então a consulta funciona bem mesmo fragmentada. O problema que ta ocorrendo é quando adiciono o ORDER BY, pois sem ORDER BY funciona, só que preciso dele. Aí que esta complicando e gerando o erro mencionado acima.

 

Obrigado por ter respondido!

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz post da funcao loadDataWithSortExpression para ver como esta sendo feito o sort.

 

Segue função:

public function loadDataWithSortExpression($sqlQuery, $startRow = null, $pageSize = null, $sortExpression = null, $params = null) {

	if ($sqlQuery == null) {
		throw new ArgumentNullException("sqlQuery");
	}

	if (!is_array($params)) {
		$params = array($params);
	}

	$listReturn = array();
	// Carrega a lista de atributos a serem preechidos nos objetos de retorno
	$listAttr = $this->getPropertyAnnotations(null, null);

	$sqlQuery = $this->customSqlInterpreter($sqlQuery);

	$paramsBound = array();

	// Verifica se existem parametros a serem adicionados no comando
	if ($params != null) {
		foreach($params as $p) {
			if (!($p instanceof GDA_GDAParameter))
				array_push($paramsBound, $p); //throw new InvalidDataTypeException('params are not GDAParameters');
			else	
				array_push($paramsBound, $p->getValue());//$p->getParameterName()] = $p->getValue();
		}
	}

	// Verifica se existe alguma expressão de ordenação relacionada
	if ($sortExpression != null && trim($sortExpression) != "") {

		if (!$sortExpression instanceof InfoSortExpression) {
			$sortExpression = new InfoSortExpression($sortExpression);
			//throw new InvalidDataTypeException("Argument sortExpression is not InfoSortExpression.");
		}

		$found = false;

		// Procura a propriedade relacionada ao campo de ordenação
		foreach ($this->mappedFields as $item) {
			if ($item->representedProperty->getName() == $sortExpression->getSortColumn()) {
				// Define a ordenação para o campo
				$sqlQuery .= " order by " . ($sortExpression->getTableAlias()!=null ? $sortExpression->getTableAlias() . "." : "") . $item->name . ($sortExpression->isReverse() ? " desc" : "");
				$found = true;
				break;
			}
		}

		if (!$found) {
			throw new GDA_GDAException("Sort column {$sortExpression->getSortColumn()} not fount mapped.");
		}
	}

	// Verifica se existem informações para paginação
	if (isset($startRow) && !isset($pageSize)) {
		throw new GDA_GDAException("Argument pageSize cannot be null.");
	} else if (isset($pageSize) && !isset($startRow)) {
		throw new GDA_GDAException("Argument startRow cannot be null.");
	} else if (isset($startRow) && isset($pageSize) && !$startRow instanceof int && $pageSize instanceof int) {
		throw new InvalidDataTypeException("Argument startRow and pageSize is not integer type.");
	}

	if (isset($startRow) && isset($pageSize)) {

		if (stristr(strtolower($sqlQuery), 'order by') == false) {
			// Recupera a chave identificade relacionda
			$pKey = $this->getPropertyIdentityKey();

			// Chave Identidade não localizada
			if ($pKey == null) {
				// Recupera algum propriedade chave
				$pKey = $this->getFirtsPropertyKey();

				if ($pKey == null) {
					// Recupera a primeira propriedade do mapeamento
					$pKey = $this->mappedFields[0];
				}
			}

			if ($pKey != null) $sqlQuery .= ' order by ' . $pKey->name;
		}
		$sqlQuery = $this->adapter->limit($sqlQuery, $pageSize, $startRow);
	} 

	$result = $this->adapter->fetchAll($sqlQuery, $paramsBound);

	// Verifica e houve algum retorno do comando
	if (sizeof($result) == 0)
		return $listReturn;

	$this->checkInputOptional($listAttr, $result[0]);

	$keys = array_keys($result[0]);
	foreach($result as $r) {

		$obj = $this->getNewInstance();

		$this->loadObjectData(&$obj, $listAttr, $keys, $r);

		array_push($listReturn, $obj);
	}

	return $listReturn;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

SQLSTATE[HY000]: General error: 10007 The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified. [10007] (severity 5) [(null)]

Se eu entendi bem, o seu problema é mais com SQL do que com php.

 

Tente postar no fórum de SQL, lá existem mais especialistas nessa linguagem que podem te ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.