首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Oracle 11gR2中使用条件进行多个更新

在Oracle 11gR2中使用条件进行多个更新
EN

Stack Overflow用户
提问于 2015-12-02 14:06:28
回答 2查看 57关注 0票数 2

我一直在尝试在Oracle11gR2中创建过程,它所做的就是根据输入动态地对特定表执行更新。用户可以更新表的四个属性中的任何一个或全部。下面的代码成功地满足了要求。

代码语言:javascript
复制
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');

示例输出:

代码语言:javascript
复制
anonymous block completed
Welcome to the system bh104

anonymous block completed
Present Address updated Successfully
Present Marital Status updated Successfully

有没有更好的方法来优化这个过程?我希望尽可能地优化这个过程,以便尽可能减少比较的数量,并减少update语句的数量,以提高性能。因此,我需要改进这段代码的建议。

EN

回答 2

Stack Overflow用户

发布于 2015-12-02 14:17:19

尝尝这个。您的方法效率不高,如果它们都不为空,那么您将触发4个update语句。此外,它还必须在sql引擎和pl/sql引擎之间执行4次上下文切换。您可以使用通用的dbms_output语句来说明更新成功。但将dbms_output作为包的一部分并不是一种好的做法。

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2015-12-02 14:21:38

您的方法效率低下,因为您正在进行4次更新。

您可以在单个UPDATE语句中使用NVL完成此操作。

代码语言:javascript
复制
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参数

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34035957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档