1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-25 16:02:13 +01:00
Files
archived-doc-es/reference/sqlite/functions/sqlite-create-aggregate.xml
Pedro Antonio Gil Rodríguez ff89f08f91 Updated to the most recent version
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@330805 c90b9560-bf6c-de11-be94-00142212c4b1
2013-07-08 21:53:58 +00:00

235 lines
8.2 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 656d1610af1a960d87c8b7056e54d0d4c75fb123 Maintainer: seros Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.sqlite-create-aggregate" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>sqlite_create_aggregate</refname>
<refname>SQLiteDatabase::createAggregate</refname>
<refpurpose>Registrar FDU totalizadora para usarla en sentencias SQL</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>void</type><methodname>sqlite_create_aggregate</methodname>
<methodparam><type>resource</type><parameter>dbhandle</parameter></methodparam>
<methodparam><type>string</type><parameter>function_name</parameter></methodparam>
<methodparam><type>callable</type><parameter>step_func</parameter></methodparam>
<methodparam><type>callable</type><parameter>finalize_func</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>num_args</parameter><initializer>-1</initializer></methodparam>
</methodsynopsis>
<para>&style.oop; (method):</para>
<methodsynopsis>
<modifier>public</modifier> <type>void</type><methodname>SQLiteDatabase::createAggregate</methodname>
<methodparam><type>string</type><parameter>function_name</parameter></methodparam>
<methodparam><type>callable</type><parameter>step_func</parameter></methodparam>
<methodparam><type>callable</type><parameter>finalize_func</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>num_args</parameter><initializer>-1</initializer></methodparam>
</methodsynopsis>
<para>
<function>sqlite_create_aggregate</function> es similar a
<function>sqlite_create_function</function> excepto que registra
funciones que pueden ser usadas para calcular un resultado totalizador de todas las
filas de una consulta.
</para>
<para>
La diferencia principal entre esta función y
<function>sqlite_create_function</function> es que se necesitan dos
funciones para administrar la totalización; <parameter>step_func</parameter> es
llamada para cada fila del conjunto de resultados. La función de PHP debería
acumular el resultado y almacenarlo en un contexto totalizador.
Una vez que se han procesado todas las filas,
<parameter>finalize_func</parameter> será llamada y entonces debería
tomar los datos desde el contexto totalizador y devolver el resultado.
Las funciones de llamada de retorno deberían un tipo comprendido por SQLite (esto es, un
<link linkend="language.types.intro">tipo escalar</link>).
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>dbhandle</parameter></term>
<listitem>
<para>
El recurso de Base de datos de SQLite; devuelto por <function>sqlite_open</function>
cuando se usa procedimentalmente. Este parámetro no es necesario
cuando se usa el método orientado a objetos.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>function_name</parameter></term>
<listitem>
<para>
El nombre de la función utlizada en las sentencias SQL.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>step_func</parameter></term>
<listitem>
<para>
Función de llamada de retorno llamada para cada fila del conjunto de resultados.
Los parámetros de la función son <literal>&amp;$context, $value, ...</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>finalize_func</parameter></term>
<listitem>
<para>
Función de llamada de retorno para totalizar los datos "escalonados" de cada fila.
El parámero de la función es <literal>&amp;$context</literal> y la función
debería devolver el resultado final de la totalización.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>num_args</parameter></term>
<listitem>
<para>
Alusión al analizador de SQLite si la función de llamada de retorno acepta un
número predeterminado de argumentos.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.void;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Ejemplo de función totalizadora max_length</title>
<programlisting role="php">
<![CDATA[
<?php
$data = array(
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten',
);
$dbhandle = sqlite_open(':memory:');
sqlite_query($dbhandle, "CREATE TABLE strings(a)");
foreach ($data as $str) {
$str = sqlite_escape_string($str);
sqlite_query($dbhandle, "INSERT INTO strings VALUES ('$str')");
}
function max_len_step(&$context, $string)
{
if (strlen($string) > $context) {
$context = strlen($string);
}
}
function max_len_finalize(&$context)
{
return $context;
}
sqlite_create_aggregate($dbhandle, 'max_len', 'max_len_step', 'max_len_finalize');
var_dump(sqlite_array_query($dbhandle, 'SELECT max_len(a) from strings'));
?>
]]>
</programlisting>
</example>
</para>
<para>
En este ejemplo creamos una función totalizadora que
calculará la longitud de la cadena más larga en una de las columnas de la
tabla. Para cada fila, la función <literal>max_len_step</literal> es
llamada y se le pasa un parámetro <parameter>context</parameter>. El parámetro
context es como cualquier otra variable de PHP y es establecido para contener un array
o incluso un valor de un objeto. En este ejemplo, simplemente estamos usándolo para que contenga
la longitud máxima que hemos estado viendo; si el parámetro
<parameter>string</parameter> tiene una longitud mayor que el máximo
actual, actualizamos el contexto para que contenga esta nueva longitud máxima.
</para>
<para>
Después de que todas las filas se hayan procesado, SQLite llama a la
función <literal>max_len_finalize</literal> para determinar el resultado
total. Aquí, podríamos llevar a cabo algún tipo de cálculo basado en los
datos encontrados en <parameter>context</parameter>. Aunque en nuestro sencillo
ejemplo hemos ido calculando el resultado mientras la consulta progresaba, por lo que
simplemente necesitamos devolver el valor de contex.
</para>
<note>
<para>
El ejemplo de arrbia no funcionará correctamente si la columna contiene datos
binarios. Échele un vistazo a la página del manual de
<function>sqlite_udf_decode_binary</function> para una explicación de por qué
esto es así, y un ejemplo de cómo hacerlo respecto a la codificación binaria.
</para>
</note>
<tip>
<para>
NO se recomienda almacenar una copia de los valores de context
y despúes procesarlos al final, ya que causaría que SQLite usara un montoón de
memoria para procesar la consulta - simplemente piense en cúanta memoria se necesitaría
si estuviesen almacenadas en memoria un millón de filas, cada una conteniendo una cadena de 32 bytes
de longitud.
</para>
</tip>
<tip>
<para>
Se puede usar <function>sqlite_create_function</function> y
<function>sqlite_create_aggregate</function> para sobrescribir las funciones SQL
nativas de SQLite.
</para>
</tip>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>sqlite_create_function</function></member>
<member><function>sqlite_udf_encode_binary</function></member>
<member><function>sqlite_udf_decode_binary</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->