【问题标题】:How to extract the out variables from a stored procedure in oracle?如何从oracle中的存储过程中提取出变量?
【发布时间】:2022-01-20 08:16:57
【问题描述】:

我有存储过程,里面有很多输出变量。所以我这样调用存储过程:

export const infoHR3 = async () => {
  try {
    const sql =
      ` 
      Declare
        ln_order_qty  NUMBER;
        ln_in_proc_qty_hr  NUMBER;
        ln_procd_hr_mass  NUMBER;
        ln_in_proc_qty  NUMBER;
        ln_wip  NUMBER;
        ln_qa  NUMBER;
        ln_packing  NUMBER;
        ln_dispatchable_qty  NUMBER;
        ln_despatched_qty  NUMBER;
        ln_finished_qty  NUMBER;
        ln_balance_qty  NUMBER;
        ln_bal_disp_qty  NUMBER;
      BEGIN
        CRMDBA.C1DVX007(
          '9514593782',
          '1',
          1,
          ln_order_qty,
          ln_in_proc_qty_hr,
          ln_procd_hr_mass,
          ln_in_proc_qty,
          ln_wip,
          ln_qa,
          ln_packing,
          ln_dispatchable_qty,
          ln_despatched_qty,
          ln_finished_qty,
          ln_balance_qty,
          ln_bal_disp_qty
        );
        dbms_output.put_line(ln_order_qty);
      END;  `;
    return await query(sql);
  } catch (error) {
    console.log(error);
    throw new Error.InternalServerError("Error!");
  }
};

这是模型:

function getinfoHR3Table() {
  return infoHR3();
}
    
export const ProcessModel = {
      getProcess,
      getReason,
      getinfoHR1Table,
      getinfoHR2Table,
      getinfoCR1Table,
      getinfoCR2Table,
      getinfoHR3Table
};

这是控制器:

export const getinfoHR3Table = async (req: Request, res: Response) => {
  try {
    const results: any = await ProcessModel.getinfoHR3Table();
    return res.status(200).json(results);
  } catch (error) {
    return res.status(400).json(error);
  }
};

问题是我在结果中得到了空白值。调用存储过程时如何提取变量并返回??

问题在于DBMS_OUTPUT.PUT_LINE 只是在数据库中打印行。该过程不返回任何可在后端使用的值。然而,它为异常值赋予了值。

如何从过程中提取这些异常变量以便在后端使用它们?

【问题讨论】:

标签: node.js oracle plsql oracle11g


【解决方案1】:

您可以使用IN OUT 类型的参数创建一个存储过程,以便以多种方式使用参数,例如

CREATE OR REPLACE PROCEDURE CALL_C1DVX007(
                                          id IN NUMBER,
                                          in_prm1 IN NUMBER,
                                          in_prm2 IN NUMBER,
                                          ln_order_qty IN OUT NUMBER,
                                          ln_in_proc_qty_hr IN OUT NUMBER,
                                          ln_procd_hr_mass IN OUT NUMBER,
                                          ln_in_proc_qty IN OUT NUMBER,
                                          ln_wip IN OUT NUMBER,
                                          ln_qa IN OUT NUMBER,
                                          ln_packing IN OUT NUMBER,
                                          ln_dispatchable_qty IN OUT NUMBER,
                                          ln_despatched_qty IN OUT NUMBER,
                                          ln_finished_qty IN OUT NUMBER,
                                          ln_balance_qty  IN OUT NUMBER,
                                          ln_bal_disp_qty IN OUT NUMBER
                                        ) 
BEGIN
  CRMDBA.C1DVX007(id,
                  in_prm1,
                  in_prm2,
                  ln_order_qty,
                  ln_in_proc_qty_hr,
                  ln_procd_hr_mass,                  
                  ln_in_proc_qty,
                  ln_wip,
                  ln_qa,
                  ln_packing,
                  ln_dispatchable_qty,
                  ln_despatched_qty,
                  ln_finished_qty,
                  ln_ba lance_qty,
                  ln_bal_disp_qty);
END;
/

然后打电话

SQL> SET serveroutput ON
SQL> BEGIN 
      CALL_C1DVX007(9514593782,1,1,:ln_order_qty,:ln_in_proc_qty_hr....);
     END;
     /
SQL> DBMS_OUTPUT.PUT_LINE(:ln_order_qty); -- to display a result coming from a parameter

从命令行

【讨论】:

  • 这不是在回答我特别询问如何返回值的问题,这只是关于我所做的事情的一种方式
  • 错了!它确实回答了这个问题。 @BarbarosÖzhan 所做的正是正是所需要的;改变了参数的定义。 Oracle 要求调用进程提供一个变量以返回 into。这只能通过将形式变量(参数)声明为 OUT 或 IN OUT 来完成。
【解决方案2】:

/如果 ln_order_qty 是过程的输出变量,您可以将此变量的值捕获到另一个变量中并从那里开始使用它。 下面是一个例子:-/

ln_order_qty_output := ln_order_qty;

/* 上述变量 ln_order_qty_output 现在将包含来自过程的输出变量值,您可以将其用作后端 PLSQL 过程中的值 */

    Declare
      ln_order_qty  NUMBER;
      ln_in_proc_qty_hr  NUMBER;
      ln_procd_hr_mass  NUMBER;
      ln_in_proc_qty  NUMBER;
      ln_wip  NUMBER;
      ln_qa  NUMBER;
      ln_packing  NUMBER;
      ln_dispatchable_qty  NUMBER;
      ln_despatched_qty  NUMBER ;
      ln_finished_qty  NUMBER;
      ln_balance_qty  NUMBER;
      ln_bal_disp_qty  NUMBER;
 BEGIN
    

CRMDBA.C1DVX007('9514593782','1',1,ln_order_qty,ln_in_proc_qty_hr,ln_procd_hr_mass,

 ln_in_proc_qty,ln_wip,ln_qa,ln_packing,ln_dispatchable_qty,ln_despatched_qty,
 ln_finished_qty,ln_balance_qty,ln_bal_disp_qty);
 ln_order_qty_output := ln_order_qty;    
 dbms_output.put_line(ln_order_qty);    
 dbms_output.put_line(ln_order_qty_output);    
END;     
  

/*dbms_output.put_line 上显示的两个值应该相同 您现在可以使用变量 ln_order_qty_output 中的值 后端 */

【讨论】:

  • 不,这是行不通的,它表明您必须声明行顺序 qnty 输出。
猜你喜欢
  • 2019-05-13
  • 2017-02-21
  • 2011-02-25
  • 2012-03-06
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2013-06-02
相关资源
最近更新 更多