【发布时间】:2015-12-18 16:17:10
【问题描述】:
数据库:甲骨文
我正在接受来自用户输入的文件系统名称,并希望在 sql 查询中使用该值来生成动态脚本来恢复数据文件。
如果我知道文件系统名称将是什么,但试图弄清楚如何获取用户输入值并将其放入 sql 查询中,我可以生成动态脚本?
Runtime: ./gen_query.ksh -oldDB db1 -newDB db2 -mt /u01, /u02, /u03, /u04
-oldDB -newDB -mt 的值由用户输入。
-mt 值将用逗号分隔 ","
-mt 的值可能与用户不同,可以只有两个挂载,也可以是三个或四个,并且可以从任何内容开始(例如 /u01 或 /u06 等),因此我无法对它们进行硬编码。
我认为我需要将-mt 值切分并将它们存储到另一个变量中并使用这些变量来生成查询。
这样的事情可能吗?
动态查询:
#!/bin/ksh
LOG_FILE = test_gen_query.log
exec >> $LOG_FILE 2>&1
gen_query=
SELECT 'set newname for datafile '''
|| file_name
|| ''' to ''/u01 or /u02 or /u03 or /u04'
|| replace to_char(mod(rownum, 4)
|| replace(substr(file_name, 5, length (file_name)),'$2','$4')
|| ''';'
FROM (
SELECT file_name, bytes from dba_data_files
ORDER BY bytes desc
)
/
Sample output required:
set newname for datafile '/u40/oradata/db1/test1.dbf' to '/u01/oradata/db2/test1.dbf';
set newname for datafile '/u40/oradata/db1/test2.dbf' to '/u02/oradata/db2/test2.dbf';
set newname for datafile '/u41/oradata/db1/test3.dbf' to '/u03/oradata/db2/test3.dbf';
set newname for datafile '/u40/oradata/db1/test4.dbf' to '/u04/oradata/db2/test4.dbf';
set newname for datafile '/u40/oradata/db1/test5.dbf' to '/u01/oradata/db2/test5.dbf';
set newname for datafile '/u40/oradata/db1/test6.dbf' to '/u02/oradata/db2/test6.dbf';
...
...
【问题讨论】: