Oracle批量收集成三列

Posted

技术标签:

【中文标题】Oracle批量收集成三列【英文标题】:Oracle bulk collect into three column 【发布时间】:2021-03-16 07:35:14 【问题描述】:

如何在下面的函数中添加多个例如。 l_col2l_col3

l_col2 =  Select sal as val2 from emp where empno = P_ID

l_col3 =  Select deptno as val3 from emp where empno = P_ID

create or replace function F_MY_FUNC
    ( 
         P_ID IN number
       )
          return  sys.odcinumberlist
        as
          l_coll  sys.odcinumberlist;
        begin
          select * bulk collect into l_coll
          from (  
                 Select ename as val from emp where empno = P_ID
                 union all
                 Select ename as val from myemp where empno = P_ID
              );
    
         return l_coll;
       end;

【问题讨论】:

您正在尝试将字符串返回到数字数组中。 @BarbarosÖzhan 我需要一个带参数的函数,ibb.co/ygjhGZ6 在函数中需要放在 Littlefoot 的 sql 代码下面 【参考方案1】:

你可以,但不能进入SYS.ODCINUMBERLIST - 创建你自己的类型。

SQL> create or replace type t_row as object
  2    (empno number, ename varchar2(10), job varchar2(10));
  3  /

Type created.

SQL> create or replace type t_tab as
  2    table of t_row;
  3  /

Type created.

SQL> declare
  2    l_tab t_tab;
  3  begin
  4    select t_row(empno, ename, job)      --> 3 columns 
  5      bulk collect into l_tab            --> into one collection
  6      from emp
  7      where deptno = 20;
  8  end;
  9  /

PL/SQL procedure successfully completed.

SQL>

【讨论】:

是否可以将(SQL> 声明 2 l_tab t_tab....)放入带有一个参数的函数中,并将参数 20 替换为我的参数?然后从 my_func(parameter) 调用 Select * 并使用 3 列获取结果选择? 恐怕我听不懂你在说什么。 什么是my_function,你想用20做什么?顺便说一句,您不需要创建对象类型,一个普通的 PL/SQL 记录集合就可以了。 @Littlefoot 这样的东西 ibb.co/ygjhGZ6 有时我们可能不需要在模式级别声明类型并利用 DBMS_SQL pkg 中现有的记录和表类型。 Oracle 12.2 doc

以上是关于Oracle批量收集成三列的主要内容,如果未能解决你的问题,请参考以下文章

使用 LOOP 将 Oracle 批量收集到集合中

从 Oracle 游标批量收集列的子集

Oracle批量导入数据时的在线统计信息收集

Oracle批量导入数据时的在线统计信息收集

在 Oracle 中对集合类型“对象”进行批量收集

Oracle:使用 select 插入不返回批量收集新插入的 id