【问题标题】:Get Specific Row From Table Type With my Filter Values使用我的过滤器值从表类型中获取特定行
【发布时间】:2019-01-03 18:45:18
【问题描述】:

我的程序如下:

cursor my_cursor is 
select  first_column, second_column, third_column from table_name;

TYPE my_cursor_type is TABLE OF my_cursor_type%ROWTYPE INDEX BY BINARY INTEGER; 
my_cur  my_cursor_type;

TYPE table_type IS TABLE OF table_name%ROW_TYPE  INDEX BY BINARY INTEGER; 
table_obj  table_type; 

begin 

open my_cursor; 
loop
fetch my_cursor bulk collect 
into my_cur limit 5000;
exit when my_cursor%notfound; 
for i in 1 .. my_cur.count loop   
       table_obj(i).first_column  := my_cur(i).first_column; 
       table_obj(i).second_column := my_cur(i).second_column;   
       table_obj(i).third_column := my_cur(i).third_column;  
     end loop;
  end loop;
  Close my_cursor;

……

现在在这些代码之后,我有 table_obj,它有 100000 条记录。而这个表对象有first_column、second_column、third_column。

我在table_obj 中搜索一条记录的第三列。我知道first_column、second_column,我在table_obj 中搜索third_column。我必须从 table_obj 行中获取行。此搜索行具有我的 first_column、second_column 值。 我从这一行得到了third_column_value。如何使用 plsql 从 table_obj 行中获取特定行?

【问题讨论】:

  • 您为什么要使用循环来填充您的 PL/SQL 表 - 为什么不将单个批量收集到 table_obj 中?我不确定我是否理解你试图用你的'过滤器值做什么,或者它们来自哪里。如果您只需要与您的特定第一/第二列值匹配的数据,为什么不将过滤作为游标查询的一部分?
  • 我不知道,如何分配单循环。你理解正确。我不能使用 where 条件。因为我使用其他循环的表对象。即 first_value 和 second_value 每次循环迭代都会改变。
  • 首先我想填充我的table_obj。因为在每个循环迭代中进行选择查询会导致性能问题。首先我要准备好数据。然后我想快速循环使用获取的数据。
  • 作为旁注,看看这里为什么你会以你编码循环的方式丢失记录:livesql.oracle.com/apex/livesql/file/…。声明 4 是您所做的,它旁边是解释为什么这不起作用,并且该页面上也有工作示例。 HTH KR 彼得

标签: oracle plsql oracle-sqldeveloper plsqldeveloper


【解决方案1】:

这可以通过将前两列转换为单个索引来完成。带有分隔符的连接最适合这种情况。分隔符应该是前两列中没有使用的字符。

DECLARE
   CURSOR my_cursor
   IS
      SELECT first_column, second_column, third_column FROM table_name;

   TYPE my_cursor_type IS TABLE OF my_cursor_type%ROWTYPE
      INDEX BY BINARY_INTEGER;
   my_cur           my_cursor_type;

   TYPE table_type IS TABLE OF table_name%ROWTYPE
      INDEX BY BINARY_INTEGER;
   table_obj        table_type;

   l_composite_idx  VARCHAR2( 61 );
   l_test_idx_1     VARCHAR2( 30 ) := 'Test1';
   l_test_idx_2     VARCHAR2( 30 ) := 'Success';
BEGIN
   OPEN my_cursor;

   LOOP
      FETCH my_cursor BULK COLLECT INTO my_cur LIMIT 5000;

      FOR i IN 1 .. my_cur.COUNT
      LOOP
         l_composite_idx                             := my_cur( i ).first_column || '&' || my_cur( i ).second_column;

         table_obj( l_composite_idx ).first_column   := my_cur( i ).first_column;
         table_obj( l_composite_idx ).second_column  := my_cur( i ).second_column;
         table_obj( l_composite_idx ).third_column   := my_cur( i ).third_column;
      END LOOP;

      EXIT WHEN my_cursor%NOTFOUND;
   END LOOP;

   CLOSE my_cursor;

   -- You access a row in my_cur like this:
   DBMS_OUTPUT.put_line( 'Result: ' || table_obj( l_test_idx_1 || '&' || l_test_idx_2 ) );
END;

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2016-12-24
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    相关资源
    最近更新 更多