Oracle 如何在select查询中使用光标字段

Oracle 如何在select查询中使用光标字段,oracle,plsql,cursor,Oracle,Plsql,Cursor,我试图在这里使用游标,我想知道如何访问select列中的游标字段 我有一个实现如下: create or replace TYPE "TABLE_TYPE_SAMPLE" AS OBJECT( ENTITY_NAME VARCHAR2(100) ); 该函数没有错误。但当我试着运行下面的查询时 select * from table(segmentFields(480)); 我得到下面的错误 ORA-01422:精确提取返回的行数超过请求的行数 ORA-06

我试图在这里使用游标,我想知道如何访问select列中的游标字段

我有一个实现如下:

create or replace TYPE  "TABLE_TYPE_SAMPLE" AS OBJECT(
   ENTITY_NAME            VARCHAR2(100)
);

该函数没有错误。但当我试着运行下面的查询时

select * from table(segmentFields(480));
我得到下面的错误

ORA-01422:精确提取返回的行数超过请求的行数
ORA-06512:在“分段字段”第19行
142200000-“精确提取返回的行数超过请求的行数”
*原因:精确提取中指定的行数小于返回的行数。
*操作:重写查询或更改请求的行数

我想了解,这个实现有什么问题

谢谢。

第行错误:

从PER_PEOPLE_Group中选择curStr to attValue

执行代码的那个?每个人组的
中有多少行


错误表示不止一个
。您可能需要在where子句中添加一个条件?

问题在于select into。不知道为什么会这样。光标的值在cur_recd.cola中可用,您可以直接使用它

create or replace function segmentfields(txnid varchar2) return table_sample is

   flextable table_sample := table_type_sample();

   cursor cur_seg is(
      select cola
        from table1 -- (table name has column colA)
       where id = txnid);
begin
   for cur_recd in cur_seg
   loop
      flextable.extend;
      flextable(flextable.count) := (table_type_sample(cur_recd.cola));
   end loop;
   return flextable;
end;

此查询没有WHERE子句:

SELECT curStr into attValue FROM PER_PEOPLE_GROUPS;
这意味着它将返回PER_PEOPLE_组中所有行的点击数。选择。。。INTO构造填充单个变量,因此需要一个只返回一行的查询。ORA-01422消息表明您没有执行精确的获取,这显然是因为PER_PEOPLE_组有多行

几种可能的解决方案,取决于您试图实现的目标:

  • 添加某种类型的限制,以便只从peru PEOPLE\u组返回一行
  • 改为使用大容量收集来填充任何数组
  • 将选择替换为一个简单的赋值
    flexTable(flexTable.count):=(TABLE\u TYPE\u SAMPLE(cur\u recd.colA))

  • 从表面上看,放弃SELECT似乎是最好的选择,因为它不会为您提供任何信息。然而,您似乎也在尝试实现其他一些未在发布的代码中表达的业务逻辑,因此您可能需要进行一些更改。

    Hi APC,您的批量导入建议已经奏效。类型段是当前段%ROWTYPE的表;l_柱段_aat;从PER_人员组中选择curStr BULK COLLET into l_列@SatyajeethT-如果这个答案对你有用,请投票并/或接受它作为正确答案。这些行动提高了搜索的质量,从而成为未来搜索者的资源。
    create or replace function segmentfields(txnid varchar2) return table_sample is
    
       flextable table_sample := table_type_sample();
    
       cursor cur_seg is(
          select cola
            from table1 -- (table name has column colA)
           where id = txnid);
    begin
       for cur_recd in cur_seg
       loop
          flextable.extend;
          flextable(flextable.count) := (table_type_sample(cur_recd.cola));
       end loop;
       return flextable;
    end;
    
    SELECT curStr into attValue FROM PER_PEOPLE_GROUPS;