【发布时间】:2015-12-02 06:06:27
【问题描述】:
我一直在尝试在 Oracle 11gR2 中创建过程,所做的是根据输入动态执行对特定表的更新。用户可以更新表格的四个属性中的任何一个或全部。以下代码成功实现了需求。
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE eis_mod_user_emp_dets_proc
(p_pres_add eis_employees_tb.emp_present_add%TYPE DEFAULT NULL
,p_marital_stat eis_employees_tb.emp_marital_status%TYPE DEFAULT NULL
,p_cont_ll eis_employees_tb.emp_contact_ll%TYPE DEFAULT NULL
,p_cont_mob eis_employees_tb.emp_contact_mob%TYPE DEFAULT NULL)
IS
BEGIN
IF p_pres_add IS NOT NULL THEN
UPDATE eis_employees_tb
SET emp_present_add=p_pres_add
WHERE emp_id = sess.g_var_uid;
dbms_output.put_line('Present Address updated Successfully');
END IF;
IF p_marital_stat IS NOT NULL THEN
UPDATE eis_employees_tb
SET emp_marital_status=p_marital_stat
WHERE emp_id = sess.g_var_uid;
dbms_output.put_line('Present Marital Status updated Successfully');
END IF;
IF p_cont_ll IS NOT NULL THEN
UPDATE eis_employees_tb
SET emp_contact_ll=p_cont_ll
WHERE emp_id = sess.g_var_uid;
dbms_output.put_line('Present Landline Number updated Successfully');
END IF;
IF p_cont_mob IS NOT NULL THEN
UPDATE eis_employees_tb
SET emp_contact_mob=p_cont_mob
WHERE emp_id = sess.g_var_uid;
dbms_output.put_line('Present Mobile Number updated Successfully');
END IF;
END eis_mod_user_emp_dets_proc;
/
SHOW ERROR;`
程序编译后的输出
PROCEDURE eis_mod_user_emp_dets_proc Compiled.
No Errors.
该过程的示例执行是:
EXEC global_procs_pkg.login_proc('bh104','bh104');
EXEC eis_mod_user_emp_dets_proc(p_pres_add=>'Bundelkhand');
样本输出:
anonymous block completed
Welcome to the system bh104
anonymous block completed
Present Address updated Successfully
Present Marital Status updated Successfully
有没有更好的方法来优化这个过程? 我想尽可能优化这个过程,尽可能减少比较次数,减少更新语句的数量,从而提高性能。所以我需要改进这段代码的建议。
【问题讨论】:
-
如果逻辑比示例复杂,也可以根据输入参数编写动态sql并在单个sql语句中执行。
标签: oracle performance plsql oracle11gr2