mi objetivo es escribir un procedimiento almacenado que puede recoger todos los valores de campo de múltiples filas en una sola variable de salida (tal vez varchar (some_length)). Puede parecer una solución extraña, pero estoy bastante seguro de que es el único que puedo usar en esa situación. No he usado Firebird anteriormente y los procesos almacenados se ven de manera muy diferente que en otros sistemas de bases de datos conocidos. Mi Firebird es 1.5 y dialecto 3 (no estoy seguro de lo que significa). Así que tal vez alguien podría ayudarme con un ejemplo de algoritmo.Firebird procedimiento almacenado para concatenar todos los valores de campo de varias filas
Respuesta
el siguiente procedimiento se hace lo que usted describe:
SET TERM !!;
CREATE PROCEDURE concat_names
RETURNS (concat VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(100);
BEGIN
concat = '';
FOR SELECT first_name || ' ' || last_name FROM employee INTO :name
DO BEGIN
concat = concat || name || ', ';
END
END!!
SET TERM ;!!
EXECUTE PROCEDURE concat_names;
Pero cuestionar la conveniencia de esta solución. ¿Cómo sabe que VARCHAR es lo suficientemente largo para todas las filas en su conjunto de datos deseado?
Es mucho más fácil y más seguro para ejecutar una consulta para devolver el resultado a una fila de aplicaciones por fila. Cada lenguaje de programación de aplicaciones tiene métodos para concatenar cadenas, pero lo más importante es que tienen métodos más flexibles para administrar el crecimiento de los datos.
Por cierto, "dialecto" en Firebird e InterBase se refiere a un modo de compatibilidad que se introdujo para que las aplicaciones desarrolladas para InterBase 5.x puedan funcionar con las versiones posteriores de InterBase y Firebird. Eso fue hace casi diez años, y que yo sepa no hay necesidad hoy en día para usar nada más bajo que el dialecto 3.
Usted tiene que probar para valores nulos al concatenar, aquí hay un ejemplo de dos campos y un separador entre ellos:
CREATE PROCEDURE CONCAT(
F1 VARCHAR(385),
F2 VARCHAR(385),
SEPARATOR VARCHAR(10))
RETURNS (
RESULT VARCHAR(780))
AS
begin
if ((:f1 is not null) and (:f1 <> '')) then
result = :f1;
if ((:f2 is not null) and (:f2 <> '')) then
if ((result is not null) and (result <> '')) then
begin
if ((:separator is not null) and (separator <> '')) then
result = result||separator||f2;
else
result = result||f2;
end
else
result = f2;
suspend;
end
Devolución de varias filas utilizando procedimientos almacenados Firebird es muy, muy fácil.
No utilizar:
execute procedure proc_name(value);
utilizar en su lugar el:
select * from proc_name(value);
- 1. Sentencia Firebird CASE dentro del procedimiento almacenado
- 2. ¿Cómo se pueden concatenar varias filas en una en Oracle sin crear un procedimiento almacenado?
- 3. C# - Insertar varias filas usando un procedimiento almacenado
- 4. Para pasar filas masivas de datos al procedimiento almacenado
- 5. Devolviendo múltiples valores de un procedimiento almacenado
- 6. Concatenar varias filas en filas individuales en MySQL
- 7. Encontrar filas con los mismos valores en varias columnas
- 8. Combinar filas/concatenar filas
- 9. Procedimiento almacenado al ejecutar otro procedimiento almacenado
- 10. Cómo SELECCIONAR un PROCEDIMIENTO en Firebird 2.5
- 11. Transacción de procedimiento almacenado
- 12. Procedimiento almacenado de PostgreSQL con RETURNS TABLE (entero de identificación) que devuelve todos los NULL
- 13. Parámetro de valores múltiples de SSRS con un procedimiento almacenado
- 14. tamaño de un campo blob en Firebird
- 15. Procedimiento almacenado consulta de eliminación
- 16. Cómo devolver varias filas desde el procedimiento almacenado? (Oracle PL/SQL)
- 17. SSRS - devuelve varias consultas en un procedimiento almacenado
- 18. Ejecutar un procedimiento almacenado dentro de un procedimiento almacenado
- 19. concatenar varias filas en una matriz con SQL en PostgreSQL
- 20. ¿Cómo suprimo los resultados de un procedimiento almacenado dentro de un procedimiento almacenado?
- 21. ¿Cómo desactivo los resultados de la consulta al ejecutar un procedimiento almacenado desde un procedimiento almacenado?
- 22. Ejecutar procedimiento almacenado con valores de tabla como parámetro
- 23. Procedimiento almacenado de Oracle con parámetros para la cláusula IN
- 24. Magento: Crear procedimiento almacenado
- 25. Actualizando varias filas con valores diferentes
- 26. Cómo escribir asignaciones para un procedimiento almacenado
- 27. Necesito convertir el campo de Texto a Varchar temporalmente para poder pasar a un procedimiento almacenado
- 28. Llamar al procedimiento almacenado con los parámetros
- 29. ¿Cómo selecciono un procedimiento almacenado en Sybase?
- 30. SQL: cláusula in en procedimiento almacenado: cómo pasar valores
Si utiliza Firebird 2.1, puede utilizar la función de agregado LISTA proporciona con BLOB textual como resultado. Es decir. sin límite de campo varchar. –
Si no recuerdo mal, no puede declarar un parámetro de procedimiento o un valor de retorno con un tipo de datos BLOB o ARRAY. –
Cualquier valor nulo rompería esta solución. – Nelson