Problema Con Retorno De Funcion Postgres Con Carraydataprovider

Saludos ,soy nuevo en Yii,estoy usando SGB Postgres ,tengo una funcion en postgres de la siguiente manera




CREATE OR REPLACE FUNCTION public.palabra_acepciones (

  id integer

)

RETURNS TABLE (

  acepcion varchar,

  tomo varchar

) AS

$body$

SELECT  acepcion.acepcion, obra_completa.tomo

FROM acepcion, obra_completa, palabra, obra, acepcion_obra

WHERE palabra.id=$1

AND acepcion.id_palabra=palabra.id

AND obra_completa.id=obra.id_obracompleta

AND acepcion.id=acepcion_obra.id_acepcion

AND obra.id=acepcion_obra.id_obra;

$body$

LANGUAGE 'sql'

VOLATILE

CALLED ON NULL INPUT

SECURITY INVOKER

COST 100 ROWS 1000;



no es nada complicado me retorna una tabla con dos columnas …ahora cuando ejecuto




$list=Yii::app()->db->createCommand("select palabra_acepciones('$id')")->queryAll();

$dataProvider=new CArrayDataProvider($list);//esto es básico ,sin muchas complicaciones



obtengo


CArrayDataProvider Object

(

    [keyField] => id

    [rawData] => Array

        (

            [0] => Array

                (

                    [palabra_acepciones] => ("lorem itsum dolor ",tomo1)

                )


        )


    [caseSensitiveSort] => 1

    [_id:private] => id

    [_data:private] => 

    [_keys:private] => 

    [_totalItemCount:private] => 

    [_sort:private] => 

    [_pagination:private] => 

    [_e:private] => 

    [_m:private] => 

)



como ven el rowData esta algo raro porque,no me esta devolviendo el array indexado por el nombre de la funcion y no por los campos de la funcion …

ahora si repito lo mismo pero de esta forma …




$list=Yii::app()->db->createCommand("select distinct acepcion.acepcion, obra_completa.tomo 

											FROM acepcion, obra_completa, palabra, obra, acepcion_obra

											WHERE palabra.id='$id'

											AND acepcion.id_palabra=palabra.id

											AND obra_completa.id=obra.id_obracompleta

											AND acepcion.id=acepcion_obra.id_acepcion

											AND obra.id=acepcion_obra.id_obra")->queryAll();

		$dataProvider=new CArrayDataProvider($list);  

obtengo como salida


CArrayDataProvider Object

(

    [keyField] => id

    [rawData] => Array

        (

            [0] => Array

                (

                    [acepcion] => lorem itsum dolor

                    [tomo] => tomo1

                )


        )


    [caseSensitiveSort] => 1

    [_id:private] => 

    [_data:private] => 

    [_keys:private] => 

    [_totalItemCount:private] => 

    [_sort:private] => 

    [_pagination:private] => 

    [_e:private] => 

    [_m:private] => 

)



que es lo que esta mal? la funcion en postgres? Uso el EMS Manager for Postgres y me devuelve la tabla bien…

Es la función de postgresql la consulta te la retorna tal cual como la imprimes.

Lo extraño es que EMS Manager for Postgres te la muestra bien, por lo menos pgadmin o phppgadmin te mostraría el resultado como lo esta haciendo yii

100% de razon Junior ,no habia probado en otro soft la consulta ,pobre en PGADMIN y exactamente ya caigo en que el error esta en la funcion ,ya eso es tema para otro post ,soy nuevo en postgres ,y lo curioso es que hago la consulta en mysql basandome en las mismas tablas y me funciona perfectamente …tengo que profundizar un poco mas en el tema de las funciones en postgres …vengo un poco mas acomodado con el concepto de procedures en MySql.Saludos y Muchas gracias

.

Postgres tiene sus trucos pero una vez que le agarres el gusto no lo querrás dejar.

si una procedimiento en postgres te retorna uno o varios registro tipo tabla tendrías que "castearlo" para que te muestra el resultado bien, ejemplo:

SELECT * FROM palabra_acepciones(1) as return(varchar, varchar)