Procedimientos CONTRA funciones
Los procedimientos son tradicionalmente el workhorse del mundo de la codificación y las funciones son tradicionalmente los pedazos más pequeños, más específicos del código. Generalmente si necesitas poner al día la carta de cuentas, escribirías un procedimiento. Si necesitas recuperar el código de la organización para una cuenta particular de GL, escribirías una función.
Aquí están algunas más diferencias entre un procedimiento y una función:
- Una función DEBE volver un valor
- Un procedimiento no puede volver un valor
- Los procedimientos y las funciones pueden ambos datos de vuelta en IN y IN OUT parámetros
- La declaración de vuelta en una función vuelve control al programa que llama y vuelve los resultados de la función
- La declaración de vuelta de un procedimiento vuelve control al programa que llama y no puede volver un valor
- Las funciones se pueden llamar de SQL, procedimiento no pueden
- Las funciones se consideran las expresiones, procedimiento no son
Parámetros
Los programas nombrados de PL/SQL (los procedimientos y las funciones) pueden tomar parámetros. Los parámetros se nombran las variables que están disponibles para un programa y que modifican comportamiento y/o datos del programa. Los parámetros son opcionales en procedimientos y funciones.
Se declaran los parámetros cuando un procedimiento o una función se declara y se declara entre paréntesis abiertos y cercanos (()).
Los parámetros pueden ser nombrados cualquier cosa que sigue Oracle que nombra estándares. Guardarlos bajo 30 caracteres, no deben comenzar con una letra y contener ningún espacio. Las reglas allí adicionales pero ésas son las que se violan lo más comúnmente posible.
Hay tres tipos de parámetro: IN, OUT y IN OUT.
IN parámetro se utiliza una entrada solamente. IN parámetro no puede ser cambiado por el programa llamado.
Un parámetro de la OUT es inicialmente NULL. El programa asigna a parámetro un valor y ese valor se vuelve al programa que llama.
IN OUT parámetro puede o no puede tener un valor inicial. Ese valor inicial se puede o no se puede modificar por el programa llamado. Cualquier cambio realizado al parámetro se vuelve al programa que llama.
Los parámetros se declaran con los tipos de datos pero sin el tipo de datos longitud o precisión. Eso significa que un parámetro se puede declarar como VARCHAR2 pero no será declarado con un componente de la longitud (VARCHAR2 (30) no sería válido).
Los parámetros se pueden también asignar un valor prefijado. Puedes o utilizar al operador de asignación (: =) o utilizar la palabra clave del DEFAULT. Cuando un parámetro tiene un valor prefijado, no necesitas incluir ese parámetro en la llamada. DEBES incluir siempre IN OUT y OUT los parámetros.
Declaraciones del parámetro de la muestra:
(
parameter_1 IN VARCHAR2 := 'ABC',
parameter_2 IN VARCHAR2 DEFAULT 'ABC',
parameter_3 IN OUT NUMBER,
parameters_can_be_named_anything OUT DATE
)
Referencia de parámetro
Los programas que llaman pueden referir a parámetros positionally o por la notación nombrada. Se considera una mejor práctica de referir a parámetros vía la notación nombrada. Casi nadie hace esto constantemente sin embargo (mismo incluido).
La notación posicional refiere a enumerar los parámetros por la posición que están declarados. Usando el ejemplo arriba, podríamos positionally referir a los parámetros como:
(“def”, “ghi”, v_number_variable, v_date_variable)
Para la notación nombrada, utilizarías el nombre real del parámetro. Esto es muy práctico para las listas grandes del parámetro y para esas listas del parámetro que tengan un montón de valores prefijados. Al usar la notación nombrada, los parámetros no tienen que ser enumerados en la orden del declaración.
(=> parameter_3 v_number_variable, parameter_1 => “def”, => v_date_variable v_date_variable)
Procedimientos
El procedimiento es un programa que realiza una acción y no vuelve un valor (afuera de EN HACIA FUERA y HACIA FUERA los parámetros).
Se declara un procedimiento como:
CREATE OR REPLACE PROCEDURE
([any parameters])
AS
[declare variables]
BEGIN
[execute code]
[handle exceptions]
END;
Un ejemplo simple del procedimiento de PL/SQL:
CREATE OR REPLACE PROCEDURE my_first_proc
(p_name IN VARCHAR2 := 'Lewis',
p_address IN VARCHAR2 := '123 Mockingbird Ln',
p_an_in_out_parameter IN OUT NUMBER,
p_an_out_parameter OUT DATE )
AS
v_a_variable VARCHAR2(30);
BEGIN
IF p_name = 'Lewis'
THEN
DBMS_OUTPUT.PUT_LINE( p_name || ': ' ||
p_address );
END IF;
v_a_variable := 99;
p_an_in_out_parameter := v_a_variable;
p_an_out_parameter := SYSDATE;
END;
Llamarías este procedimiento como:
DECLARE
v_employee VARCHAR2(30) := 'BillyBob';
v_number NUMBER := 22;
v_date DATE;
BEGIN
my_first_proc(
p_name => v_employee,
p_an_in_out_parameter => v_number,
p_an_out_parameter => v_date );
DBMS_OUTPUT.PUT_LINE(
v_employee || ', ' ||
to_Char(v_number) || ', ' ||
to_char(v_date) );
my_first_proc(
p_an_in_out_parameter => v_number,
p_an_out_parameter => v_date );
DBMS_OUTPUT.PUT_LINE(
v_employee || ', ' ||
to_Char(v_number) || ', ' ||
to_char(v_date) );
END;
Funciones
La función es un programa que pudo realizar una acción y vuelve un valor.
Se declara una función como:
CREATE OR REPLACE FUNCTION
([any parameters])
RETURN
AS
[declare variables]
BEGIN
[execute code]
[handle exceptions]
RETURN [variable or expression]
END;
Podemos convertir el procedimiento antedicho a una función y hacer que vuelve la variable que declara:
CREATE OR REPLACE FUNCTION my_first_func
(p_name IN VARCHAR2 := 'Lewis',
p_address IN VARCHAR2 := '123 Mockingbird Ln',
p_an_in_out_parameter IN OUT NUMBER,
p_an_out_parameter OUT DATE )
RETURN VARCHAR2
AS
v_a_variable VARCHAR2(30);
BEGIN
IF p_name = 'Lewis'
THEN
RETURN -1;
END IF;
v_a_variable := 99;
p_an_in_out_parameter := v_a_variable;
p_an_out_parameter := SYSDATE;
RETURN v_a_variable;
END;
Llamarías esta función como:
DECLARE
v_employee VARCHAR2(30) := 'BillyBob';
v_number NUMBER := 22;
v_date DATE;
v_variable VARCHAR2(30);
BEGIN
v_variable :=
my_first_func(
p_name => v_employee,
p_an_in_out_parameter => v_number,
p_an_out_parameter => v_date );
DBMS_OUTPUT.PUT_LINE(
v_variable || ', ' ||
v_employee || ', ' ||
to_Char(v_number) || ', ' ||
to_char(v_date) );
v_variable :=
my_first_func(
p_an_in_out_parameter => v_number,
p_an_out_parameter => v_date );
DBMS_OUTPUT.PUT_LINE(
v_variable || ', ' ||
v_employee || ', ' ||
to_Char(v_number) || ', ' ||
to_char(v_date) );
END;
6 comments:
Muy interesante el artículo, lastima que la redacción es muy mala y no se entiende bien... :( :( :(
Hay alguna version en ingles del articulo?
Gracias.
Hi,
El español no es puede lengua materna. Realmente, sé muy poco español. Escribo normalmente en inglés. Puedes ver todos los éstos en inglés aquí:
http://blogs.ittoolbox.com/oracle/guide
Si no es tu lengua materna felicidades. Tienes un nivel muy aceptable de español :) voy a leer tus articulos en ingles
try this plsqlags.blogspot.com
PL SQL Basico,
Awesome. I'm glad to see it!
LewisC
puedes ayudar a una función con dos parámetros de entrada, si coloco el documento y debe decir un prefijo en el segundo parámetro debe salir bien
Post a Comment