lunes, 27 de mayo de 2024

GCP: Crear Stored Procedures y Funciones en BigQuery

En esta ocasión veremos cómo crear Stored Procedures y funciones en BigQuery. Un procedimiento almacenado es un conjunto de instrucciones que se pueden llamar desde otras consultas o desde otros procedimientos almacenados.

  • Puede tomar argumentos de entrada y mostrar valores como resultados.
  • Puede acceder a los datos o modificarlos en varios conjuntos de datos de varios usuarios.
  • También puede contener una consulta de varias instrucciones.

Ejemplo. Crear un Stored Procedure que mande un simple mensaje de "Hola, mundo". En este caso también le pasamos un párametro de nombre (name).

CREATE OR REPLACE PROCEDURE `myproject.mydataset.decirHola`(name STRING)
BEGIN
  SELECT FORMAT("Hola, %s",name);
END;

Para invocarlo:

CALL`myproject.mydataset.decirHola`('Thomas Muller');

Ejemplo. Teniendo esta sentencia SQL que nos devuelve la definición de un Stored Procedure en BigQuery:

-- Obtener la definición de un Stored Procedure en BigQuery
SELECT 
  routine_catalog, 
  routine_schema, 
  routine_name, 
  routine_type, 
  routine_definition
FROM your_dataset.INFORMATION_SCHEMA.ROUTINES    
WHERE routine_name = 'nombre_stored_procedure';

Crear un Stored Procedure que nos devuelva cada uno de los campos.

CREATE OR REPLACE PROCEDURE `myproject.mydataset.getDetallesStored`(nameStored STRING)
BEGIN
  -- Ejecutar la consulta y retornar los resultados
  DECLARE routine_catalog STRING;
  DECLARE routine_schema STRING;
  DECLARE routine_name STRING;
  DECLARE routine_type STRING;
  DECLARE routine_definition STRING;

  SELECT
    routine_catalog,
    routine_schema,
    routine_name,
    routine_type,
    routine_definition
  INTO 
    routine_catalog,
    routine_schema,
    routine_name,
    routine_type,
    routine_definition
  FROM
    myproject.mydataset.INFORMATION_SCHEMA.ROUTINES
  WHERE
    routine_name = nameStored;

  -- Seleccionar los resultados para retornarlos
  SELECT
    routine_catalog,
    routine_schema,
    routine_name,
    routine_type,
    routine_definition;
END;

Hacemos el llamado:

CALL `myproject.mydataset.getDetallesStored`('decirHola');

El resultado de este llamado nos arrojará los detalles del Stored Procedure indicado.


¿Y las funciones?

Una función es similar a un Stored Procedure (Procedimiento Almacenado), pero devolverá un valor. Además cambia la manera en la que lo invocamos. Mientras que un Stored Procedure es invocado con CALL, a una función la invocaremos con SELECT.

Ejemplo. Crear una función para dividir dos números.

CREATE OR REPLACE FUNCTION `myproject.mydataset.getDiv`(
  x FLOAT64, y FLOAT64) RETURNS FLOAT64
AS (
  SELECT DIV(X, Y) AS RESULT;
);

Para usar la función:

SELECT `myproject.mydataset.getDiv`(3.4,5.2);

Para quienes han usado PL/pgSQL (PostgreSQL) o PL/SQL (Oracle) la sintaxis es muy similar, por no decir idéntica. Salvo por algunas excepciones.

En próximas entregas continuaremos con este tema.

Enlaces:

https://cloud.google.com/bigquery/docs/procedures?hl=es-419

domingo, 19 de mayo de 2024

Instalando Scala & SBT

En este post veremos cómo instalar Scala y SBT. Para ello usaremos SDKMAN!

SBT es un gestor de proyectos similar a Gradle y Maven.

Como primera instrucción tenemos:

sdk install scala

Comprobamos su instalación:

scala --version

Ahora sbt:

sdk install sbt

Verificamos la instalación:

sbt --version

Comandos básicos de SBT

  • clean, para limpiar proyecto.
  • reload, recargar proyecto.
  • update, actualizar proyecto.
  • compile, compilar proyecto y
  • run, para ejecutar proyecto.

Creamos un proyecto Play Framework con SBT. Abrimos una terminal y tecleamos:

sbt new playframework/play-scala-seed.g8

Ejecutamos la aplicación web:

sbt run

Abrimos un navegador en la ruta http://localhost:9000

Listo, nuestro primer proyecto creado!!

Enlaces:

https://sdkman.io/
https://www.scala-sbt.org/
https://www.scala-lang.org/
https://codemonkeyjunior.wordpress.com/

domingo, 12 de mayo de 2024

Haxe

Haxe es un lenguaje de programación de código abierto de alto nivel de tipo estricto con un compilador cruzado de optimización rápida.

El sitio oficial de este lenguaje menciona que es usado para crear APIs, video juegos, aplicaciones web y de escritorio.

Instalación de Haxe en Linux (Ubuntu)

sudo add-apt-repository ppa:haxe/releases -y
sudo apt-get update
sudo apt-get install haxe -y
mkdir ~/haxelib && haxelib setup ~/haxelib

La extensión de un programa en Haxe es *.hx.

Main.hx

class Main{
   static public function main(): Void{
      trace("Hola mundo en Haxe!!!");
   }
}

Para compilar y ejecutar abrimos una terminal

haxe --main Main --interp

Tipos de datos:

var entero:Int=11;
var cadena:String="Helmut Gerrsand";
var falso:Bool= 45 > 21;
var flotante:Float=3.4;

Funciones:

class Main{
   static public function main(): Void{
   testA();
  }

   static public function testA(): Void{
    trace("Hola, mundo en Haxe!!");
   }

}

Enlaces:

https://haxe.org/

Aprender Oracle SQL con LiveSQL

Si deseas aprender SQL o mejorar tus habilidades existe un sitio para hacerlo: https://livesql.oracle.com/

LiveSql es un sitio con tutoriales, ejemplos y editor que nos permite ejecutar sentencias SQL como:

  • Crear tablas.
  • Crear vistas.
  • Consultar datos de las tablas.
  • Crear bloques PL/SQL.
  • Crear funciones y procedimientos PL/SQL.
  • etc.

¿Qué es SQL?

Son las siglas de Structured Query Language. Un lenguaje especializado para la creación y manipulación de la información contenida en tablas de información perteneciente a una base de datos.

El SQL se divide en:

  • DCL: Data Control Language (GRANT/REVOQUE).
  • TCL: Transaction Control Language (COMMIT/ROLLBACK/SAVEPOINT).
  • DDL: Data Definition Language(CREATE/ALTER/DROP/RENAME/TRUNCATE).
  • DML:Data Manipulation Language(INSERT/SELECT/UPDATE/DELETE).

DCL, nos permitirá otorgar y revocar permisos a tablas, funciones y procedimientos y otros objetos.

TCL, nos permitirá el control de las transacciones.

DDL, nos permitirá el control de la definición de los objetos.

DML, nos permitirá la manipulación de la información contenida.

LiveSql está enfocado tanto a principiantes como experimentados en el conocimiento de SQL. No permite crear o borrar bases de datos. No las necesitas, con que puedas crear tablas y manipularlas te bastará, ya que trabajarás con la BD que provee el sitio.

Oracle posee, al igual que otros SGBD (Sistema Gestor de Bases de Datos) su propios tipos de datos como lo pueden ser:

VARCHAR
CHAR
FLOAT
NUMBER
DATE
LONG
BINARY_FLOAT
BINARY_DOUBLE
TIMESTAMP
CLOB
BLOB
...

El editor nos permitirá ejecutar cualquier sentencia SQL válida:

select to_char(sysdate, 'HH:MI:SS') as hora from dual;
HORA
03:13:05

Podremos ejecutar bloques PL/SQL:

DECLARE
BEGIN
   dbms_output.put_line('Fecha: '||sysdate);
END;
/
Fecha: 12-MAY-24

Más ejemplos en próximos posts.

Enlaces:

https://livesql.oracle.com/

viernes, 3 de mayo de 2024

GCP: Creando y borrando tablas con BigQuery (Java, Python, etc.)

En un post pasado dimos un pequeño vistazo a GCP y BigQuery. Continuaremos con más ejemplos de Java y BigQuery.

Ejemplo 1. Crear una tabla con BigQuery.

CrearTableBigQuery.java

package com.codemonkey.main;

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.StandardTableDefinition;
import com.google.cloud.bigquery.TableDefinition;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;

public class CrearTableBigQuery {

   public static final String MY_DATASET_NAME = "midataset";
   public static final String MY_TABLE_NAME= "usuarios";

  public static void main(String[] args) {

    String datasetName = MY_DATASET_NAME;
    String tableName = MY_TABLE_NAME;
    Schema schema =
        Schema.of(
            Field.of("nombre", StandardSQLTypeName.STRING),
            Field.of("activo", StandardSQLTypeName.BOOL));
    createTable(datasetName, tableName, schema);
  }

  public static void createTable(String datasetName, String tableName, Schema schema) {
    try {
   
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);
      TableDefinition tableDefinition = StandardTableDefinition.of(schema);
      TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();

      bigquery.create(tableInfo);
      System.out.println("Tabla creada exitosamente!!");
    } catch (BigQueryException e) {
      System.err.println("Ha ocurrido un error al crear la tabla: \n" + e.getMessage());
    }
  }
}

Si todo funciona correctamente, entonces la tabla usuarios habrá sido creada correctamente.

En Python el código tan solo consta de unas breves líneas de código:

creartablabq.py

from google.cloud import bigquery

client = bigquery.Client()
table_id = "midataset.usuarios"
schema = [
    bigquery.SchemaField("nombre", "STRING", mode="REQUIRED"),
    bigquery.SchemaField("edad", "INTEGER", mode="REQUIRED"),
]
table = bigquery.Table(table_id, schema=schema)
table = client.create_table(table)  
print(
    "Se ha creado la tabla {}.{}.{}".format(table.project, table.dataset_id, table.table_id))

Ejemplo 2. Eliminar una tabla con BigQuery.

EliminarTabla.java

package com.codemonkey.main;

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

public class EliminarTabla {

  public static void main(String[] args) {
    String datasetName = "midataset";
    String tableName = "usuarios";
    borrarTabla(datasetName, tableName);
  }

  public static void borrarTabla(String datasetName, String tableName) {
    try {

      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
      boolean success = bigquery.delete(TableId.of(datasetName, tableName));
      if (success) {
        System.out.println("Tabla borrada exitosamente");
      } else {
        System.out.println("Tabla no encontrada");
      }
    } catch (BigQueryException e) {
      System.out.println("Ha ocurrido un error al borrar la tabla. \n" + e.getMessage());
    }
  }
}

Si funciona correctamente, la tabla será eliminada.

Ahora en Python:

eliminartablabq.py

from google.cloud import bigquery

client = bigquery.Client()

table_id = 'myproject.mydataset.usuarios'

client.delete_table(table_id, not_found_ok=True) 
print("Tabla eliminada: '{}'.".format(table_id))

¿Y qué con otros clientes cómo PHP, etc.?

Hay clientes para otros lenguajes además de Java y Python, también puede usar C#, PHP, y Go.

borrartablebq.php

use Google\Cloud\BigQuery\BigQueryClient;

/**
 * Borrar determinada tabla
 *
 * @param string $projectId El ID de tu proyecto.
 * @param string $datasetId El ID de tu dataset.
 * @param string $tableId El ID de tu tabla.
 */
function eliminarTabla(string $projectId, string $datasetId, string $tableId): void
{
    $bigQuery = new BigQueryClient([
      'projectId' => $projectId,
    ]);
    $dataset = $bigQuery->dataset($datasetId);
    $table = $dataset->table($tableId);
    $table->delete();
    printf('Tabla eliminada %s.%s' . PHP_EOL, $datasetId, $tableId);
}

Cómo se puede observar, es relativamente fácil emplear el client library de GCP para nuestros proyectos en la nube.

El código fue tomado de este enlace: https://cloud.google.com/bigquery/docs/samples/bigquery-delete-table

Enlaces:

https://codemonkeyjunior.blogspot.com/2024/04/gcp-google-cloud-bigquery.html
https://codemonkeyjunior.blogspot.com/2024/04/google-cloud-platform-gcp-en-un-vistazo.html
https://codemonkeyjunior.blogspot.com/2024/04/gcp-google-cloud-storage.html