Método de optimización del rendimiento del procedimiento almacenado Oracle PLSQL

Método de optimización del rendimiento del procedimiento almacenado Oracle PLSQL

1. Causas comunes que afectan el rendimiento

1. Intente utilizar procedimientos almacenados y evite el uso de bloques anónimos PL/SQL

Una vez creado el procedimiento almacenado, Oracle realizará un análisis sintáctico sobre él y lo almacenará en la base de datos en forma compilada. Cuando el cliente lo llama, solo necesita enviar una instrucción de llamada, lo que evita que el bloque anónimo transmita una gran cantidad de código fuente en Internet y reduce el costo de la red. Se reduce la carga de comunicación y se mejora el rendimiento del programa porque solo se compila una vez cuando se crea.

2. Escriba una declaración SQL compartida

Cuando Oracle ejecuta una declaración SQL, después del primer análisis, colocará la declaración SQL en el grupo compartido ubicado en el área global del sistema SGA. Esta área de memoria puede ser compartida por todos los usuarios de la base de datos, por lo que al ejecutar una declaración SQL, por ejemplo, Cuando un cursor en una declaración PL/SQL ejecuta una declaración SQL, si Oracle detecta que es la misma que una declaración que se ha ejecutado antes, utilizará la declaración analizada y utilizará la ruta de ejecución óptima.

Cuando Oracle ejecuta una declaración SQL, siempre buscará primero la misma declaración SQL en el área de memoria compartida, pero debido a que Oracle solo almacena en caché tablas simples, no es adecuado para consultas de conexión de varias tablas.

SELECCIONAR * DE EMP;

SELECCIONAR * de EMP;

Seleccione * de Emp;

SELECCIONAR * DE EMP;

Para evitar este tipo de declaraciones SQL, al escribir declaraciones SQL, debe prestar atención al uso de convenciones de mayúsculas y minúsculas consistentes, las palabras clave, las palabras reservadas están en mayúsculas y los identificadores declarados por el usuario en minúsculas. Al diseñar sus propias convenciones de escritura y respetarlas Según estas convenciones, puede procesar Las declaraciones son consistentes con las del grupo compartido, lo que ayuda a mejorar el rendimiento de ejecución.

3. Utilice BINARY_INTEGER y PLS_INTEGER para declarar números enteros

Al declarar tipos de variables en la programación PLSQL, siempre debe usar BINARY_INTEGER y PLS_INTEGER para evitar depender demasiado del tipo de número, porque el primero proporciona un rendimiento más rápido.

4. Utilice el mensaje de compilación NOCOPY al pasar parámetros de big data en el proceso.

Al crear un procedimiento o función, el modo IN siempre pasa un puntero, mientras que OUT e IN OUT pasan una copia del valor, también conocido como paso por valor. Cuando se trata de pasar parámetros de gran capacidad, el rendimiento se reducirá seriamente. En este momento, debe considerar usar la sugerencia de compilación NOCOPY para pasar parámetros por referencia. Cuanto mayor sea el tamaño del parámetro, más obvio será el efecto. Por ejemplo, supongamos que un procedimiento tiene un tipo IN OUT
Los parámetros se pasan por valor de forma predeterminada. El siguiente ejemplo demuestra cómo llamar a este proceso varias veces y pasar un parámetro de tabla de índice grande. Si no se utiliza NOCOPY, el rendimiento se reducirá seriamente.

Utilice NOCOPY para mejorar el rendimiento

declare
type test_tb1 is table of pls_integer index by pls_integer;  --定义索引表类型
test_tb1 test_tb1_type;   --定义索引表类型的变量
--定义内嵌子程序,在IN OUT 参数中使用NOCOPY提示来按引用传递
procedure test (arg_cnt in pls_integer,arg_tb1 in out nocopy test_tb1_type)
is
begin
for cnt_test in test_tb1.first .. arg_tb1.last --依循环索引表
loop
arg_tb1 (cnt_test):=arg_tb1 (cnt_test) + arg_cnt;
end loop;	--为形式参数表赋值
end;
begin
for cnt in 0 .. 10000
loop
test_tb1 (cnt) := cnt;
end loop;
for cnt in 0 .. 10000
loop
test (cnt,test_tb1);
end loop;
end;

5. Utilice la devolución para obtener el valor de retorno.

Cuando use declaraciones DML para procesar datos de filas de objetos, si desea obtener el valor de retorno de la fila, siempre debe usar la cláusula de devolución para reducir la cantidad de ejecuciones de SQL y mejorar la eficiencia de la ejecución:

insertar en... valor (...) devolver col1 a :col1;
actualizar... configurar... devolver col1 a :col1;
eliminar... devolver col1 a :col1;
Al utilizar return, no solo puede devolver datos de varias columnas, sino también devolver datos y guardarlos. a matrices y otros tipos de datos.Medio:
devolver col1, col2 a :col1, :col2;
devolver col1 a :col1_array;

6. Evite el uso de sentencias SQL dinámicas

Aunque las declaraciones de SQL dinámico brindan comodidad de programación, el uso excesivo de declaraciones de SQL dinámico reducirá seriamente el rendimiento de las aplicaciones PLSQL, por lo que, si es necesario, siempre debe considerar el uso de declaraciones de SQL estático. Si tiene que usar declaraciones SQL dinámicas, siempre debe optar por usar declaraciones SQL dinámicas locales, es decir, ejecutar inmediatamente o abrir para en lugar de usar dbms_sql, porque dbms_sql no solo es más complicado de escribir código, sino que también tiene un rendimiento más pobre que declaraciones SQL dinámicas locales.

7. Intente utilizar el procesamiento por lotes a granel

Si la operación involucra una gran cantidad de datos, puede mejorar el rendimiento procesando una gran cantidad de datos a la vez. Por ejemplo, puede colocar los datos en tablas de índice, tablas anidadas y matrices de longitud variable, y usar declaraciones de procesamiento por lotes. como la recopilación forall o masiva en. , procesa grandes cantidades de datos a la vez y mejora el rendimiento.

Utilice la instrucción de recopilación masiva en para insertar todos los datos de la tabla emp en las variables de la tabla de índice a la vez. Cuando la cantidad de datos es particularmente grande, puede mejorar significativamente el rendimiento.

Obtenga todos los datos a la vez mediante el procesamiento por lotes

declare
type emp_tb1 is table of emp%ROWTYPE index by pls_integer; --定义索引表类型
        emp_tb1	emp_tb1_type;
cursor	emp_cur
is
select * from emp;
begin
open emp_cur;
fetch emp_cur
bulk collect into emp_tb1;
close emp_cur;
end;

Al utilizar la cláusula de recopilación masiva en, todos los datos del cursor se extraen en variables de la tabla de índice al mismo tiempo, lo que mejora el rendimiento de ejecución del programa y ahorra la cantidad de escritura de código. Por lo tanto, siempre que sea posible, se debe utilizar el procesamiento por lotes para completar el procesamiento de datos.

2. Utilice el paquete DBMS_PROFILER

1.Instale el paquete DBMS_PROFILER

Antes de utilizar DBMS_PROFILER, debe ingresar al sistema de base de datos como administrador para instalarlo.
conn system/manager como sysdba;
desc dbms_profiler;
si el comando desc indica que el paquete dbms_profiler no existe, debe usar el siguiente comando para instalarlo:
sql>@?/rdbms/admin/profload.sql
Ejecute desc dbms_profiler nuevamente , puede ver este paquete Contiene información de subrutina, se utilizan dos funciones principales:
start_profiler inicia el generador de perfiles
stop_profiler detiene el perfil

2. Configure la solución de generación de perfiles.

Cree un usuario para almacenar información de seguimiento y sinónimos de tablas relacionadas con el generador de perfiles:

crear perfilador de usuario identificado por 123456;
otorgar conexión, recurso al generador de perfiles;
crear un sinónimo público plsql_profiler_runs para perfiler.plsql_profiler_runs;
crear un sinónimo público plsql_profiler_units para perfiler.plsql_profiler_units;
crear un sinónimo público plsql_profiler_data para perfiler.plsql_profiler_data;
crear un sinónimo público plsql_profiler_runnumber para perfiler.plsql_profiler_runnumber;

3. Configurar la tabla de perfilador

perfilador de conexión/123456

@?/rdbms/admin/proftab.sql

otorgar selección en plsql_profile_runnumber al público;
otorgar selección, insertar, actualizar, eliminar en plsql_profiler_data al público;
otorgar selección, insertar, actualizar, eliminar en plsql_profiler_units al público;
otorgar selección, insertar, actualizar, eliminar en plsql_profiler_runs al público;
plsql_profile_runnumber guardó el generador de perfiles. información de ejecución
plsql_profiler_data guarda la información del perfilador de cada unidad
plsql_profiler_units guarda los datos detallados de cada unidad
plsql_profiler_runs se utiliza para generar la secuencia del número de ejecución único del perfilador.

4. Ejecute Profiler para obtener información de configuración.

Después de crear el proceso, puede utilizar el generador de perfiles para instrumentar el código del programa.
Crear un proceso para ser probado.

create table pro_tst_table (a int);
create or replace procedure sp_test
as
begin
for i in 1 .. 10000
loop
insert into pro_tst_table values(i);
end loop;
commit;
end;

Utilice dbms_profiler para probar paquetes

declare
v_run_number	integer;
v_temp1	integer;
begin
--启动profiler
sys.DBMS_PROFILER.start_profiler(run_number => v_run_number);
--显示当前跟踪的运行序号(后面查询要用)
dbms_output.put_line('run_number:'||v_run_number);
--运行要跟踪的PLSQL
sp_test;
--停止profiler
sys.DBMS_PROFILER.stop_profiler;
end;

5. Consulta el generador de perfiles para obtener resultados

Para utilizar declaraciones SQL para consultar la información de esta ejecución, primero puede consultar plsql_profiler_runs para obtener la información básica de esta ejecución:
seleccione runid, run_owner, run_date, run_total_time de plsql_profiler_runs;
el autor ejecutó el código dos veces, por lo que hay dos registros runid , ID El valor se genera a través del número de serie, y el valor máximo de ID indica la ejecución más reciente.
RUN_TOTAL_TIME indica el tiempo de ejecución. Puede ver que el tiempo de las dos ejecuciones es significativamente diferente. La
información de la unidad de este perfil puede ser obtenido consultando la tabla plsql_profiler_units.
Al consultar la tabla plsql_profiler_data, puede obtener información estadística para cada fila del procedimiento almacenado ejecutado en función del número de fila y el número de unidad.

3. Utilice el paquete DBMS_TRACE

Por ejemplo, si ve el orden de ejecución de las subrutinas, puede usar el paquete DBMS_TRACE. El uso de este paquete es similar al uso de DBMS_PROFILER. Una diferencia importante es que dbms_trace puede configurar los eventos que deben rastrearse: llamadas, excepciones, SQL e incluso los posibles eventos de cada código PLSQL. Con la ayuda de esta información, se pueden localizar muy rápidamente anomalías en el proceso del programa en segundo plano.

Hay dos funciones en el paquete:

set_plsql_trace: habilita la recopilación de estadísticas de seguimiento.

clear_plsql_trace: detiene la recopilación de estadísticas de seguimiento

1. Configurar y utilizar DBMS_TRACE

Antes de usarlo, debe configurar las tablas de datos utilizadas por dbms_trace y permitir que todos los usuarios escriban datos en estas tablas.

sistema de conexión/administrador como sysdba

@?/rdbms/admin/tracetab.sql

El script crea dos tablas y una secuencia.

Tabla plsql_trace_runs: se utiliza para registrar la información de cada seguimiento.

Tabla plsql_trace_events: utilizada para registrar datos detallados de todos los seguimientos

secuencia plsql_trace_runnumber: secuencia utilizada para generar números de ejecución únicos.

2. Después de crear con éxito las tablas requeridas, debe crear sinónimos para las tablas correspondientes y asignarles permisos accesibles para que los usuarios con el rol público puedan operar en las tablas correspondientes.

crear o reemplazar el sinónimo público plsql_trace_runs para sys.plsql_trace_runs;

crear o reemplazar el sinónimo público plsql_trace_events para sys.plsql_trace_events;

crear o reemplazar el sinónimo público plsql_trace_runnumber para sys.plsql_trace_runnumber;

otorgar selección, inserción, actualización y eliminación en plsql_trace_events al público;

otorgar selección, inserción, actualización, eliminación en plsql_trace_runs al público;

otorgar selección en plsql_trace_runnumber al público;

Crear programa de prueba dbms_trace

create or replace procedure do_something (p_times in number)
as
1_dummy	number;
begin
for i in 1 .. p_times
loop
select 1_dummy + 1 into 1_dummy from dual;
end loop;
end;

Usando el programa de rastreo dbms_trace

declare
1_result binary_integer;
begin
--跟踪所有的调用
dbms_trace.set_plsql_trace(dbms_trace.trace_all_calls);
do_something(100);
--停止PLSQL跟踪
dbms_trace.clear_plsql_trace;
--跟踪所有的sql语句
dbms_trace.set_plsql_trace(dbms_trace.trace_all_sql);
do_something(100);
--停止跟踪
dbms_trace.clear_plsql_trace;
--跟踪所有行数据
dbms_trace.set_plsql_trace(dbms_trace.trace_all_lines);
do_something(100);
dbms_trace.clear_plsql_trace;
end;

Para cada llamada, set_plsql_trace se usa primero para iniciar el proceso de seguimiento. El parámetro DBMS_TRACE_trace_all_calls de este proceso es una constante especificada para rastrear la llamada o el valor de retorno.

La especificación del paquete DBMS_TRACE contiene una lista de constantes disponibles para set_plsql_trace y una explicación detallada.

Obtenga la información de cada seguimiento consultando la tabla plsql_trace_runs.

4. Habilidades de optimización del rendimiento de PLSQL.

Cuando la base de datos Oracle ejecuta una declaración SQL, el optimizador de Oracle determinará la ruta de ejecución de la declaración SQL de acuerdo con ciertas reglas para garantizar que la declaración SQL se pueda ejecutar con un rendimiento óptimo. Para ejecutar la declaración SQL en el sistema de base de datos Oracle, Es posible que Oracle necesite implementar múltiples Cada uno de estos pasos puede ser recuperar físicamente filas de datos de la base de datos o preparar las filas de datos de alguna manera para que las utilice el usuario que escribe la instrucción SQL. La combinación de estos pasos utilizada por Oracle para ejecutar la declaración se llama plan de ejecución.

Oracle sigue 4 pasos al ejecutar una declaración SQL:

Analizar declaraciones SQL: consulta principalmente las mismas declaraciones SQL en el grupo compartido para verificar la seguridad y la sintaxis y semántica de SQL.

Creación de planes de ejecución y ejecución: incluida la creación de planes de ejecución para declaraciones SQL y la adquisición real de datos de tablas.

Mostrar el conjunto de resultados: realiza toda la clasificación, conversión y reformateo necesarios de los datos de campo.

Convertir datos de campo: reformatee y convierta campos que se han convertido mediante funciones integradas.

Verifique el plan de ejecución de la declaración SQL. Por ejemplo, algunas herramientas de terceros deben ejecutar primero el script utlxplan.sql para crear la tabla explica_plan.

@?/rdbms/admin/utlxplan.sql

configure el seguimiento automático en la explicación: ejecute sql y solo muestre el plan de ejecución

establecer seguimiento automático en estadísticas: ejecutar sql y solo mostrar estadísticas de ejecución

configure el seguimiento automático en: ejecute sql y muestre el plan de ejecución e información estadística, sin resultados de ejecución

configurar autotrace traceonly: solo muestra el plan de ejecución y la información estadística, no hay resultados de ejecución

desactivar el seguimiento automático: desactivar el plan de visualización de seguimiento y las estadísticas

establecer seguimiento automático en explicar

formato de nombre de columna a20;

seleccione empno,ename de emp donde empno=7369;

5. Comprender el plan de ejecución

1. Exploración completa de la tabla: este método leerá todos los registros de la tabla y leerá cada bloque de datos secuencialmente hasta la marca final. Para una tabla de datos grande, el uso de una exploración completa de la tabla reducirá el rendimiento, pero en algunas ocasiones, por ejemplo, cuando La proporción de los resultados de la consulta con respecto al volumen de datos de toda la tabla es relativamente alta, el escaneo completo de la tabla es un método mejor que la selección de índice.

2. Obtener a través del valor ROWID: el ID de fila de la fila indica el archivo de datos donde se encuentra la fila, el bloque de datos y la posición de la fila en el bloque. Por lo tanto, acceder a los datos a través de ID de fila puede ubicar rápidamente los datos de destino, que es una sola fila a la que accede Oracle. La forma más rápida de acceder a los datos.

3. Escaneo de índice: primero encuentre el valor de ID de fila del objeto a través del índice y luego busque los datos específicos directamente de la tabla a través del valor de ID de fila, lo que puede mejorar en gran medida la eficiencia de la búsqueda.

6. Orden de la tabla para consultas de unión

De forma predeterminada, el optimizador utilizará el método de optimización all_rows, que es el CBO del optimizador basado en costos para generar un plan de ejecución. El método CBO generará un plan de ejecución basado en información estadística.

La información estadística proporciona el tamaño de la tabla, el número de filas, la longitud de cada fila y otra información. Esta información estadística no está inicialmente disponible en la biblioteca. Fueron descubiertas después de hacer un análisis. Muchas veces la información estadística caducada causará El optimizador comete un error en el plan de ejecución, por lo que esta información debe actualizarse de manera oportuna.

En el modo CBO, al realizar una consulta de unión en varias tablas, el analizador de Oracle procesará los nombres de las tablas en la cláusula from en orden de derecha a izquierda. Por ejemplo:

seleccione a.empno,a.ename,c.deptno,c.dname,a.log_action de emp_log a,emp b,dept c

Durante la ejecución, Oracle primero consultará la tabla de departamento y utilizará las filas consultadas en la tabla de departamento como fuente de datos para conectarse en serie a la tabla emp para continuar la ejecución. Por lo tanto, la tabla de departamento también se denomina tabla base o tabla de controlador. . Porque el orden de las conexiones tiene un gran impacto en la eficiencia de las consultas. Por lo tanto, al procesar conexiones de varias tablas, debe elegir una tabla con menos registros como tabla base, y Oracle utilizará la clasificación y la combinación para conectarse. Por ejemplo, primero escanee la tabla del departamento, luego ordene la tabla del departamento, luego escanee la tabla emp y finalmente combine todos los registros recuperados con los registros de la primera tabla.

Si hay más de 3 tablas conectadas a la consulta, debe seleccionar la tabla cruzada como tabla base. La tabla cruzada se refiere a la tabla a la que hacen referencia otras tablas. Dado que emp_log es una tabla cruzada entre las tablas depto y emp, contiene el contenido de ambas.

seleccione a.empno,a.ename,c.deptno,c.dname,a.log_action de emp b,dept c,emp_log a;

7. Especifique la secuencia de las condiciones donde

Al consultar una tabla, el orden de las condiciones en la cláusula donde a menudo afecta el rendimiento de la ejecución. De forma predeterminada, Oracle analiza las cláusulas Where en orden ascendente. Por lo tanto, al procesar consultas de varias tablas, las conexiones entre tablas deben escribirse antes que otras condiciones Where, pero las condiciones para filtrar registros de datos deben escribirse antes de Where al final de la cláusula. para que la conexión pueda procesarse después de filtrar los datos, lo que puede mejorar el rendimiento de la declaración SQL.

Evite el uso del símbolo *

8. Utilice la función de decodificación.

Por ejemplo, para contar el número y el resumen de salario de los empleados con el departamento número 20 y el departamento número 30 en la tabla emp, si no usa decodificación, debe usar dos declaraciones SQL.

seleccione contar ( ), SUMA (sal) de emp donde deptno = 20;
union
select count(
),SUM(sal) from emp donde deptno=30;

Arriba se realizaron dos escaneos completos de la tabla

A través de la declaración de decodificación, se puede obtener el mismo resultado en una consulta SQL y las dos filas de resultados se muestran como una sola fila.

seleccione recuento (decodificar (deptno, 20, 'X', NULL)) dept20_count,
recuento (decodificar (deptno, 30, 'X', NULL)) dept30_count,
SUM (decodificar (deptno, 20, sal, NULL)) dept20_sal
suma (decodificar (deptno,30,sal,NULL)) dept30_sal from emp;

Arriba solo se realizó un escaneo completo de la tabla

Al usar de manera flexible la función de decodificación, puede obtener muchos resultados inesperados, como usar la función de decodificar en una cláusula agrupar por u ordenar por, o anidar otro bloque de decodificación dentro de un bloque de decodificación.

9. Utilice donde en lugar de tener

Tanto la cláusula donde como la cláusula have pueden filtrar datos, pero la cláusula donde no puede usar funciones agregadas, como la suma promedio mínima mínima y otras funciones.

ejemplo:

seleccione empno,deptno,sum(sal) del grupo emp por empno,deptno
que tenga suma(sal) > 1000 y deptno en (20,30);

En la cláusula have, se filtran los registros con números de departamento 20 o 30. De hecho, esto hará que la consulta recupere los registros de empleados de todos los departamentos, realice cálculos de agrupación y finalmente filtre los registros de los departamentos 20 y 30 según en los resultados de la agrupación. Esto es muy ineficiente. Un buen algoritmo es usar primero la cláusula dónde para recuperar los registros con los números de departamento 20 y 30, y luego filtrarlos.

seleccione empno,deptno,sum(sal) de emp donde deptno en (20,30)
agrupe por empno,deptno que tenga suma (sal) > 1000;

10. Utilice UNION en lugar de OR

Si las dos columnas a las que se les aplicará OR son columnas de índice, puede considerar usar unión para mejorar el rendimiento.

Ejemplo: por ejemplo, en la tabla emp, se crean columnas de índice tanto para empno como para ename. Cuando necesite realizar una consulta de operación OR entre empno y ename, puede considerar cambiar estas dos consultas a unión para mejorar el rendimiento.

seleccione empno,ename,trabajo,sal de emp donde empno > 7500 O ename COMO 'S%';

11. Utilice UNIÓN

seleccione empno,ename,trabajo,sal de emp donde empno > 7500
UNION
seleccione empno,ename,trabajo,sal de emp donde ename LIKE 'S%';

Pero este método garantiza que ambas columnas sean columnas de índice.

Si insiste en usar la declaración OR, debe recordar escribir la columna de índice con la menor cantidad de registros devueltos al frente tanto como sea posible para lograr un mejor rendimiento. Por ejemplo, empno > 7500 devuelve menos registros que la consulta para ename, por lo que en la declaración OR Ponlo al frente te dará un mejor rendimiento. Otra sugerencia es considerar el uso de IN en su lugar al realizar cálculos OR en valores de un solo campo.

Por ejemplo el siguiente

seleccione empno,ename,job,sal from emp donde deptno=20 OR deptno=30;

12. Existe uso en lugar de IN

Por ejemplo, para consultar la lista de todos los empleados ubicados en Chicago, puede considerar usar IN

seleccione * de emp donde deptno IN (
seleccione deptno de departamento donde loc='CHICAGO');

Reemplazar con

seleccione * de emp donde existe (
seleccione deptno de departamento donde loc='CHICAGO');

La misma página de reemplazo ocurre entre no en y no existe. La cláusula no en realizará una clasificación y fusión interna. De hecho, realiza un escaneo completo de la tabla en la subconsulta, por lo que la eficiencia es baja. Cuando es necesario uso En el caso de NOT IN, Yingai siempre considera cambiarlo a una conexión externa o NOT EXISTS.

seleccione * de emp donde deptono NO EN (
seleccione depto de departamento donde loc='CHICAGO');

Para mejorar el rendimiento, puede utilizar la consulta de unión

seleccione a.* de emp a,dept b donde a.deptno=b.deptno y b.loc <> 'CHICAGO';

más eficiente

seleccione a.* de emp a donde NO EXISTE (
seleccione 1 del departamento b donde a.deptno =b.deptno y loc='CHICAGO');

13. Evite declaraciones de control de procesos PL/SQL ineficientes

PLSQL utiliza el método de cálculo de ruta corta al procesar valores de expresiones lógicas.

declare
v_sal	number:=&sal;
v_job	varchar2(20):=&job;
begin
if (v_sal > 5000 ) OR (v_job = '销售')
then
dbms_output.put_line('符合匹配的OR条件');
end if;
end;

Primero, se juzga la primera condición. Si v_sal es mayor que 5000, no se juzgará la condición v_job. El uso flexible de este método de cálculo de cortocircuito puede mejorar el rendimiento. Siempre debe colocar primero las sentencias de juicio de menor costo, de modo que cuando falle la sentencia anterior, las sentencias posteriores de mayor costo no se ejecuten, lo que puede mejorar el rendimiento de las aplicaciones PL/SQL.

Por ejemplo, para el operador lógico y, el resultado es verdadero sólo si las operaciones en los lados izquierdo y derecho son verdaderas. Si la primera operación del resultado anterior es falsa, no se realizará la segunda operación.

declare
v_sal	number:=&sal;
v_job	varchar2(20):=&job;
begin
if (check_sal(v_sal) > 5000) AND (v_job = '销售') --判断执行条件
then
dbms_output.put_line('符合匹配的and条件');
end if;
end;

Este código tiene un riesgo de rendimiento. check_sal implica algunas comprobaciones de lógica empresarial. Si se llama primero a la función check_sal, esta función siempre se llamará. Por lo tanto, por consideraciones de rendimiento, el juicio de v_job siempre debe colocarse antes y después de la declaración.

declare
v_sal	number:=&sal;
v_job	varchar2(20):=&job;
begin
if (v_job='销售') and (check_sal(v_sal) > 5000)
then
dbms_output.put_line('符合匹配的and条件');
end if;
end;

Evite conversiones de tipos implícitas

Supongo que te gusta

Origin blog.csdn.net/qq_38696286/article/details/119213244
Recomendado
Clasificación