一个查询中的 node-oracledb 多个语句

Posted

技术标签:

【中文标题】一个查询中的 node-oracledb 多个语句【英文标题】:node-oracledb multiple statement in one query 【发布时间】:2021-12-19 00:03:35 【问题描述】:

mysql 中,我们可以在一个查询中执行多个语句,如下例所示。 oracledb有没有类似的方法在一个查询中运行多条语句?

const mysql = require('mysql');

const connection = mysql.createConnection(
    host: 'localhost',
    user: 'root',
    password: 'password',
    multipleStatements: true
)

app.get('/distinct',(req,res)=>  
    connection.query('select DISTINCT country FROM sample_data.olympic_winners order by country ASC; select DISTINCT sport FROM sample_data.olympic_winners order by sport ASC',(err,rows)=>  
    if(!err)   
    res.send(rows);  
    else  
        console.log(err);  
      
)  
);

【问题讨论】:

【参考方案1】:

Oracle 一次只允许您执行一条 SQL 或 PL/SQL 语句。

您可以将查询包装在 PL/SQL 块中并使用 Oracle 的隐式结果集,请参阅 doc:

例如:

const plsql = `
  DECLARE
    c1 SYS_REFCURSOR;
    c2 SYS_REFCURSOR;
  BEGIN
    OPEN c1 FOR SELECT city, postal_code
                FROM locations
                WHERE location_id < 1200;
    DBMS_SQL.RETURN_RESULT(c1);

    OPEN C2 FOR SELECT job_id, employee_id, last_name
                FROM employees
                WHERE employee_id < 103;
    DBMS_SQL.RETURN_RESULT(c2);
  END;`;

result = await connection.execute(plsql);
console.log(result.implicitResults);

将显示:

[
  [
    [ 'Roma', '00989' ],
    [ 'Venice', '10934' ],
  ],
  [
    [ 'AD_PRES', 100, 'King' ],
    [ 'AD_VP', 101, 'Kochhar' ],
    [ 'AD_VP', 102, 'De Haan' ],
  ]
]

【讨论】:

【参考方案2】:

另一种方法是在不调用 PL/SQL 的情况下将数据库端的查询合并到单个 select 语句中:

select DISTINCT 'country', country FROM sample_data.olympic_winners 
  UNION ALL
select DISTINCT 'sport', sport FROM sample_data.olympic_winners
  order by 1,2 ASC;

此方法需要相关表的相同行结构并提供复合结果集。这取决于使用这种复合请求要实现的目标是什么,例如所需的结果集结构(只是一个简单的统一列表,或者更确切地说是分层的主从细节)。

【讨论】:

以上是关于一个查询中的 node-oracledb 多个语句的主要内容,如果未能解决你的问题,请参考以下文章

更新查询在node-oracledb模块中挂起

一个查询中的多个 INSERT INTO 语句

单个查询中的多个 SQL 更新语句

查询生成器中的多个 Order By 语句?

在SQLServer中的查询语句

SQLStatement.execute() - 一条语句中的多个查询