如何将值传递给oracle中的存储过程?

时间:2015-06-21 18:24:06

标签: oracle plsql system-design

我编写了一个存储过程,我正在尝试插入并更新该值。我关注的是当我执行插入时(它包含5个参数和不同的数据类型)具有不同的值并且在更新时间(它包含6个参数和不同的数据类型)具有不同的值。我想对两种情况使用单个存储过程(插入/更新)。如何管理参数?

程序

 create or replace procedure PS_File_Update_Insert (
          Input_val in varchar2
          , p1 in varchar2
          , p2 in varchar2
          , p3 in varchar2
          , p4 in varchar2
          , p5 in varchar2
          )       
is
BEGIN        
if Input_val = 'Insert' then        
   insert into PS_FILE (SRC_FILE_ID
                     ,TRUSTED_PARTY_ID
                     ,FILE_NM,FILE_PROC_DT
                     ,FILE_STATUS) 
   values (SRC_FILE_ID_SEQ.nextval
                  ,1234
                  ,'zxcv'
                  ,SYSDATE
                  ,'NEW');
 elsif Input_val = 'update' then        
   update PS_FILE 
      set FILE_STATUS='STAGING'
      ,   REC_CNT='abcd'
      , ERR_CNT='123'
      , DUPE_CNT=NULL 
      where SRC_FILE_ID='1234';        
  end if;
end;

3 个答案:

答案 0 :(得分:3)

秃顶这是一个糟糕的设计。这对其他开发人员来说很困惑,并且会导致应用程序出错。编写两个过程,一个用于插入,另一个用于更新。

如果你想链接它们,以显示这两个程序是相关的功能(为什么你不想这样做?)将它们放在一个包中。这就是包的目的。 Find out more

答案 1 :(得分:0)

我认为最好的设计是有两个重载过程,一个有5个参数用于插入和同名程序用6个参数进行更新。对于调用程序,它看起来会像同一个名字,但它会采取不同的行为。

表示插入..

    create or replace procedure PS_File_Update_Insert (
              Input_val in varchar2
              , p1 in varchar2
              , p2 in varchar2
              , p3 in varchar2
              , p4 in varchar2
                 ) 
-- insert code 

更新

    create or replace procedure PS_File_Update_Insert (
              Input_val in varchar2
              , p1 in varchar2
              , p2 in varchar2
              , p3 in varchar2
              , p4 in varchar2
              , p5 in varchar2
              ) 
-- update code.

答案 2 :(得分:0)

我认为您有多种方法可以满足您的需求:

  1. 解决此问题的最佳方法是使用一个包,在其中添加这两个过程并使用它们,如您所希望的那样插入或更新,在另一个过程中连接它们(当然最后的过程应该是包裹。)。
  2. 您可以在要构建的单个过程的参数中使用DEFAULT VALUES(reserve ....)。因此,使用这些默认值,您可以在同一过程中执行插入或更新,但我仍然是第一个选项,我担心会让人感到困惑。
  3. 查看此link

    希望这有帮助!!