【问题标题】:How to pass values to stored procedure in oracle?oracle中如何将值传递给存储过程?
【发布时间】:2015-06-22 22:32:14
【问题描述】:

我已经编写了一个存储过程,我试图在其中插入和更新值。我在执行插入时担心(它包含 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;

【问题讨论】:

  • 你是说当它是一个更新时你需要传递 SRC_FILE_ID 作为一个额外的参数,而不是你在它是一个插入时传递的参数(它是从一个序列中自动生成的)?跨度>
  • 我已经整理了你的代码,所以我们可以想象它可能会编译,否则会分散注意力。我建议你不要使用PRAGMA AUTONOMOUS_TRANSACTION; ,除非你对 PL/SQL 有更好的理解,尤其是那个子句。

标签: oracle plsql system-design


【解决方案1】:

坦率地说,这是一个糟糕的设计。这会让其他开发人员感到困惑,并会导致应用程序出现错误。编写两个程序,一个用于插入,一个用于更新。

如果你想链接它们,表明这两个过程是相关的功能(你为什么不想这样做呢?)把它们放在一个包中。这就是包的用途。 Find out more.

【讨论】:

    【解决方案2】:

    我认为最好的设计是有两个重载过程,一个是有 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.
    

    【讨论】:

      【解决方案3】:

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

      1. 解决此问题的最佳方法是使用一个包,在其中添加这两个过程,然后在另一个过程中使用它们来连接它们(当然最后的过程应该是包)。
      2. 您可以在要构建的单个过程的参数中使用默认值 (p1 VARCHAR2 DEFAULT NULL....)。因此,使用这些默认值,您可以在同一过程中执行插入或更新,但我仍然喜欢第一个选项,恐怕会造成混淆。

      查看此link

      希望有帮助!!

      【讨论】: