从Oracle存储过程返回值

时间:2019-01-09 08:00:56

标签: oracle stored-procedures plsql

我在Oracle中有一个存储过程。我希望,如果它成功更新记录,它将返回一个返回值1,否则返回0。让我知道我该怎么做。我正在使用Angular,Asp.net,WebAPi和Oracle数据库。

先谢谢了。我的代码如下:

CREATE OR REPLACE Procedure NML.AddProductProcedure(V_CRD_COD In varchar2,
                                        V_ITM_COD In varchar2,
                                        V_SRL_NUM In varchar2,
                                        V_UOM_ABR IN varchar2,
                                        V_QTD_RTE IN varchar2,
                                        V_QTY_PRC In varchar2,
                                        V_QTN_NUM IN varchar2,
                                        V_PMT_FLG IN varchar2,
                                        V_TAX_FLG IN varchar2,
                                        V_DLV_FLG IN varchar2)
IS
BEGIN
    UPDATE NML.pgi_00_13 
    SET UOM_ABR = V_UOM_ABR,
        QTD_RTE = V_QTD_RTE,
        QTY_PRC = V_QTY_PRC,
        QTN_NUM = V_QTN_NUM,
        PMT_FLG = V_PMT_FLG,
        TAX_FLG = V_TAX_FLG,
        DLV_FLG = V_DLV_FLG
    WHERE
        CRD_COD = V_CRD_COD 
        AND ITM_COD = V_ITM_COD 
        AND SRL_NUM = V_SRL_NUM;   
END;

2 个答案:

答案 0 :(得分:0)

您可以在过程中定义一个OUT变量,成功完成后将其设置为1,或者从EXCEPTION设置为0。

CREATE OR REPLACE PROCEDURE nml.addproductprocedure (
     p_crd_cod   IN VARCHAR2,
     p_itm_cod   IN VARCHAR2,
     p_srl_num   IN VARCHAR2,
     p_uom_abr   IN VARCHAR2,
     p_qtd_rte   IN VARCHAR2,
     p_qty_prc   IN VARCHAR2,
     p_qtn_num   IN VARCHAR2,
     p_pmt_flg   IN VARCHAR2,
     p_tax_flg   IN VARCHAR2,
     p_dlv_flg   IN VARCHAR2,
     p_status   OUT NUMBER    --use this variable
)
     IS
BEGIN
     UPDATE nml.pgi_00_13
     SET uom_abr = p_uom_abr,
         qtd_rte = p_qtd_rte,
         qty_prc = p_qty_prc,
         qtn_num = p_qtn_num,
         pmt_flg = p_pmt_flg,
         tax_flg = p_tax_flg,
         dlv_flg = p_dlp_flg
     WHERE crd_cod = p_crd_cod AND itm_cod = p_itm_cod AND srl_num = p_srl_num;
     p_status := 1;

     EXCEPTION
       WHEN OTHERS THEN
     p_status := 0;
END;
/

您的调用块必须定义OUT参数,如下所示:How to return oracle output parameters from a stored procedure in .NET

答案 1 :(得分:0)

您对“成功”的定义是什么?目前,如果您的过程引发异常,则失败,否则成功。那还不够吗?

您可以使用一个参数扩展该过程的签名,该参数可以告诉您更新了多少条记录...

port_speed_change

请注意,您可以改为传递标志或1或0,如@Kaushik solution所示,但这是反模式。因为:

  1. 当语句更新零行时,它返回CREATE OR REPLACE Procedure NML.AddProductProcedure( V_CRD_COD In varchar2, V_ITM_COD In varchar2, V_SRL_NUM In varchar2, V_UOM_ABR IN varchar2, V_QTD_RTE IN varchar2, V_QTY_PRC In varchar2, V_QTN_NUM IN varchar2, V_PMT_FLG IN varchar2, V_TAX_FLG IN varchar2, V_DLV_FLG IN varchar2, p_updated_cnt out pls_integer )IS BEGIN Update NML.pgi_00_13 set UOM_ABR=V_UOM_ABR, QTD_RTE=V_QTD_RTE, QTY_PRC=V_QTY_PRC, QTN_NUM=V_QTN_NUM, PMT_FLG=V_PMT_FLG, TAX_FLG=V_TAX_FLG, DLV_FLG=V_DLV_FLG Where CRD_COD=V_CRD_COD AND ITM_COD=V_ITM_COD AND SRL_NUM=V_SRL_NUM; -- count of rows updated by preceding statement p_updated_cnt := sql%rowcount; END; ,这是技术上的成功,但从业务角度来看可能不是成功的完成。
  2. 调用程序可以选择忽略标志值,而它必须处理传播的异常。
  3. 如果调用程序想要在标志值指示失败时执行操作,则不知道为什么被调用过程失败。另一方面,异常通常足够具体以支持决策。

  

在更新记录成功后只想重新调谐1

好吧,你可以这样做:

success

如果有例外,这仍然会抛出错误-这是一件好事-但区分更新零条记录和一条记录(或更多条记录)。

相关问题