Error ORA-00936: missing expression [SOLUCIONADO]

Errores comunes en PL/SQL: Cómo solucionar la falta de expresión

La programación con PL/SQL de Oracle a menudo se encuentra con obstáculos y errores que pueden ralentizar el proceso de desarrollo. Entre los errores más comunes se encuentra el conocido **Error ORA-00936**, que sucede cuando falta una expresión en la consulta SQL. Este error puede ser especialmente confuso para los desarrolladores que trabajan con **Active Server Pages (ASP)**, ya que puede ocurrir por motivos no tan obvios.

**Causas del error**

Cuando se programa en ASP y se utiliza Oracle como sistema de gestión de base de datos, es fundamental formular correctamente las instrucciones SQL. El error de falta de expresión normalmente ocurre en:
– Un **SELECT** sin la lista de columnas a recuperar.
– Una cláusula **INSERT INTO** vacía o incompleta.
– Constructos PL/SQL como **IF**, **CASE**, o **LOOP** sin sus correspondientes expresiones o condiciones.

**Ejemplos y soluciones comunes**

Si intentamos recuperar datos con un **SELECT** sin especificar las columnas, Oracle no sabe qué campos recuperar y nos lanzará dicho error. Veamos un ejemplo incorrecto:

sql
SELECT FROM usuarios WHERE id_usuario = 1;

Para solucionarlo, debemos especificar las columnas que deseamos recuperar:

sql
SELECT nombre, apellido FROM usuarios WHERE id_usuario = 1;

Al trabajar con cláusulas **INSERT INTO**, el error de falta de expresión también puede manifestarse si omitimos parte de la información necesaria. Por ejemplo:

sql
INSERT INTO usuarios VALUES (‘Juan’, ‘Pérez’);

Este fragmento de código podría lanzar un error si la tabla ‘usuarios’ requiere más campos de los que estamos proporcionando. La solución pasa por aclarar las columnas y los valores correspondientes:

sql
INSERT INTO usuarios (nombre, apellido) VALUES (‘Juan’, ‘Pérez’);

En el caso de un bloque PL/SQL con constructos como **IF**, un ejemplo erróneo sería:

sql
IF THEN
DBMS_OUTPUT.PUT_LINE(‘El usuario es mayor de edad.’);
END IF;

Nótese la ausencia de una condición después de **IF**. La forma correcta de escribirlo sería:

sql
IF edad_usuario >= 18 THEN
DBMS_OUTPUT.PUT_LINE(‘El usuario es mayor de edad.’);
END IF;

**Buenas prácticas para evitar el error ORA-00936**

– Siempre revisa si todas las cláusulas SQL tienen las expresiones correspondientes.
– Usa nombres de columnas explícitos en vez de asteriscos (*), lo cual, además, mejora la eficiencia de la consulta.
– Verifica que las instrucciones **INSERT**, **UPDATE** y **DELETE** estén completas y correctamente estructuradas.
– Utiliza herramientas de depuración y formateo de código para encontrar rápidamente dónde falta información.
– Realiza pruebas unitarias de cada fragmento de código PL/SQL para garantizar su correcto funcionamiento antes de integrarlo al sistema.

**Manejo de errores en ASP**

Si estás trabajando con ASP y te encuentras con el **Error ORA-00936**, aquí te presentamos el manejo de errores en código ASP para capturar y manejar este tipo de excepciones:

asp
<% On Error Resume Next dim conn, rs, sql set conn = Server.CreateObject("ADODB.Connection") conn.Open "tu_cadena_conexion" sql = "SELECT FROM usuarios WHERE id_usuario = 1;" set rs = conn.Execute(sql) If Err.Number <> 0 Then
Response.Write “Se ha producido un error: ” & Err.Description
Err.Clear
End If

rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
%>

En el código anterior aplicamos el método **On Error Resume Next** que permite que el código continúe ejecutándose incluso cuando ocurre un error, mientras que `Err.Number` y `Err.Description` nos ayudan a identificar y describir el error para poder manejarlo adecuadamente.

**Trabajo con procedimientos almacenados**

A veces, el manejo de errores puede ser más sencillo si trasladamos la lógica a procedimientos almacenados dentro de la base de datos Oracle. Esto encapsula el código SQL y permite reutilizarlo y testearlo de manera independiente. Aquí un ejemplo de un procedimiento almacenado en PL/SQL:

sql
CREATE OR REPLACE PROCEDURE seleccionar_usuario(p_id_usuario IN usuarios.id_usuario%TYPE) IS
v_nombre usuarios.nombre%TYPE;
BEGIN
SELECT nombre INTO v_nombre FROM usuarios WHERE id_usuario = p_id_usuario;
DBMS_OUTPUT.PUT_LINE(‘Nombre de usuario: ‘ || v_nombre);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘No se encontró el usuario.’);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(‘Error: ‘ || SQLERRM);
END seleccionar_usuario;

Este procedimiento almacenado es una forma segura de realizar selecciones en la base de datos. La sección **EXCEPTION** maneja los errores que pueden ocurrir durante la ejecución.

**Conclusión**

El **Error ORA-00936** es un obstáculo común en la programación con ASP y Oracle, pero entendiendo sus causas y aplicando buenas prácticas de codificación, puede ser resuelto de manera efectiva. Esperamos que este artículo te haya proporcionado el conocimiento necesario para identificar y rectificar problemas relacionados con la falta de expresiones en tus consultas SQL y te haya dado herramientas para mejorar tus habilidades de programación con bases de datos Oracle.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad