我一直在尝试在Oracle11gR2中创建过程,它所做的就是根据输入动态地对特定表执行更新。用户可以更新表的四个属性中的任何一个或全部。下面的代码成功地满足了要求。
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有没有更好的方法来优化这个过程?我希望尽可能地优化这个过程,以便尽可能减少比较的数量,并减少update语句的数量,以提高性能。因此,我需要改进这段代码的建议。
发布于 2015-12-02 14:17:19
尝尝这个。您的方法效率不高,如果它们都不为空,那么您将触发4个update语句。此外,它还必须在sql引擎和pl/sql引擎之间执行4次上下文切换。您可以使用通用的dbms_output语句来说明更新成功。但将dbms_output作为包的一部分并不是一种好的做法。
IF p_pres_add IS NOT NULL OR p_marital_stat IS NOT NULL OR p_cont_ll IS NOT NULL OR p_cont_mob IS NOT NULL
THEN
UPDATE eis_employees_tb
SET emp_present_add=nvl(p_pres_add, emp_present_add),
emp_marital_status=nvl(p_marital_stat, emp_marital_status),
emp_contact_ll=nvl(p_cont_ll, emp_contact_ll),
emp_contact_mob=nvl(p_cont_mob, emp_contact_mob)
WHERE emp_id = sess.g_var_uid;
END IF;发布于 2015-12-02 14:21:38
您的方法效率低下,因为您正在进行4次更新。
您可以在单个UPDATE语句中使用NVL完成此操作。
UPDATE eis_employees_tb
SET emp_present_add = NVL(p_pres_add, emp_present_add),
emp_marital_status = NVL(p_marital_stat, emp_marital_status),
emp_contact_ll = NVL(p_cont_ll,emp_contact_ll),
emp_contact_mob = NVL(p_cont_mob , emp_contact_mob)
WHERE emp_id = sess.g_var_uid;另外,生产系统不使用DBMS_OUTPUT。如果您确实需要将输出推送到调用者,则可能需要OUT参数。
https://stackoverflow.com/questions/34035957
复制相似问题