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:
Operador | Operación | Nivel |
---|---|---|
** | exponenciación | 1 |
+,- | identidad, negación | 2 |
*,/ | multiplicación, división | 3 |
+, -, || | suma, resta, concatenación | 4 |
=, <, >, <=, >=, <>, !=, ~=, ^=, IS NULL, LIKE, BETWEEN, IN | comparación | 5 |
NOT | negación lógica | 6 |
AND | conjunción | 7 |
OR | inclusión | 8 |
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:
x | y | x AND y | x OR y | NOT x |
---|---|---|---|---|
TRUE | TRUE | TRUE | TRUE | FALSE |
TRUE | FALSE | FALSE | TRUE | FALSE |
TRUE | NULL | NULL | TRUE | FALSE |
FALSE | TRUE | FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE | FALSE | TRUE |
FALSE | NULL | FALSE | NULL | TRUE |
NULL | TRUE | NULL | TRUE | NULL |
NULL | FALSE | FALSE | NULL | NULL |
NULL | NULL | NULL | NULL | NULL |
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:
Operador | Descripción | EJemplo |
---|---|---|
+ | 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;