Neste tutorial, estou dando um exemplo de programa Oracle PL/SQL para demonstrar o SQL dinâmico usando a instrução EXECUTE IMMEDIATE.
Oracle PL/SQL EXECUTE IMMEDIATE Dynamic SQL Exemplo
O procedimento PL/SQL a seguir atualizará o registro na tabela Funcionários para um ID de funcionário se um valor for diferente do valor real.
A instrução Update será preparada dinamicamente usando uma string e, em seguida, será executada usando a instrução EXECUTE IMMEDIATE. A instrução SQL será feita apenas para os parâmetros passados e com novos valores.
Por exemplo, se você deseja atualizar o first_name e o salário do funcionário, passe os valores para o parâmetro i_id, first_name e i_salary, o parâmetro rest pode ser nulo. A instrução de atualização será gerada apenas para essas colunas.
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; /
Execute o procedimento
A seguir está o código PL/SQL, para executar o procedimento acima para atualizar o first_name e o salário para o ID do funcionário 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; /
Saída
UPDATE EMPLOYEES SET FIRST_NAME ='Joseph', SALARY =3099 WHERE employee_id = 199 PL/SQL procedure successfully completed.
Veja também:
- Como truncar a tabela no procedimento Oracle?
- Exemplo de Oracle Dynamic SQL para inserir um registro usando DBMS_SQL
- Como imprimir de 1 a 10 sem usar loop em PL/SQL?