Mostrando entradas con la etiqueta procedimientos. Mostrar todas las entradas
Mostrando entradas con la etiqueta procedimientos. Mostrar todas las entradas

domingo, 16 de junio de 2024

GCP: Funciones matemáticas , de cadena y tiempo en BigQuery

En esta ocasión veremos cómo usar algunas de las funciones propias de BigQuery. Tanto en consultas, bloques, stored procedures y nuestras propias funciones.

Veremos:

  • Funciones matemáticas: RAND, POW, COS, SIN, etc.
  • Funciones de cadena: FORMAT, REPLACE, TRIM, CHAR_LENGTH, CONCAT, etc.
  • Funciones de manejo del tiempo: CURRENT_TIME, TIME, EXTRACT, FORMAT_TIME, etc.

Para hacer uso de las funciones solo debemos hacer uso de SELECT seguido de la función que queremos emplear:

Funciones matemáticas:

-- Consultas matemáticas
SELECT RAND(); -- generará un número aleatorio de tipo FLOAT64

SELECT POW(3,2); -- 3 elevado a la 2da potencia

SELECT COS(3); -- Coseno de 3 

SELECT SIN(-2); -- Seno de -2 

Funciones de cadena:

-- Consultas de cadena

SELECT TRIM(" Este es un ejemplo de la función trim "); -- quitará los espacios de la cadena

SELECT CHAR_LENGTH("Ferrocarrilero");-- la longitud será de 14 caracteres

SELECT LOWER("ANITA LAVA LA TINA"); -- anita lava la tina

SELECT UPPER("una pequeña gacela"); -- UNA PEQUEÑA GACELA

SELECT REPLACE("Maria", 'i','y'); -- Marya

Funciones de tiempo:

-- Consultas de tiempo

SELECT CURRENT_TIME AS now; -- mostrará el tiempo actual

SELECT TIME(15,30,00) as hora; -- mostrará la hora en formato hh:mm:ss

Empecemos con los bloques en BigQuery:

BEGIN 
-- Código BigQuery
END;

Como se puede observar, es similar a como lo hacemos en PL/SQL de Oracle.

Ejemplo. Crear un bloque BigQuery que verifique el tamaño de una cadena y si es mayor a cero, que la muestre.

BEGIN 
  
  -- Declaramos una variable llamada nombre de tipo String
  DECLARE nombre STRING;

  -- Asignamos un valor a la variable nombre
  SET nombre = "MARIA";
   
  -- Obtenemos el tamaño de la cadena y verificamos que sea mayor a cero
  IF CHAR_LENGTH(nombre) > 0 THEN
     SELECT FORMAT('Hola %s',nombre);
  END IF;
   
END;

Ejemplo. Crear un bloque BigQuery en el que se calcule la potecia de un número elevado a otro número. Para eso usaremos la función ``POW``.

BEGIN

  DECLARE x FLOAT64;
  DECLARE y FLOAT64;

  SET x = 54;
  SET y = 32;

  IF y < 0 THEN
    SELECT "REVISAR DATOS";
  ELSE
    SELECT FORMAT('La potencia del no. %f elevado a %f nos da: %f', x,y, (SELECT POW(x,y)));
  END;
  

END;

Podríamos crear tanto stored como funciones que implementen esas funciones propias de BigQuery.

Ejemplo. Crear un stored procedure BigQuery que genere un número aleatorio y tenga como entrada un número flotante. Si ambos números so iguales, mostrar un mensaje de logrado. En caso contrario, pedir que se intente nuevamente.

CREATE OR REPLACE PROCEDURE `project.dataset.adivinaNumero`(numero FLOAT64)
BEGIN
  DECLARE aleatorio FLOAT64;
  -- Generamos número aleatorio
  SET aleatorio = (SELECT RAND());
    

  -- Verificamos si son iguales
  IF numero = aleatorio THEN
      SELECT FORMAT('%f, bien hecho', aleatorio);
  ELSE
     SELECT FORMAT('%f, intenta de nuevo', numero);
  END IF;

END;

Para invocar procedimeinto:

CALL `project.dataset.adivinaNumero`(0.53332);

En próximas entregas veremos más ejemplos.

Enlaces:

https://codemonkeyjunior.blogspot.com/2024/05/gcp-crear-stored-procedures-y-funciones.html

domingo, 17 de marzo de 2024

OpenEdge ABL: creando funciones y procedimientos

Crear nuestras propias funciones o procedimientos nos sirve para la reducción de código y hacer el código más legible. Pero antes de comenzar, debemos hacer una diferencia: las funciones nos devolverán valores y los procedimientos no.

Ejemplo. Se requiere crear una función que convierta grados Celsius a grados Fahrenheit. Fórmula:

F = (9/5 * Celsius) + 32

fahrenheit.p

def var celsius as dec no-undo initial 33.9.

/* Función para realizar la conversión de Celsius a Fahrenheit */
function getFahrenheit dec(valor as dec):
    return (9.0 / 5.0) * valor + 32.0.
end.

display "Celsius: " celsius " , Fahrenheit: " getFahrenheit(celsius).

Nota: Para probar este código puedes entrar a este sitio: https://abldojo.services.progress.com/

Para que el programa funcione, se debe crear primero la función. Recordemos que muchos lenguajes de pogramación hacen una evaluación Top-down. Si invocas una función en el bloque de arriba sin antes definir una función, causará error.

También podríamos agregar otra función que obtenga lo grados Celsius:

/* Función para obtener grados Celsius */
function getCelsius dec (valor as dec):
    return (valor - 32.0) / (1.8).
end function.

También podríamos escribir la misma función pero de esta manera:

FUNCTION getCelsius RETURNS DECIMAL (
    INPUT valor AS DECIMAL
):
    DEFINE VARIABLE celsius AS DECIMAL.
    
    ASSIGN
        celsius = (valor - 32.0) * (5.0 / 9.0).
        
    RETURN celsius.
END FUNCTION.

Código completo:

def var celsius as dec no-undo initial 33.9.

/* Función para realizar la conversión de Celsius a Fahrenheit */
function getFahrenheit dec(valor as dec):
    return (9.0 / 5.0) * valor + 32.0.
end.

FUNCTION getCelsius RETURNS DECIMAL (
    INPUT valor AS DECIMAL
):
    DEFINE VARIABLE celsius AS DECIMAL.
    
    ASSIGN
        celsius = (valor - 32.0) * (5.0 / 9.0).
        
    RETURN celsius.
END FUNCTION.

display "Celsius: " celsius " , Fahrenheit: " getFahrenheit(celsius).
display "Celsius: " getCelsius(getFahrenheit(celsius)).

Como se pude ver usamos ``ASSIGN`` para asignar valores. En este caso asignamos el resultado de la conversión a la variable ``celsius``. El resultado será:

   celsius
          ----------
Celsius:       33.90  , Fahrenheit:       93.02 Celsius:       33.90

Para realizar la conversión de grados Fahrenheit a Celsius usamos ésta fórmula:

Celsius = (valor - 32.0) * (5.0 / 9.0).

Ejemplo 2. Crear un procedimiento que solo imprima un simple "Hola, mundo".

PROCEDURE imprimirHolaMundo():
    MESSAGE "Hola, mundo" VIEW-AS ALERT-BOX.
END PROCEDURE.

Para invocarlo:

RUN imprimirHolaMundo.

Ejemplo 3. Crear una función que no necesite parámetros de entrada.

FUNCTION getSaludo RETURNS CHARACTER:
    RETURN "Hola, programador de OpenEdge".
END FUNCTION.

DISPLAY getSaludo().

Ejemplo 4. Crear una función que calcule el factorial de un número

FUNCTION calcularFactorial RETURNS DECIMAL (
    INPUT numero AS DECIMAL
):
    DEFINE VARIABLE resultado AS DECIMAL INIT 1.
    DEFINE VARIABLE contador AS DECIMAL.
    
    DO contador = 1 TO numero:
        resultado = resultado * contador.
    END.
    
    RETURN resultado.
END FUNCTION.

DISPLAY calcularFactorial(5).

En este caso el resultado será: 120.00

Podríamos modificar la función usando la técnica de recursión:

FUNCTION calcularFactorial RETURNS DECIMAL (
    INPUT numero AS DECIMAL
):
    IF numero = 0 THEN
       RETURN 1.
    ELSE
       RETURN numero * calcularFactorial(numero - 1).
END FUNCTION.

DISPLAY calcularFactorial(5).

Ambas funciones resuelven el mismo problema. Como se ha visto en los primeros ejemplos: OpenEdge nos permite algunas cosas como omitir colocar la palabra ``INPUT`` o no colocar la palabra ``FUNCTION`` al final de una función.

Más ejemplos en próximas entregas.

Enlaces:

https://www.progresstalk.com/
https://abldojo.services.progress.com/

jueves, 6 de mayo de 2021

Erlang: módulos

Un módulo es, básicamente, una parte autónoma de un programa. Se puede sonsiderar un miniprograma que puede puede ser llamado por otro programa y/o programas.
Ejemplo 1. Crear un módulo que calcule el triple de un número.
mi_modulo.erl
% Módulo para obtener el triple de un número
-module(mi_modulo).
-export([triple/1]).

triple(X) ->
    3 * X.

% Abrimos la terminal y escribimos:
% erl
% c(mi_modulo).
% mi_modulo:triple(3). % 9
% Triple = mi_modulo:triple(9). % 27

Donde:
-module(mi_modulo).

Nos sirve para definir el módulo(programa) que será cargado.
-export([triple/1]).

Nos sirve para exportar la función. Es importante definir el número de parámetros. En este caso la función solo emplea uno:
> mi_modulo:triple(3). % 9

Ejemplo 2. Crear dos funciones para sumar y restar dos números.
-module(modulos).
-export([suma/2, resta/2]).

suma(X, Y)->
    X + Y.

resta(X, Y)->
    X - Y.

% erl
% > c(modulos).
% > modulos:suma(3,4). % 7
% > modulos:resta(7,4). % 3

Observando el código, podemos exportar más de una función.
-export([suma/2, resta/2]).


Enlaces:
https://blog.guille.dev/2019/08/aprendiendo-un-nuevo-lenguaje-erlang.html
https://www.histel.com/z_histel/biografias.php?id_nombre=46

martes, 13 de diciembre de 2011

Ejemplo de uso de MySQL: una pequeña bitácora




Tener una bitácora nos ayuda a tener un mejor control de nuestra información:

  • Ver quien hace cambios por “error”.
  • Ver la fecha de la operación,
  • Tipo de operación (inserción, actualización y/o borrado).


Bueno he aquí los pasos para crear una pequeña bitácora


1. Crear la base de datos

$ create database prueba1;
$ show databases;
$ use prueba1;
2. Crear una tabla llamadas personas

create table personas (id_persona int auto_increment primary key, 
nombre varchar (50), 
apellido_p varchar (50), 
apellido_m varchar(50), 
edad int, 
peso double, 
talla double);
3. Crear un procedimiento almacenado para insertar registros


DELIMITER $$
DROP PROCEDURE IF EXISTS `prueba1`.`Insertar` $$
CREATE PROCEDURE `prueba1`.`Insertar`(in nombre varchar (50), apellido_p varchar (50), apellido_m varchar(50), edad int, peso double, talla double)

BEGIN
INSERT INTO personas (nombre,apellido_p, apellido_m , edad , peso , talla) VALUES (nombre,apellido_p, apellido_m , edad , peso , talla );

END $$

DELIMITER ;

4. Crear un procedimiento almacenado para actualizar registros
DELIMITER $$
DROP PROCEDURE IF EXISTS `prueba1`.`Actualizar` $$
CREATE PROCEDURE `prueba1`.`Actualizar` (in id_personax int,edadx int,pesox double)
BEGIN
update personas set edad=edadx,peso=pesox where id_persona=id_personax;
END $$

DELIMITER ;



5. Crear un procedimiento almacenado para eliminar registros


DELIMITER $$

DROP PROCEDURE IF EXISTS `prueba1`.`Borrar` $$
CREATE PROCEDURE `prueba1`.`Borrar` (in id int)
BEGIN
delete from personas where id_persona=id;
END $$

DELIMITER ; 


6. Invocar los procedimientos almacenados

Call Insertar (Horacio,Gomez,Carmona,25,65,1.68);
Call Insertar (Hugo,Torres,Mendez,32,67,1.70);
Call Actualizar (1, 26, 66);
Call Borrar (2);

Ver registros

select * from personas;

7. Crear un procedimiento almacenado que muestre todos los registros

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_verPersonas` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_verPersonas`()
select *from personas $$

DELIMITER ;


Para invocarlo

CALL sp_verPersonas();




8. Crear tabla que lleve un control de quien hace cambios en la base de datos prueba1

CREATE TABLE infobase (usuario varchar (50), 
descripcion varchar (50),
fecha TIMESTAMP default now());


9. Crear trigger para la inserción

delimiter $$

create trigger tr_insercion
befote insert on personas
for each row
begin
insert into infobase values(user(),persona creada,now());

end $$


10. Crear trigger para la actualización

delimiter $$

create trigger tr_actualizacion
befote update on personas
for each row
begin
insert into infobase(usuario,descripcion,fecha) values(user(),persona modificada,now());

end $$


11. Crear trigger para la eliminación

delimiter $$

create trigger tr_borrado
befote delete on personas
for each row
begin
insert into infobase values(user(),persona eliminada,now());

end $$


Ver cambios

select * from infobase;


12. Crear procedimiento almacenado para ver un registro en particular

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_verPersona` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_verPersona`(in id_buscar int)
select *from personas where id_persona=id_buscar $$

DELIMITER ;

13. Ahora hacer una operación: calcular el I.M.C. (Índice de Masa Corporal) de las personas registradas

Fórmula: peso/(talla*talla)

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_verImc` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_verImc`()
select id_persona,nombre,edad,peso,talla,peso/(talla*talla) from personas $$

DELIMITER ;


14. Programa en Java para ver los registros
package control.pruebas;

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;

public class Codemonkey {

public static void main(String[] args) {
try{
 Class.forName("com.mysql.jdbc.Driver");
 Connection conecta=(Connection)  DriverManager.getConnection("jdbc:mysql://localhost:3306/prueba1","root","root");
 System.out.println("\tConexión exitosa\n");
 Statement sentencia= conecta.createStatement();
ResultSet registro=sentencia.executeQuery("select id_persona,nombre,edad,peso,talla,peso/(talla*talla) from personas");

   while(registro.next()){
    System.out.println("\t\nId: "+registro.getInt("id_persona"));
    System.out.println("Nombre: "+registro.getString("nombre"));
    System.out.println("Edad:"+registro.getInt("edad"));
    System.out.println("Peso:"+registro.getDouble("peso"));
    System.out.println("Talla: "+registro.getDouble("talla"));
    System.out.println("IMC: "+registro.getDouble("peso/(talla*talla)"));
  }
   conecta.close();
   System.out.println("\tConexión cerrada");
}catch(Exception ex){
    ex.printStackTrace();
}

}


}



Enlaces:

https://dev.mysql.com/doc/refman/8.4/en/create-procedure.html


Jai un lenguaje de programación inspirado en C++

Hoy hablaremos de un nuevo lenguaje de programación llamado Jai . Se trata de un lenguaje de programación que está desarrolland...

Etiquetas

Archivo del blog