我想使用逗号分隔的字符串将一组记录标识符传递给Oracle过程。我想将它放入临时表中,然后在进一步处理中加入它。我该怎么做呢?
比CSV更好的方法也很好听。我正在使用ODP.Net进行数据访问。
答案 0 :(得分:2)
我对ODP.net一无所知,但为什么要将所有记录标识符连接成CSV字符串?
更好的方法可能是在您的过程中创建一个数组参数并传递一个标识符数组。我想这取决于您从哪里获得标识符列表以及它们是从数组还是CSV字符串开始?< / p>
以下是使用数组类型并将其连接到查询而不使用临时表的示例(您可以使用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;
/
请注意,测试过程中的查询使用'table'函数将传入的数组转换为查询中的一个表,您可以实际将其他实际表连接到。
同样不是子查询'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,因为测试数据表与您的阵列连接!
答案 1 :(得分:0)
使用IN怎么样?和select ... where id IN (...list-of-ids-here...)
一样?
除此之外,我建议您在调用过程之前手动将值插入临时表,或者编写一个为您执行插入操作的特殊过程,这样您就可以在第二步中调用原始过程。通过这种方式,您可以比将所有内容整合到一个方法中更灵活。
答案 2 :(得分:0)
SQL LOADER非常适合此任务
http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96652/ch03.htm#1656
您可以为日期指定多种格式,并且有很多有用的选项可以将数据从CSV导入Oracle。