如何在sql查询中使用plsql表类型?

时间:2017-08-17 14:01:49

标签: plsql

首先我要说的是我可以采取其他方式做到这一点,但现在,这是我能够提出的所有方法。

我在package.procedure中工作,我使用表类型作为数组/列表来存储符合搜索条件的记录的ID。编译完列表后,我想打开一个光标,从表中选择记录ID在我的列表中。

数据结构:

document.onkeydown

填充列表:

TYPE i_array IS TABLE OF t_table.id_column%TYPE INDEX BY PLS_INTEGER;
lt_results i_array;
ln_count pls_integer;

打开光标并访问列表:

    ln_count := 0;
    for recs in (select id_column from t_child where other_column = ls_criteria)
    loop
        ln_count := ln_count + 1;
        lt_results(ln_count);
    end loop;

1 个答案:

答案 0 :(得分:2)

如果使用Oracle 12C,您可以在包中使用嵌套表集合,如下所示:

create or replace package test is

  TYPE i_array IS TABLE OF t_child.id_column%TYPE;

  procedure run;

end;

create or replace package body test is

  procedure run is
    lt_results i_array := i_array();
    cur sys_refcursor;
  begin
    for r in (select id_column from t_child where other_column = ls_criteria) loop
      lt_results.extend;
      lt_results(lt_results.count) := r.id_column ;
    end loop;

    open cur for 
      select col_a,
             col_b,
             col_c
      from t_table
      where id_column in (select column_value from table(lt_results));
  end run;

end;

在12C之前,类型i_array需要在数据库中:

create type i_array is table of varchar2(10); -- For example

您可以使用SYS.KU$_VCNT之类 for r in (select id_column from t_child where other_column = ls_criteria) loop lt_results.extend; lt_results(lt_results.count) := r.id_column ; end loop; 而不是创建自己的。{/ p>

BTW请注意:

    select id_column 
      bulk collect into lt_results
      from t_child where other_column = ls_criteria;

可以通过以下方式更有效地替换:

Action defaultSelectWordAction = textComponent.getActionMap().get(DefaultEditorKit.selectWordAction);

textComponent.getActionMap().put(DefaultEditorKit.selectWordAction, new TextAction(DefaultEditorKit.selectWordAction) {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (conditionFulfilled()) {
                defaultSelectWordAction.actionPerformed(e);
            } else {
                // DO NOTHING
            }
        }
    });