如何使用动态创建的 sql*loader 控制文件将并发程序(.prog 文件)中的参数插入到 table

How to Insert parameter from Concurrent Program(.prog file) into a table using sql*loader control file created dynamically

我有来自在 Oracle 应用程序中创建的主机程序的 .prog 文件。我正在使用主机程序从 oracle 应用程序发送一个参数,我可以像这样在 .prog 文件中访问它,例如

echo "5 Concurrent Program Parameter 1 : "

我需要在控制文件 (.ctl) 中使用此参数 ($5),我将在其中插入一些列并将此参数插入新的 table。例如

LOAD DATA
INSERT INTO TABLE TABLE_NAME
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
COL1,
COL2,
DATA_FROM_PROG (5) => ** here i need to insert that data from the .prog file**
)

我认为它必须以某种方式包含在此命令中,以便它动态创建此控制文件或另一个控制文件,但我不知道如何发送该参数并使其工作。 我熟悉这条线,我过去用它来解决更简单的问题

例如sqlldr userid=user/pass data= control=control.ctl

谢谢。

我不知道,因为我对 Oracle 应用一无所知。也不是“.prog”文件。

解决方法 - 在我看来 -

  • 仅加载已知数据(来自源文件)
  • data_from_prog 将被指定为 filler 字段(并填充 NULL 值(如果指定了 trailing nullcols))
  • 加载会话结束后,更新 来自 Oracle 应用程序的该列。 - 然后你会使用一个简单的 update 语句;你在 (PL/)SQL world,很容易写出这样的查询(至少,我希望如此)

使用 .prog 文件中的 Bash 脚本从头开始动态创建控制文件 (.ctl) 似乎可行,我也可以使用这些参数。 所以在 .prog 文件中我们会有:

echo "5 Concurrent Program Parameter 1      : "  /*this is only to test it*/

/* *Printf* with *>* command will create and edit a file.
Alternative *Printf* with *>>* would append to the file*/

printf "LOAD DATA\n
INFILE 'path_to_csv_file.csv'\n /*this is data for col1, col2 etc*/
INSERT INTO TABLE TABLE_NAME\n
FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'\"\'\n
TRAILING NULLCOLS\n
(COL1,\n
COL2,\n
DATA_FROM_PROG CONSTANT )" > [name and path to control file (e.g./folder/control.ctl)]

这样,当执行 .prog 文件时,它将动态创建 .ctl 文件,其中将包含我们想要的参数 (${5})。 我们还可以将类似的内容添加到 运行 .ctl 文件

sqlldr userid=user/pass control=[path_to_control]control.ctl log=track.log

还要确保将引号 ' 和双引号 " 转义为 \,否则会出现一些错误。