Capítulo 3 - Operadores y comparadores

Al igual que en la mayoría de lenguajes de programación , en PL/SQL, se puede hacer uso de operadores para la manipulación de datos en variables.

Operador de concatenación

EL operador de concatenación "||" une las cadenas de texto de un operando hacia otro. Las cadenas pueden ser del tipo CHAR, VARCHAR2, CLOB. En caso de realizar la concatenación con un tipo de dato CLOB el resultado será también de ést tipo, en caso contrario será por defecto VARCHAR2.

DECLARE
  V_VARIABLE1 VARCHAR2(2) := 'Mi';
  V_VARIABLE2 VARCHAR2(6) :='Cadena';
  V_RESULTADO VARCHAR(200);
BEGIN
  V_RESULTADO := V_VARIABLE1 || V_VARIABLE2;
  DBMS_OUTPUT.PUT_LINE(V_RESULTADO);
END;
MiCadena

Debemos tomar en cuenta que internamente el operador de concatenación "junta" las cadenas de texto, por lo tanto, la variable que almacene el valor debe tener el tamaño suficiente para almacenar la cadena de texto resultante.

DECLARE
  V_VARIABLE1 VARCHAR2(7)  := 'Hola,';
  V_VARIABLE2 VARCHAR2(22) :=' ésta cadena es larga';
  V_RESULTADO VARCHAR2(9);
BEGIN
  --Se generarà un error al momento de asignar el valor
  --del texto concatenado a V_RESULTADO, debido a que su
  -- tamaño es de 9 cuando el texto concatenado es de 29
  V_RESULTADO := V_VARIABLE1 || V_VARIABLE2;
  DBMS_OUTPUT.PUT_LINE(V_RESULTADO);
END;
Informe de error:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 9
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    
*Action:

Para resolver el problema anterior,simplemente debemos ampliar el tipo de dato de VARCHAR2(9) a VARCHAR2(200) de la variable V_RESULTADO.

Precedencia de operadores

La precedencia de operadores es el orden en el que el motor de ejecución PL/SQL evalúa las expresiones. En la siguiente tabla se pueden ver el orden en el que se evalúan las expresiones en PL/SQL:

Orden de evaluación de operadores
OperadorOperaciónNivel
**exponenciación1
+,-identidad, negación2
*,/multiplicación, división3
+, -, ||suma, resta, concatenación4
=, <, >, <=, >=, <>, !=, ~=, ^=, IS NULL, LIKE, BETWEEN, INcomparación5
NOTnegación lógica6
ANDconjunción7
ORinclusión8

Los operadores se evalúan según su nivel, en caso de que se tenga que evaluar operadores del mismo nivel, éstos se evalúan sin ninguna prioridad. En caso de que se desee modificar la forma en que PL/SQL evalua los operadores se pueden utilizar paréntesis para agrupar expresiones.

Operadores lógicos

Los operadores lógicos AND, OR y NOT pueden evaluar 3 tipos de valores: TRUE(verdadero), FALSE(falso) y NULL(nulo), la siguiente tabla muestra la lógica de los operadores:

Tabla de verdad de operadores lógicos
xyx AND yx OR yNOT x
TRUETRUETRUETRUEFALSE
TRUEFALSEFALSETRUEFALSE
TRUENULLNULLTRUEFALSE
FALSETRUEFALSETRUETRUE
FALSEFALSEFALSEFALSETRUE
FALSENULLFALSENULLTRUE
NULLTRUENULLTRUENULL
NULLFALSEFALSENULLNULL
NULLNULLNULLNULLNULL

Los operadores lógicos son utilizados mayormente en sentencias de control, como la condicional IF o WHILE. El tipo de dato que almacena valores lógicos es BOOLEAN, veámos un ejemplo:

DECLARE
  V_VARIABLE BOOLEAN := FALSE;
BEGIN
  V_VARIABLE := V_VARIABLE AND TRUE;
  
  --Evaluamos el valor de V_VARIABLE,
  -- en imprimimos un texto indicando el valor que almacena
  IF V_VARIABLE = TRUE THEN
    DBMS_OUTPUT.PUT_LINE('V_VARIABLE vale TRUE');
  ELSIF V_VARIABLE = FALSE THEN
    DBMS_OUTPUT.PUT_LINE('V_VARIABLE vale FALSE');
  ELSIF V_VARIABLE IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('V_VARIABLE vale NULL');
  END IF;
END;
V_VARIABLE vale FALSE

El valor NULL, es un valor especial, éste indica que la variable no tiene asignado ningún valor, es algo así como vacío. Todas las variables que no se les asigna un valor al momento de ser declaradas tiene como valor por defecto a NULL:

DECLARE
  V_VARIABLE BOOLEAN;
BEGIN
  V_VARIABLE := V_VARIABLE AND TRUE;
  
  --Para éste caso el valor de V_VARIABLE será NULL
  --debido a que : NULL AND TRUE es igual a NULL
  IF V_VARIABLE = TRUE THEN
    DBMS_OUTPUT.PUT_LINE('V_VARIABLE vale TRUE');
  ELSIF V_VARIABLE = FALSE THEN
    DBMS_OUTPUT.PUT_LINE('V_VARIABLE vale FALSE');
  ELSIF V_VARIABLE IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('V_VARIABLE vale NULL');
  END IF;
END;
V_VARIABLE vale NULL

Igual que en el caso de cualquier operador, en los operadores lógicos se pueden utilizar los paréntesis para indicar al motor PL/SQL el orden en el que debe evaluar los operadores:

DECLARE
  V_X BOOLEAN := FALSE;
  V_Y BOOLEAN := FALSE;
  V_VARIABLE  BOOLEAN;
  -- Procedimiento para saber el valor de la variable
  -- booleana
  PROCEDURE IMPRIMIR_VARIABLE(V_VARI BOOLEAN)
  IS
  BEGIN
    IF V_VARI = TRUE THEN
      DBMS_OUTPUT.PUT_LINE('V_VARI vale TRUE');
    ELSIF V_VARI = FALSE THEN
      DBMS_OUTPUT.PUT_LINE('V_VARI vale FALSE');
    ELSIF V_VARI IS NULL THEN
      DBMS_OUTPUT.PUT_LINE('V_VARI vale NULL');
    END IF;
  END IMPRIMIR_VARIABLE;
BEGIN
  --El orden de evaluación será:
  -- Primero los AND
  -- Seguido de los OR, resultado FALSE
  -- Finalmente los NOT
  V_VARIABLE := NOT V_Y AND V_X;
  IMPRIMIR_VARIABLE(V_VARIABLE);
  -- Podemos cambiar el orden de precedencia usando
  -- paréntesis
  V_VARIABLE := NOT (V_X AND V_X);
  IMPRIMIR_VARIABLE(V_VARIABLE);  
END;
V_VARI vale FALSE
V_VARI vale TRUE

Operadores aritméticos

Al igual que en la mayoria de lenguajes de programación,  en PL/SQL se pueden hacer uso de los operadores aritméticos, entre los cuales tenemos:

Operadores aritméticos
OperadorDescripciónEJemplo
+Operador de suma, permite realizar una sumatoria entre 2 variables o constantes.2 +2
-Operador de resta, permite realizar una resta entre 2 variables o constantes.6 - 2
*Operador de multiplicación, permite realizar una multiplicación entre 2 variables o constantes.7 * 8
/Operador de división, permite realizar una división entre 2 variables o constantes.9 / 10
**Operador de exponenciación, eleva un numero a la potencia indicada.2 ** 3

En el siguiente bloque de código podemos ver un ejemplo de cada operación aritmética:

DECLARE
v_a       NUMBER :=10;
v_b       NUMBER :=20;
resultado NUMBER;
BEGIN
resultado := v_a +v_b;
DBMS_OUTPUT.PUT_LINE('Resultado de suma: ' || resultado);

resultado := v_a - v_b;
DBMS_OUTPUT.PUT_LINE('Resultado de resta: ' || resultado);

resultado := v_a *v_b;
DBMS_OUTPUT.PUT_LINE('Resultado de multiplicación: ' || resultado);

resultado := v_a / v_b;
DBMS_OUTPUT.PUT_LINE('Resultado de división: ' || resultado);
END;

A pesar de que los operadores han sido usados para manejar datos de variables, se puede realizar lo mismo con constantes:

DECLARE
resultado NUMBER;
BEGIN
resultado := 10 +20;
DBMS_OUTPUT.PUT_LINE('Resultado de suma: ' || resultado);

resultado := 10 - 20;
DBMS_OUTPUT.PUT_LINE('Resultado de resta: ' || resultado);

resultado := 10 *20;
DBMS_OUTPUT.PUT_LINE('Resultado de multiplicación: ' || resultado);

resultado := 10 / 20;
DBMS_OUTPUT.PUT_LINE('Resultado de división: ' || resultado);
END;

Y también puedes ahorrarte la variable resultado:

BEGIN
DBMS_OUTPUT.PUT_LINE('Resultado de suma: ' || (10 +20));

DBMS_OUTPUT.PUT_LINE('Resultado de resta: ' || (10 -20));

DBMS_OUTPUT.PUT_LINE('Resultado de multiplicación: ' || (10 *20));

DBMS_OUTPUT.PUT_LINE('Resultado de división: ' || (10 /20));
END;
Tecnologias: 
Tipo de Recurso: