sql - 如何执行 SQL 游标转换

标签 sql oracle stored-procedures

在我的 Oracle 存储过程中,有一个基于选择的查询,不是那么复杂,只是一些带有附加普通过滤器和单一排序依据的连接表。

查询包含一个用户(按名称排序),每个用户具有一些属性和可能的​​几行。

但是我需要添加一些计算的额外列。

  1. 将 1 设置为具有相同“name”的组中第一行的“flags”列(其他行为 0)。

  2. 确实加入同一字段“权利”的前一行值和其他列和当前行值(在我的例子中为“组”)的累积列“权利”,也应该为每个用户重新设置

例如:

john;        admin;         1;            admin
john;        poweruser;     0;            admin | poweruser
ken;         guest;         1;            guest
ted;         developer;     1;            developer
ted;         user;           0;           developer | user
ted;         techwriter;     0;           developer | user | techwriter

我需要执行一些格式化并作为存储过程的结果返回。 不确定如何设置所需的值并从存储过程中返回它。

我是否应该将初始查询声明为游标、循环遍历并设置(完全可能?对于非数据库字段?)以及如何从存储过程返回此游标?

最佳答案

您还可以将其他一些分析函数与 LISTAGG() 一起使用来实现这一目的。由于您不提供测试数据,我将使用 EMP 表进行演示:

select deptno, ename,
  case rn when 1 then 1 else 0 end flags,
  case cnt when rn
    then enames
    else substr(enames, 1, instr(enames, ' | ', 1, rn) - 1)
  end enames
from (
  select deptno, ename,
    row_number() over(partition by deptno order by ename) rn,
    count(*) over(partition by deptno) cnt,
    listagg(ename, ' | ') within group(order by ename) over(partition by deptno) enames
  from emp
) a;

DEPTNO   ENAME    FLAGS  ENAMES                                           
    10   CLARK        1  CLARK                                             
    10   KING         0  CLARK | KING                                      
    10   MILLER       0  CLARK | KING | MILLER                             
    20   ADAMS        1  ADAMS                                             
    20   FORD         0  ADAMS | FORD                                      
    20   JONES        0  ADAMS | FORD | JONES                              
    20   SCOTT        0  ADAMS | FORD | JONES | SCOTT                      
    20   SMITH        0  ADAMS | FORD | JONES | SCOTT | SMITH              
    30   ALLEN        1  ALLEN                                             
    30   BLAKE        0  ALLEN | BLAKE                                     
    30   JAMES        0  ALLEN | BLAKE | JAMES                             
    30   MARTIN       0  ALLEN | BLAKE | JAMES | MARTIN                    
    30   TURNER       0  ALLEN | BLAKE | JAMES | MARTIN | TURNER           
    30   WARD         0  ALLEN | BLAKE | JAMES | MARTIN | TURNER | WARD

最好的问候,Stew Ashton

关于sql - 如何执行 SQL 游标转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58065030/

相关文章:

神谕。在两个过程中重用游标作为参数

sql - 数据类型 text 不能用作 UNION、INTERSECT 或 EXCEPT 运算符的操作数,因为它不具有可比性

java - 在实体类中定义一个不是列的变量

php - 连接 PHP 记录集中的符号

sql - 使用表达式按列表分区

c# - Sql Server和.Net是如何处理一个存储过程的

mysql - PHPMyAdmin 中的 SQL 查询未执行,显示错误 #1071

sql - Oracle 保留唯一约束索引

mysql - 如何将变量传递给 IN 子句?

c# - 将过程结果从 Entity Framework 传递到 View