我想使用逗号分隔的字符串将一组记录标识符传递给 Oracle 过程。我想把它放到一个临时表中,然后在进一步处理中加入它。我该怎么办?
比 CSV 更好的方法也会很高兴听到。我正在使用 ODP.Net 进行数据访问。
我对 ODP.net 一无所知,但为什么要将所有记录标识符连接到 CSV 字符串中呢?
更好的方法可能是在您的过程中创建一个数组参数并传递一个标识符数组。我想这取决于您从哪里获取标识符列表以及它们是以数组还是 CSV 字符串开始的?
这是一个使用数组类型并将其加入查询而不使用临时表的示例(您可以使用 IN 列表执行类似的操作,但更难绑定):
create or replace type my_test_type as object (id integer);
create or replace type my_test_type_a as table of my_test_type;
create or replace procedure my_test_proc(i_ids in my_test_type_a)
is
begin
for row in (
select a.l from
(
select level l from dual connect by level <= 10
) a, table(i_ids) b
where a.l = b.id
) loop
dbms_output.put_line(row.l);
end loop;
end;
/
请注意,测试过程中的查询使用“表”函数将传入的数组转换为查询中的表,您实际上可以将其他真实表连接到其中。
也不是子查询“a”使用技巧来创建一个假测试表,其中包含 10 行,值从 1 到 10(这只是测试数据来证明它有效)。
使用以下块,我们可以测试代码是否有效:
declare
v_id my_test_type;
v_ids my_test_type_a;
begin
v_id := my_test_type(1);
v_ids := my_test_type_a();
for i in 1.. 5 loop
v_id := my_test_type(i);
v_ids.extend;
v_ids(i) := v_id;
end loop;
my_test_proc(v_ids);
end;
/
只要 dbms_output 处于打开状态,这应该打印 1 - 5,因为测试数据表已与您的数组连接!
用IN怎么样?如select ... where id IN (...list-of-ids-here...)
?
除此之外,我建议在调用过程之前手动将值插入到临时表中,或者编写一个为您执行插入的特殊过程,这样您就可以在第二步中调用原始过程。这样,您比将所有内容都放入一个方法中要灵活得多。
SQL LOADER 非常适合这项任务
http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96652/ch03.htm#1656
您可以为日期指定多种格式,并且有许多有用的选项可用于将数据从 CSV 导入 Oracle。