es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo retornar valores en el servidor de base de datos Oracle

Soy nuevo en esto y me preguntaba cómo devolver variables en Oracle SQL sin usar print y dbms.output.putline. Quiero que esta consulta devuelva un valor para poder usarlo en NodeJS como una consulta select devuelve un valor, pero para un procedimiento almacenado.

Aquí está la consulta del procedimiento almacenado que estoy intentando ejecutar:

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);

     END;  `;


     return await query(sql);
  } catch (error) {
    console.log(error);
    throw new Error.InternalServerError("¡Error!");
  }
}

Ahora la salida está en blanco, ¿cómo devuelvo las variables out?

¿Alguien puede darme un ejemplo de cómo devolver variables out desde un procedimiento?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para devolver variables de salida desde un procedimiento almacenado de Oracle, puedes declarar una variable de tipo REF CURSOR y utilizar la instrucción FETCH para recuperar los valores. Aquí tienes un ejemplo de cómo puedes modificar tu código:

    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;
            c_out_params            SYS_REFCURSOR;
          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);
    
            OPEN c_out_params FOR
              SELECT 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
              FROM DUAL;
    
            :out_params := c_out_params;
          END;
        `;
    
        const binds = {
          out_params: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } // declarar la variable de cursor de salida
        };
    
        const result = await database.execute(sql, binds);
        const outCursor = result.outBinds.out_params;
    
        let row;
        while ((row = await outCursor.getRow())) { // utilizar la instrucción FETCH para recuperar los valores
          console.log(row);
        }
    
        await outCursor.close(); // cerrar el cursor después de usarlo
    
      } catch (error) {
        console.log(error);
        throw new Error.InternalServerError("¡Error!");
      }
    };
    

    En este ejemplo, declaramos una variable de tipo REF CURSOR llamada c_out_params, que contendrá los valores de salida del procedimiento almacenado. Luego, utilizamos la instrucción OPEN para crear un cursor con la instrucción SELECT que recupera las variables de salida. A continuación, vinculamos el cursor de salida :out_params a la variable out_params en el objeto binds. Finalmente, llamamos al método getRow en la variable outCursor dentro de un bucle para recuperar cada fila de valores de salida, y luego cerramos el cursor después de usarlo con el método close.

    Nota que este ejemplo asume que estás utilizando el módulo oracle o oracledb en node.js para conectarte a una base de datos de Oracle.

Comments are closed.