首先我要说的是我可以采取其他方式做到这一点,但现在,这是我能够提出的所有方法。
我在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;
答案 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
}
}
});