Pregunta Funciones vs procedimientos en Oracle


¿Alguien puede explicar cuál es la principal diferencia entre funciones y procedimientos en Oracle? ¿Por qué debo usar procedimientos si puedo hacer todo con las funciones?

  1. Si no puedo llamar al procedimiento en la declaración SQL, vale, escribiré una función para hacer el mismo trabajo.
  2. Los procedimientos no devuelven valores, vale, devolveré solo sql% rowcount o 1 (éxito), 0 (excepción) después de cualquier operación dml
  3. Tanto los procedimientos como las funciones pueden pasar variables al entorno de llamada a través de los parámetros OUT / IN OUT

Escuché que la principal diferencia está en el rendimiento, "los procedimientos son más rápidos que las funciones". Pero sin ningún detalle.

Gracias por adelantado.


35
2017-08-21 06:32


origen


Respuestas:


La diferencia es: una función debe devolver un valor (de cualquier tipo) por definición predeterminada, mientras que en el caso de un procedimiento, debe usar parámetros como OUT o IN OUT parámetros para obtener los resultados. Puedes usar una función en una normal SQL donde como no puede usar un procedimiento en SQL declaraciones.

Algunas diferencias entre funciones y procedimientos

  1. Una función siempre devuelve un valor utilizando la declaración de devolución, mientras que un procedimiento puede devolver uno o más valores a través de parámetros o puede que no regrese en absoluto. Aunque, OUT los parámetros todavía se pueden usar en las funciones, no son aconsejables y tampoco hay casos en que uno pueda encontrar la necesidad de hacerlo. Utilizando OUT parámetro restringe el uso de una función en una instrucción SQL.

  2. Las funciones se pueden usar en sentencias SQL típicas, como SELECT, INSERT, UPDATE, DELETE, MERGE, mientras que los procedimientos no pueden.

  3. Las funciones se usan normalmente para cálculos donde los procedimientos se usan normalmente para ejecutar la lógica comercial.

  4. Oracle proporciona la provisión de crear "Índices basados ​​en funciones"para mejorar el rendimiento de la declaración SQL subsiguiente. Esto se aplica cuando se realiza la función en una columna indexada en la cláusula where de una consulta.

Más información sobre funciones vs. Procedimientos aquí y aquí.


38
2017-08-21 06:36



Casi nunca hay una diferencia de rendimiento entre los procedimientos y las funciones.

En algunos casos extremadamente raros:

  • Un procedimiento IN OUT el argumento es más rápido que un retorno de función, cuando está habilitado el en línea.
  • Un procedimiento IN OUT argumento es más lento que un retorno de función, cuando la línea está deshabilitada.

Código de prueba

--Run one of these to set optimization level:
--alter session set plsql_optimize_level=0;
--alter session set plsql_optimize_level=1;
--alter session set plsql_optimize_level=2;
--alter session set plsql_optimize_level=3;

--Run this to compare times.  Move the comment to enable the procedure or the function.
declare
    v_result varchar2(4000);

    procedure test_procedure(p_result in out varchar2) is
    begin
        p_result := '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
    end;

    function test_function return varchar2 is
    begin
        return '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
    end;
begin
    for i in 1 .. 10000000 loop
        --Comment out one of these lines to change the test.
        --test_procedure(v_result);
        v_result := test_function;
    end loop;
end;
/

Resultados

Inlining enabled:  PLSQL_OPTIMIZE_LEVEL = 2 (default) or 3
Function  run time in seconds: 2.839, 2.933, 2.979
Procedure run time in seconds: 1.685, 1.700, 1.762

Inlining disabled: PLSQL_OPTIMIZE_LEVEL = 0 or 1
Function  run time in seconds:  5.164, 4.967, 5.632
Procedure run time in seconds: 6.1, 6.006, 6.037

El código anterior es trivial y quizás esté sujeto a otras optimizaciones. Pero he visto resultados similares con el código de producción.

Por qué la diferencia no importa

No mire la prueba anterior y piense que "¡un procedimiento funciona dos veces más rápido que una función!". Sí, la sobrecarga de una función es casi el doble que la sobrecarga de un procedimiento. Pero de cualquier forma, la sobrecarga es irrelevantemente pequeña.

La clave del rendimiento de la base de datos es hacer todo el trabajo posible en sentencias de SQL, en lotes. Si un programa llama a una función o procedimiento diez millones de veces por segundo, entonces ese programa tiene serios problemas de diseño.


13
2017-12-01 19:23



Cambio de estado vs no cambio de estado

Encima de La respuesta de Romo Daneghyan, Siempre he visto la diferencia como su comportamiento en el estado del programa. Es decir, conceptualmente,

  • Los procedimientos pueden cambiar algún estado, ya sea de los parámetros o del entorno (por ejemplo, datos en tablas, etc.).
  • Las funciones no cambian de estado, y es de esperar que llamar a una función en particular no modifique ningún dato / estado. (Es decir, el concepto subyacente programación funcional)

Es decir, si llamó a una función llamada generateId(...), esperaría que solo haga algunos cálculos y devuelva un valor. Pero llamando a un procedimiento generateId ..., puede esperar que cambie los valores en algunas tablas.

Por supuesto, parece que en Oracle, así como en muchos idiomas, esto no se aplica y no se aplica, así que tal vez soy solo yo.


6
2017-08-17 07:47



  1. El procedimiento puede o no devolver el valor pero las funciones devuelven valor.

  2. procedimiento use el parámetro returnvalue purpose pero function returnstatment provide.

  3. procedimiento utilizado manipulación de datos pero función uso cálculo de datos.
  4. el tiempo de ejecución del procedimiento no utiliza la instrucción select, pero la función usa la instrucción select. Estas son las principales diferencias de eso.

2
2017-10-23 11:45



Creo que la mayor diferencia es:

Las funciones no pueden contener DML Statemnt mientras que los procedimientos sí pueden. por ejemplo, como Actualizar e Insertar.

si estoy equivocado, corrígeme


-2
2017-12-18 13:31



Como sé, el procedimiento Store se compila una vez y se puede llamar una y otra vez sin compilar de nuevo. Pero la función se compila cada vez que se llama. Por lo tanto, el procedimiento de almacenamiento mejora el rendimiento de la función.


-4
2017-12-01 15:01