1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-26 00:12:06 +01:00
Files
archived-doc-es/reference/pdo_sqlite/PDO/sqliteCreateAggregate.xml
2014-09-05 20:55:10 +00:00

263 lines
8.7 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 14af302c9c0e561fa6f9cdd956268758ba9a89c5 Maintainer: seros Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="pdo.sqlitecreateaggregate" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>PDO::sqliteCreateAggregate</refname>
<refpurpose>
Registra una función acumuladora definida por el usuario para usarla en sentencias SQL
</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>PDO::sqliteCreateAggregate</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></methodparam>
</methodsynopsis>
&warn.experimental.func;
<para>
Estemétodo es similar a <xref linkend="pdo.sqlitecreatefunction"
/>, excepto que registra funciones que pueden ser usadas para calcular un
resultado acumulado a través de todas las filas de una consulta.
</para>
<para>
La diferencia clave entre este método y <xref
linkend="pdo.sqlitecreatefunction" /> es que son necesarias dos
funciones para administrar la acumulación.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>function_name</parameter></term>
<listitem>
<para>
El nombre de la función usado en las sentencias SQL.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>step_func</parameter></term>
<listitem>
<para>
Una función de llamada de retorno para cada fila del conjunto de resultados. La
función de PHP debería acumular el resultado y almacenarlo en el contexto de la
acumulación.
</para>
<para>
Esta función necesita ser definida como:
<methodsynopsis>
<type>mixed</type><methodname><replaceable>step</replaceable></methodname>
<methodparam><type>mixed</type><parameter>context</parameter></methodparam>
<methodparam><type>int</type><parameter>rownumber</parameter></methodparam>
<methodparam><type>mixed</type><parameter>value1</parameter></methodparam>
<methodparam choice="opt"><type>mixed</type><parameter>value2</parameter></methodparam>
<methodparam choice="opt"><type>mixed</type><parameter>..</parameter></methodparam>
</methodsynopsis>
</para>
<para>
<varname>context</varname> será &null; para la primera fila; en
filas subsiguientes tendrá el valor que fue devuelto anteriormente
desde la función 'step'; se debería usar esto para mantener el estado de
la acumulación.
</para>
<para>
<varname>rownumber</varname> contendrá el número de fila actual.
</para>
<para>
El valor devuelto por esta función se empleará como el
argumento para <parameter>context</parameter> en la siguiente llamada del "step" o
funciones finalizadorasf.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>finalize_func</parameter></term>
<listitem>
<para>
Función de llamada de retorno para acumular los datos usados en "step" desde cada fila.
Una vez que todas las fila han sido procesadasOnce, se invocará a esta función
y debería tomar los datos del contexto de la acumulación y
devolver el resultado. Las funciones de llamada de retorno deberían devolver un tipo
comprendido por SQLite (esto es, <link
linkend="language.types.intro">del tipo escalar</link>).
</para>
<para>
Esta función necesita ser definida como:
<methodsynopsis>
<type>mixed</type><methodname><replaceable>fini</replaceable></methodname>
<methodparam><type>mixed</type><parameter>context</parameter></methodparam>
<methodparam><type>int</type><parameter>rownumber</parameter></methodparam>
</methodsynopsis>
</para>
<para>
<varname>context</varname> contendrá el valor de retorno de cada última
llamada a la función 'step'.
</para>
<para>
<varname>rownumber</varname> contendrá el número de filas sobre las que
se realiza la acumulación.
</para>
<para>
El valor devuelto por esta función será utilizado como valor de retorno de
la acumulación.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>num_args</parameter></term>
<listitem>
<para>
Una sugerencia para el 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.success;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Ejemplo de función acumuladora max_length</title>
<programlisting role="php">
<![CDATA[
<?php
$datos = array(
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
'ten',
);
$bd = new PDO('sqlite::memory:');
$bd->exec("CREATE TABLE strings(a)");
$insert = $bd->prepare('INSERT INTO strings VALUES (?)');
foreach ($datos as $str) {
$insert->execute(array($str));
}
$insert = null;
function max_len_step(&$context, $rownumber, $string)
{
if (strlen($string) > $context) {
$context = strlen($string);
}
return $context;
}
function max_len_finalize(&$context, $rownumber)
{
return $context;
}
$bd->sqliteCreateAggregate('max_len', 'max_len_step', 'max_len_finalize');
var_dump($bd->query('SELECT max_len(a) from strings')->fetchAll());
?>
]]>
</programlisting>
</example>
</para>
<para>
En este ejemplo, se crea una función acumuladora que calculará
la longitud de la cadena más larga de las columnas de la
tabla. Para cada fila, la función <literal>max_len_step</literal> se
invoca y se le pasa un parámetro <parameter>context</parameter>. El parámetro
'context' es como otra variables cualquiera de PHP y se establece para contener un array
o incluso un valor de un objeto. En este ejemplo, se usa simplemente para que contenga
la longitud máxima que se ha visto hasta aquí; si
<parameter>string</parameter> tiene una longitud mayor que el máximo
actual, se actualiza el contexto para que contenga esta nueva longitud máxima.
</para>
<para>
Después de haber procesado todas las filas, SQLite llama a la
función <literal>max_len_finalize</literal> para determinar el resultado
acumulado. Aquí, se podría realizar algún tipo de cálcula basado en los
datos encontrados en <parameter>context</parameter>; aunque, en este sencillo
ejemplo se ha calculado el resultado mientras la consulta progresaba, necesitando
así devolver simplemente el valor de 'context'.
</para>
<tip>
<para>
NO se recomienda almacenar una copia de los valores de 'context'
y luego procesarlos al final, ya que causariá que SQLite utilizara mucha
memoria para procesar la consulta; piense simplemente cúanta memoria sería necesaria
si estuvieran almacenadas en ella un millón de filas, cada una conteniendo una cadena
de 32 bytes de longitud.
</para>
</tip>
<tip>
<para>
Se puede usar <xref linkend="pdo.sqlitecreatefunction" /> y
<xref linkend="pdo.sqlitecreateaggregate" /> para invalidar funciones SQL
nativas de SQLite.
</para>
</tip>
<note>
<para>
Este método no está disponible con el controlador SQLite2.
Use la API de sqlite de estilo antiguo en su lugar.
</para>
</note>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><xref linkend="pdo.sqlitecreatefunction" /></member>
<member><function>sqlite_create_function</function></member>
<member><function>sqlite_create_aggregate</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
indent-tabs-mode:nil
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
-->