04 septiembre 2017

Portar desde Oracle PL / SQL a PL/pgSQL (Primera parte)

¿Qué es PL/pgSQL?

PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language) es un lenguaje imperativo provisto por el gestor de base de datos PostgreSQL. Permite ejecutar comandos SQL mediante un lenguaje de sentencias imperativas y uso de funciones, dando mucho más control automático que las sentencias SQL básicas.

Desde PL/pgSQL se pueden realizar cálculos complejos y crear nuevos tipos de datos de usuario. Como un verdadero lenguaje de programación, dispone de estructuras de control repetitivas y condicionales, además de la posibilidad de creación de funciones que pueden ser llamadas en sentencias SQL normales o ejecutadas en eventos de tipo disparador (trigger).

Una de las principales ventajas de ejecutar programación en el servidor de base de datos es que las consultas y el resultado no tienen que ser transportadas entre el cliente y el servidor, ya que los datos residen en el propio servidor. Además, el gestor de base de datos puede planificar optimizaciones en la ejecución de la búsqueda y actualización de datos.

Las funciones escritas en PL/pgSQL aceptan argumentos y pueden devolver valores de tipo básico o de tipo complejo (por ejemplo, registros, vectores, conjuntos o incluso tablas), permitiéndose tipificación polimórfica para funciones abstractas o genéricas (referencia a variables de tipo objeto).

Migrar desde Oracle PL / SQL a PL /pgSQL

Esta entrada en el blog explica las diferencias entre el lenguaje PL / pgSQL de PostgreSQL y el lenguaje PL / SQL de Oracle, para ayudar a los desarrolladores que portan aplicaciones desde Oracle a PostgreSQL.

PL / pgSQL es similar a PL / SQL en muchos aspectos. Es un lenguaje estructurado en bloques, imperativo, y todas las variables tienen que ser declaradas. Asignaciones, bucles, condicionales son similares. Las principales diferencias que debe tener en cuenta al trasladar de PL / SQL a PL / pgSQL son:
  • Si un nombre utilizado en un comando SQL puede ser un nombre de columna de una tabla o una referencia a una variable de la función, PL / SQL lo trata como un nombre de columna. Esto corresponde al comportamiento plpgsql.variable_conflict = use_column de PL / pgSQL, que no es el predeterminado, como se explica en la Sección 41.10.1. A menudo es mejor evitar esas ambigüedades en primer lugar, pero si tiene que cargar una gran cantidad de código que depende de este comportamiento, establecer variable_conflict puede ser la mejor solución.
  • En PostgreSQL el cuerpo de la función debe escribirse como una cadena literal. Por lo tanto, necesita usar cotizaciones en dólares o escapar de comillas simples en el cuerpo de la función. 
  • Los nombres de tipo de datos a menudo necesitan traducción. Por ejemplo, en los valores de cadena de Oracle se declaran normalmente como de tipo varchar2, que es un tipo no estándar de SQL. En PostgreSQL, utilice el tipo varchar o texto. De forma similar, reemplace el número de tipo por numérico o utilice otro tipo de datos numéricos si hay otro más apropiado.
  • En lugar de paquetes, utilice esquemas para organizar sus funciones en grupos.
  • Puesto que no hay paquetes, tampoco hay variables a nivel de paquete. Esto es algo molesto. Puede guardar el estado por sesión en tablas temporales en su lugar.
  • Integer Los bucles FOR con REVERSE funcionan de manera diferente: PL / SQL cuenta desde el segundo número hasta el primero, mientras que PL / pgSQL cuenta desde el primer número hasta el segundo, requiriendo que los límites del loop sean intercambiados al portar. Esta incompatibilidad es lamentable, pero es improbable que se cambie.
  • Los bucles FOR sobre consultas (que no sean cursores) también funcionan de manera diferente: la variable o variables de destino deben haber sido declaradas, mientras que PL / SQL las declara siempre implícitamente. Una ventaja de esto es que los valores de las variables siguen siendo accesibles después de que el bucle salga.
  • Existen varias diferencias de notación para el uso de variables de cursor.

En próximas entradas nos ocuparemos de hacer un ejemplo para mostrar como migrar funcionalidad de una base de datos a otra.

No hay comentarios:

Publicar un comentario

Por favor deja tu comentario, es valioso.