【问题标题】:How to return generated ID in an oracle procedure with node-oracledb library如何使用 node-oracledb 库在 oracle 过程中返回生成的 ID
【发布时间】:2022-02-03 20:23:39
【问题描述】:

我写了一个程序,在使用 node-oracledb 库在数据库中进行插入时,我需要返回最后生成的 ID。

我使用DBMS_OUTPUT返回过程中声明的变量的值,在SQL Developer中可以返回值输出,但是在node-oracledb库中无法返回。

程序:

create or replace PROCEDURE       TESTE.CREATE_PATIENT(
    p_DT_NASCIMENTO IN TESTE.PESSOA_FISICA.DT_NASCIMENTO%TYPE,
    p_IE_SEXO IN TESTE.PESSOA_FISICA.IE_SEXO%TYPE,
    p_NR_CPF IN TESTE.PESSOA_FISICA.NR_CPF%TYPE,
    p_NR_REG_GERAL_ESTRANG IN TESTE.PESSOA_FISICA.NR_REG_GERAL_ESTRANG%TYPE,
    p_NR_PASSAPORTE IN TESTE.PESSOA_FISICA.NR_PASSAPORTE%TYPE,
    p_NM_PESSOA_FISICA IN TESTE.PESSOA_FISICA.NM_PESSOA_FISICA%TYPE,
    p_CD_ACOMPANHANTE IN TESTE.PESSOA_FISICA_ACOMPANHANTE.CD_ACOMPANHANTE%TYPE,
    p_NR_TELEFONE_CELULAR IN TESTE.PESSOA_FISICA.NR_TELEFONE_CELULAR%TYPE
  )
IS
    p_CD_PESSOA_FISICA NUMBER;
    BEGIN

    INSERT INTO TESTE.PESSOA_FISICA (DT_NASCIMENTO,IE_SEXO,NM_PESSOA_FISICA,NR_CPF,NR_PASSAPORTE,NR_REG_GERAL_ESTRANG,NR_TELEFONE_CELULAR) VALUES(p_DT_NASCIMENTO,p_IE_SEXO,p_NM_PESSOA_FISICA,p_NR_CPF,p_NR_PASSAPORTE,p_NR_REG_GERAL_ESTRANG,p_NR_TELEFONE_CELULAR) RETURNING CD_PESSOA_FISICA INTO p_CD_PESSOA_FISICA;
    INSERT INTO TESTE.PESSOA_FISICA_ACOMPANHANTE (CD_PESSOA_FISICA, CD_ACOMPANHANTE) VALUES(p_CD_PESSOA_FISICA, p_CD_ACOMPANHANTE);
    DBMS_OUTPUT.PUT_LINE(p_CD_PESSOA_FISICA);
    COMMIT;
END;

调用过程:

SET SERVEROUTPUT ON
BEGIN CREATE_PATIENT(TO_DATE('1981-12-10', 'YYYY-MM-DD'), 'F', '25845685236', '12345645', '65432145', 'Marina Santos', '3', '+5511999999999'); END;

查看返回: Return In SQL Developer

我需要用 node-oracledb 返回这个值,有没有人经历过这个并且可以帮助我?

【问题讨论】:

  • 如果你真的必须使用DBMS_OUTPUT,那么记录了一个方法here,但是你不应该这样做并且应该重构你的过程来使用OUT参数。
  • 我同意使用 OUT 绑定。要添加有关 DBMS_OUTPUT 的更可能更新的参考,其上的 node-oracledb 文档位于 oracle.github.io/node-oracledb/doc/api.html#dbmsoutput
  • MTO 和 Christopher 非常感谢!我将应用更改并进行测试。
  • 成功了,谢谢! :D

标签: node.js oracle node-oracledb


【解决方案1】:

不要使用DBMS_OUTPUT;使用OUT 参数:

create PROCEDURE TESTE.CREATE_PATIENT(
    p_DT_NASCIMENTO        IN  TESTE.PESSOA_FISICA.DT_NASCIMENTO%TYPE,
    p_IE_SEXO              IN  TESTE.PESSOA_FISICA.IE_SEXO%TYPE,
    p_NR_CPF               IN  TESTE.PESSOA_FISICA.NR_CPF%TYPE,
    p_NR_REG_GERAL_ESTRANG IN  TESTE.PESSOA_FISICA.NR_REG_GERAL_ESTRANG%TYPE,
    p_NR_PASSAPORTE        IN  TESTE.PESSOA_FISICA.NR_PASSAPORTE%TYPE,
    p_NM_PESSOA_FISICA     IN  TESTE.PESSOA_FISICA.NM_PESSOA_FISICA%TYPE,
    p_CD_ACOMPANHANTE      IN  TESTE.PESSOA_FISICA_ACOMPANHANTE.CD_ACOMPANHANTE%TYPE,
    p_NR_TELEFONE_CELULAR  IN  TESTE.PESSOA_FISICA.NR_TELEFONE_CELULAR%TYPE,
    o_CD_PESSOA_FISICA     OUT TESTE.PESSOA_FISICA.CD_PESSOA_FISICA%TYPE
  )
IS
BEGIN
  INSERT INTO TESTE.PESSOA_FISICA (
    DT_NASCIMENTO,
    IE_SEXO,
    NM_PESSOA_FISICA,
    NR_CPF,
    NR_PASSAPORTE,
    NR_REG_GERAL_ESTRANG,
    NR_TELEFONE_CELULAR
  ) VALUES(
    p_DT_NASCIMENTO,
    p_IE_SEXO,
    p_NM_PESSOA_FISICA,
    p_NR_CPF,
    p_NR_PASSAPORTE,
    p_NR_REG_GERAL_ESTRANG,
    p_NR_TELEFONE_CELULAR
  )
  RETURNING CD_PESSOA_FISICA INTO o_CD_PESSOA_FISICA;
  
  INSERT INTO TESTE.PESSOA_FISICA_ACOMPANHANTE (
    CD_PESSOA_FISICA,
    CD_ACOMPANHANTE
  ) VALUES(
    o_CD_PESSOA_FISICA,
    p_CD_ACOMPANHANTE
  );
END;
/

注意:在过程中使用COMMIT 意味着您不能在单个事务中将多个过程和/或DML 语句链接在一起,然后在后面的一个失败时对它们都使用ROLLBACK。您应该删除COMMIT 并在事务完成后在过程之外调用它。

如果你想在 SQL Developer 中调用过程并输出值,那么你可以在你调用过程的块中使用DBMS_OUTPUT

SET SERVEROUTPUT ON

DECLARE
  v_CD_PESSOA_FISICA TESTE.PESSOA_FISICA.CD_PESSOA_FISICA%TYPE;
BEGIN
  CREATE_PATIENT(
    TO_DATE('1981-12-10', 'YYYY-MM-DD'),
    'F',
    '25845685236',
    '12345645',
    '65432145',
    'Marina Santos',
    '3',
    '+5511999999999',
    v_CD_PESSOA_FISICA
  );
  DBMS_OUTPUT.PUT_LINE(v_CD_PESSOA_FISICA);
  COMMIT;
END;
/

您可以在Node and read the out parameter into a variable 中调用相同的过程。

【讨论】:

猜你喜欢
  • 2018-10-25
  • 2019-06-20
  • 2021-09-18
  • 2022-01-16
  • 2019-10-14
  • 1970-01-01
  • 2016-04-01
  • 2018-04-23
  • 2017-11-23
相关资源
最近更新 更多