如何使用动态创建的 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
还要确保将引号 '
和双引号 "
转义为 \
,否则会出现一些错误。
我有来自在 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
还要确保将引号 '
和双引号 "
转义为 \
,否则会出现一些错误。