如何将文本文件中的每一行分配给PL / SQL中的数组?

时间:2014-12-14 14:42:59

标签: arrays oracle plsql

我在unix shell脚本中有文本文件。我从shell脚本本身连接DB。那么,我想将文本文件中的每一行分配给pl / sql中的数组?

我的文字文件包含以下内容。

1121212
343433
3434344

如何将文本中的每一行分配给PL / SQL中的数组?

我需要输出低于输出。

array array_t := array_t('1121212', '343433', '3434344');

2 个答案:

答案 0 :(得分:2)

将数据从文件加载到数据库的最简单方法是使用外部表。这是一个数据库结构,我们可以使用SELECT语句进行查询,但表中的表来自OS文件。 Find out more

使用这种方法,您可以像这样填充数组:

select * 
bulk collect into l_array
from your_ext_table; 

虽然您可以通过外部表直接访问数据,但也许您根本不需要数组。

实现相同目标的较慢方法是使用UTL_FILE读取文件。 Find our more

declare
     fh utl_file.file_handle;
     l_array array_t := new array_t();
     l_str varchar2(4000);
     l_cnt simple_integer := 0;
begin
     fh := utl_file.fopen('YOUR_DB_DIR', 'your_os_file.txt', 'r');
     loop
         utl_file.get_line(fh, l_str);
         l_array.extend();
         l_cnt := l_cnt+1;
         l_array(l_cnt) := to_number(l_str);
     end loop;
exception
     when no_data_found then
        utl_file.fclose(fh);
end;

没有简单的方法可以从具有值的文本文件中生成这样的输出:

array array_t := array_t('1121212', '343433', '3434344');

这需要动态SQL,并且当使用更简单的方法实现相同的结果时,没有任何价值。


同样,使用shell脚本是执行PL / SQL的一种笨重方式。您应该编写存储过程并从数据库中运行它们。即使您必须使用shell脚本来触发数据库调用(为什么?它已经差不多2015年),您应该尽可能多地将逻辑放入存储过程中。

答案 1 :(得分:-1)

在我看来,作为一种解决方法,您应该创建一个控制文件并将数据从文本文件加载到临时表中,然后您可以使用批量收集将数据加载到数组中。