Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点oracledb执行pl/sql函数_Node.js_Oracle_Plsql_Node Oracledb - Fatal编程技术网

Node.js 节点oracledb执行pl/sql函数

Node.js 节点oracledb执行pl/sql函数,node.js,oracle,plsql,node-oracledb,Node.js,Oracle,Plsql,Node Oracledb,我创建了如下内容: DECLARE active_ver number; archived_ver number; draft_ver number; ret varchar2(10); FUNCTION checkStatus(active_ver IN number, archived_ver IN number, draft_ver IN number) return varchar2 is varchar2(10); BEGIN IF (archived_ver > activ

我创建了如下内容:

DECLARE
active_ver number;
archived_ver number;
draft_ver number;
ret varchar2(10);
FUNCTION checkStatus(active_ver  IN number, archived_ver IN number, draft_ver 
IN number)
return varchar2 is varchar2(10);
BEGIN
IF (archived_ver > active_ver) then
    IF (draft_ver > archived_ver) then 
         z:='DRAFT';
    ELSE z:='ARCHIVED';
    END IF;
ELSE     z:='ACTIVE';
END IF;
RETURN z;
END;
BEGIN
SELECT NVL(max(version),0) into active_ver from table_1 order by run_id desc;// returns 0 
SELECT NVL(max(version),0) into archived_ver from table_2 order by run_id desc;// returns 16
SELECT NVL(max(version),0) into draft_ver from table_3 order by run_id desc;// returns 11.6
ret = checkStatus(active_ver, archived_ver, draft_ver);
dbms_output.put_line('ret' || ret);
END;
当我在SQL Developer中执行它时,它运行良好并返回存档,但当我尝试使用节点oracledb执行此操作时,我会处于活动状态:(

我就是这么做的:

async executeFunction(){

const query = 'DECLARE
active_ver number;
archived_ver number;
draft_ver number;
ret varchar2(10);
FUNCTION checkStatus(active_ver  IN number, archived_ver  IN number, draft_ver IN number)
return varchar2 is varchar2(10);
BEGIN
IF (archived_ver > active_ver) then
    IF (draft_ver > archived_ver) then 
         z:='DRAFT';
    ELSE z:='ARCHIVED';
    END IF;
ELSE     z:='ACTIVE';
END IF;
RETURN z;
END;
BEGIN
SELECT NVL(max(version),0) into :active_ver from table_1 order by run_id desc;// returns 0 
SELECT NVL(max(version),0) into :archived_ver from table_2 order by run_id desc;// returns 16
SELECT NVL(max(version),0) into :draft_ver from table_3 order by run_id desc;// returns 11.6
:ret = checkStatus(active_ver, archived_ver, draft_ver);
dbms_output.put_line('ret' || ret);
END;'

const result = connection.execute(query, 
{
active_ver : {dir: oracledb.BIND_OUT,type: oracledb.NUMBER}.
archived_ver : {dir: oracledb.BIND_OUT,type: oracledb.NUMBER}.
draft_ver : {dir: oracledb.BIND_OUT,type: oracledb.NUMBER}.
ret : {dir: oracledb.BIND_OUT,type: oracledb.STRING}.
});
console.log('max ACTIVE ver: ' + result.outBinds.active_ver);
console.log('max ARCHIVED ver: ' + result.outBinds.archived_ver);
console.log('max DRAFT ver: ' + result.outBinds.draft_ver);
console.log('Output: ' + result.outBinds.ret);
return result.outBinds.ret;
}
在我得到的输出中:

 max ACTIVE ver: 0
 max ARCHIVED ver: 22
 max DRAFT ver:  11.01
 Output:        ACTIVE
我的问题是,为什么我在sql developer中得到了一个适当的值,该值已存档,但由oracle db生成的活动输出却是错误的

您能帮忙吗?

在checkStatus()函数中,参数称为x、xx和xxx,但在函数中,您使用存档版本、活动版本和草稿版本。 我建议您参考函数中的参数名,现在是x、xx和xxx(不过您可能希望给出更有意义的名称:)

在checkStatus()函数中,参数名为x、xx和xxx,但在函数中使用存档版本、活动版本和草稿版本。
我建议您参考函数中的参数名称,现在是x、xx和xxx(不过您可能希望给出更有意义的名称:)

从以下内容开始:

'use strict';

const oracledb = require('oracledb');
let config = require('./dbconfig.js');

async function executeFunction() {

  let connection;

  const fn =
   `CREATE OR REPLACE FUNCTION checkStatus(p_archived_ver in number, p_active_ver in number, p_draft_ver in number) return varchar2 is
      z varchar2(20);
    BEGIN
      IF (p_archived_ver > p_active_ver) then
        IF (p_draft_ver > p_archived_ver) then
          z := 'DRAFT';
        ELSE
          z := 'ARCHIVED';
        END IF;
      ELSE
        z := 'ACTIVE';
      END IF;
    RETURN z;
  END;`;

  const query =
   `DECLARE
      active_ver number;
      archived_ver number;
      draft_ver number;
      ret varchar2(10);
    BEGIN
      SELECT 0  into active_ver from dual; -- returns 0
      SELECT 16 into archived_ver from dual; -- returns 16
      SELECT 11.6  into draft_ver from dual; -- returns 11.6
      :ret := checkStatus(active_ver, archived_ver, draft_ver);
    END;`;

  try {

    connection = await oracledb.getConnection(config);

    await connection.execute(fn);

    const result = await connection.execute(
      query,
      { ret: {dir: oracledb.BIND_OUT,type: oracledb.STRING} });
    console.log('Output: ' + result.outBinds.ret);

  } catch (err) {
    console.error(err);
  } finally {
    if (connection) {
      try {
        await connection.close();
      } catch (err) {
        console.error(err);
      }
    }
  }
}

executeFunction();

从以下内容开始:

'use strict';

const oracledb = require('oracledb');
let config = require('./dbconfig.js');

async function executeFunction() {

  let connection;

  const fn =
   `CREATE OR REPLACE FUNCTION checkStatus(p_archived_ver in number, p_active_ver in number, p_draft_ver in number) return varchar2 is
      z varchar2(20);
    BEGIN
      IF (p_archived_ver > p_active_ver) then
        IF (p_draft_ver > p_archived_ver) then
          z := 'DRAFT';
        ELSE
          z := 'ARCHIVED';
        END IF;
      ELSE
        z := 'ACTIVE';
      END IF;
    RETURN z;
  END;`;

  const query =
   `DECLARE
      active_ver number;
      archived_ver number;
      draft_ver number;
      ret varchar2(10);
    BEGIN
      SELECT 0  into active_ver from dual; -- returns 0
      SELECT 16 into archived_ver from dual; -- returns 16
      SELECT 11.6  into draft_ver from dual; -- returns 11.6
      :ret := checkStatus(active_ver, archived_ver, draft_ver);
    END;`;

  try {

    connection = await oracledb.getConnection(config);

    await connection.execute(fn);

    const result = await connection.execute(
      query,
      { ret: {dir: oracledb.BIND_OUT,type: oracledb.STRING} });
    console.log('Output: ' + result.outBinds.ret);

  } catch (err) {
    console.error(err);
  } finally {
    if (connection) {
      try {
        await connection.close();
      } catch (err) {
        console.error(err);
      }
    }
  }
}

executeFunction();

我在问题描述中改变了这一点,但无论如何,值不会传递给我的函数,它的状态是:ret=checkStatus(active\u ver、archived\u ver、draft\u ver);而不是:ret=checkStatus(0,22,11.1);我在问题描述中改变了这一点,但无论如何,值不会传递给我的函数,它的状态是:ret=checkStatus(active\u ver、archived\u ver、draft\u ver);而不是:ret=checkStatus(0,22,11.1);从哪里开始?句号而不是逗号,连接前缺少'wait'调用。execute(),PL/SQL用法奇怪且错误。。。查看一些节点oracledb示例,这非常简单。您可以在参数中定义函数。然后准备语句并绑定参数。(是的,Oracle函数除了返回值外,还可以返回in OUT参数中的值)。Oracle nodejs库显然允许这样做(我认为这是一个bug,而不是特性)。由于默认情况下,所有未绑定的变量都会获得空值,因此函数将返回
ACTIVE
。我想说,你需要把你绑定进去。从哪里开始?句号而不是逗号,连接前缺少'wait'调用。execute(),PL/SQL用法奇怪且错误。。。查看一些节点oracledb示例,这非常简单。您可以在参数中定义函数。然后准备语句并绑定参数。(是的,Oracle函数除了返回值外,还可以返回in OUT参数中的值)。Oracle nodejs库显然允许这样做(我认为这是一个bug,而不是特性)。由于默认情况下,所有未绑定的变量都会获得空值,因此函数将返回
ACTIVE
。我想说的是,你需要在中绑定。在我的版本中,我不应该使用诸如:active\u ver->不必要的冒号之类的东西。按run\u id desc从表1顺序将NVL(最大(版本),0)选择为活动版本;我一直在等待,但忘了在这里重写。无论如何,谢谢你,因为你让我意识到了:)是否可以调用过程而不是编写过程?是的,你可以调用PL/SQL过程。请参见节点oracledb示例。只需将名称包装在
BEGIN
END
中即可。在我的版本中,我不应该使用诸如:active\u ver->不必要的冒号之类的内容。按run\u id desc从表1顺序将NVL(最大(版本),0)选择为活动版本;我一直在等待,但忘了在这里重写。无论如何,谢谢你,因为你让我意识到了:)是否可以调用过程而不是编写过程?是的,你可以调用PL/SQL过程。请参见节点oracledb示例。只需将名称包装在
BEGIN
END
中即可。