我在unix shell脚本中有文本文件。我从shell脚本本身连接DB。那么,我想将文本文件中的每一行分配给pl / sql中的数组?
我的文字文件包含以下内容。
1121212
343433
3434344
如何将文本中的每一行分配给PL / SQL中的数组?
我需要输出低于输出。
array array_t := array_t('1121212', '343433', '3434344');
答案 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)
在我看来,作为一种解决方法,您应该创建一个控制文件并将数据从文本文件加载到临时表中,然后您可以使用批量收集将数据加载到数组中。