Dans ce didacticiel, je donne un exemple de programme Oracle PL/SQL pour démontrer Dynamic SQL à l'aide de l'instruction EXECUTE IMMEDIATE.
Exemple SQL dynamique Oracle PL/SQL EXECUTE IMMEDIATE
La procédure PL/SQL suivante mettra à jour l'enregistrement dans la table Employés pour un ID d'employé si une valeur est différente de la valeur réelle.
L'instruction Update sera préparée dynamiquement à l'aide d'une chaîne, puis elle sera exécutée à l'aide de l'instruction EXECUTE IMMEDIATE. L'instruction SQL ne sera faite que pour les paramètres passés et ayant de nouvelles valeurs.
Par exemple, si vous souhaitez mettre à jour le prénom et le salaire de l'employé, puis transmettez les valeurs des paramètres i_id, first_name et i_salary, le paramètre rest peut être nul. La déclaration de mise à jour sera générée pour ces colonnes uniquement.
CREATE OR REPLACE PROCEDURE update_emp_rec ( i_id IN employees.employee_id%TYPE, i_first IN employees.first_name%TYPE, i_last IN employees.last_name%TYPE, i_email IN employees.email%TYPE, i_phone IN employees.phone_number%TYPE, i_job IN employees.job_id%TYPE, i_salary IN employees.salary%TYPE, i_commission_pct IN employees.commission_pct%TYPE, i_manager_id IN employees.manager_id%TYPE, i_department_id IN employees.department_id%TYPE) AS emp_upd_rec employees%ROWTYPE; sql_string VARCHAR2 (1000); set_count NUMBER := 0; BEGIN SELECT * INTO emp_upd_rec FROM employees WHERE employee_id = i_id; sql_string := 'UPDATE EMPLOYEES SET '; IF i_first != emp_upd_rec.first_name THEN IF set_count > 0 THEN sql_string := sql_string || ', FIRST_NAME =''' || i_first || ''''; ELSE sql_string := sql_string || ' FIRST_NAME =''' || i_first || ''''; set_count := set_count + 1; END IF; END IF; IF i_last != emp_upd_rec.last_name THEN IF set_count > 0 THEN sql_string := sql_string || ', LAST_NAME =''' || i_last || ''''; ELSE sql_string := sql_string || ' LAST_NAME =''' || i_last || ''''; set_count := set_count + 1; END IF; END IF; IF UPPER (i_email) != emp_upd_rec.email THEN IF set_count > 0 THEN sql_string := sql_string || ', EMAIL =''' || UPPER (i_email) || ''''; ELSE sql_string := sql_string || ' EMAIL =''' || UPPER (i_email) || ''''; set_count := set_count + 1; END IF; END IF; IF UPPER (i_phone) != emp_upd_rec.phone_number THEN IF set_count > 0 THEN sql_string := sql_string || ', PHONE_NUMBER =''' || UPPER (i_phone) || ''''; ELSE sql_string := sql_string || ' PHONE_NUMBER =''' || UPPER (i_phone) || ''''; set_count := set_count + 1; END IF; END IF; IF i_job != emp_upd_rec.job_id THEN IF set_count > 0 THEN sql_string := sql_string || ', JOB_ID =''' || i_job || ''''; ELSE sql_string := sql_string || ' JOB_ID =''' || i_job || ''''; set_count := set_count + 1; END IF; END IF; IF i_salary != emp_upd_rec.salary THEN IF set_count > 0 THEN sql_string := sql_string || ', SALARY =' || i_salary; ELSE sql_string := sql_string || ' SALARY =' || i_salary; set_count := set_count + 1; END IF; END IF; IF i_commission_pct != emp_upd_rec.commission_pct THEN IF set_count > 0 THEN sql_string := sql_string || ', COMMISSION_PCT =' || i_commission_pct; ELSE sql_string := sql_string || ' COMMISSION_PCT =' || i_commission_pct; set_count := set_count + 1; END IF; END IF; IF i_manager_id != emp_upd_rec.manager_id THEN IF set_count > 0 THEN sql_string := sql_string || ', MANAGER_ID =' || i_manager_id; ELSE sql_string := sql_string || ' MANAGER_ID =' || i_manager_id; set_count := set_count + 1; END IF; END IF; IF i_department_id != emp_upd_rec.department_id THEN IF set_count > 0 THEN sql_string := sql_string || ', DEPARTMENT_ID =' || i_department_id; ELSE sql_string := sql_string || ' DEPARTMENT_ID =' || i_department_id; set_count := set_count + 1; END IF; END IF; sql_string := sql_string || ' WHERE employee_id = ' || i_id; IF set_count > 0 THEN DBMS_OUTPUT.put_Line (sql_string); EXECUTE IMMEDIATE sql_string; ELSE DBMS_OUTPUT.PUT_LINE ( 'No update needed, ' || 'all fields match original values'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('No matching employee found'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( 'Data entry error has occurred, ' || 'please check values and try again' || sql_string); END; /
Exécutez la procédure
Voici le code PL/SQL, pour exécuter la procédure ci-dessus pour mettre à jour le prénom et le salaire pour l'ID d'employé 199.
SET SERVEROUTPUT ON; DECLARE I_ID NUMBER; I_FIRST VARCHAR2 (20); I_LAST VARCHAR2 (25); I_EMAIL VARCHAR2 (25); I_PHONE VARCHAR2 (20); I_JOB VARCHAR2 (10); I_SALARY NUMBER; I_COMMISSION_PCT NUMBER; I_MANAGER_ID NUMBER; I_DEPARTMENT_ID NUMBER; BEGIN I_ID := 199; I_FIRST := 'Joseph'; I_LAST := NULL; I_EMAIL := NULL; I_PHONE := NULL; I_JOB := NULL; I_SALARY := 3099; I_COMMISSION_PCT := NULL; I_MANAGER_ID := NULL; I_DEPARTMENT_ID := NULL; UPDATE_EMP_REC (I_ID, I_FIRST, I_LAST, I_EMAIL, I_PHONE, I_JOB, I_SALARY, I_COMMISSION_PCT, I_MANAGER_ID, I_DEPARTMENT_ID); COMMIT; END; /
Sortie
UPDATE EMPLOYEES SET FIRST_NAME ='Joseph', SALARY =3099 WHERE employee_id = 199 PL/SQL procedure successfully completed.
Voir aussi :
- Comment tronquer une table dans une procédure Oracle ?
- Exemple Oracle Dynamic SQL pour insérer un enregistrement à l'aide de DBMS_SQL
- Comment imprimer 1 à 10 sans utiliser de boucle en PL/SQL ?