【问题标题】:generate dynamic script with ksh and sql使用 ksh 和 sql 生成动态脚本
【发布时间】: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';
...
...

【问题讨论】:

    标签: sql oracle11g ksh


    【解决方案1】:

    如果您想使用带减号的参数,请参阅 learn about getopts。当你懒惰时,你可以使用固定位置: ./gen_query.ksh db1 db2 /u01 /u02 /u03 /u04 并通过以下方式获取变量:

    if [ $# -lt 3 ]; then
       echo "Usage: $0 olddb newdb mount(s)"
       exit 1
    fi
    # assign the first 2 vars
    olddb=$1
    newdb=$2
    # Move "pointer" in the arglist
    shift 2
    # Split remaining args on a space
    for mnt in $*; do
            echo "my sql for dbold ${olddb} to dbnew ${newdb} for mount ${mnt}"
    done
    

    【讨论】:

      猜你喜欢
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 2021-06-01
      • 1970-01-01
      • 2013-05-03
      • 2011-11-24
      • 2016-09-14
      相关资源
      最近更新 更多