如何将变量从bash传递给sqlplus

时间:2018-03-21 09:39:38

标签: linux oracle sqlplus

我在bash中有以下代码:

#/!bin/bash


USERS=tom1,tom2,tom3

我想从我的变量" USERS"中删除所有用户通过sqlplus

#/!bin/bash

USERS=tom1,tom2,tom3

sqlplus -s system/*** <<EOF
*some code*
DROP USER tom1 CASCADE;
DROP USER tom2 CASCADE;
DROP USER tom2 CASCADE;
EOF

请帮助

2 个答案:

答案 0 :(得分:0)

使用USERS变量使用sql / plsql在数据库中拆分很复杂,需要了解REGEXP函数,我不建议您这样做。此外,它还需要Dynamic Sql来执行drop查询。

我建议你在shell脚本中拆分它,创建一个脚本并在sqlplus中执行它

USERS="tom1,tom2,tom3"
    echo ${USERS} | tr ',' '\n' | while read word; do
        echo "drop user $word;"
    done >drop_users.sql

sqlplus -s system/pwd <<EOF
#some code
@drop_users.sql
EOF

答案 1 :(得分:0)

您的代码没有问题,除了Oracle DB的DDL命令,这些命令是从脚本文件的USERS参数派生的,调用userDrop.sh。要与USERS参数和DB建立适当的关系,应生成额外的文件(drpUsr.sql),并在EOF个标记内调用@个符号前缀

让我们按vi命令进行编辑:

$ vi userDrop.sh

#!/bin/bash
USERS=tom1,tom2,tom3

IFS=',' read -ra usr <<< "$USERS" #--here IFS(internal field separator) is ','
for i in "${usr[@]}"; do
  echo "drop user "$i" cascade;"
done > drpUsr.sql

#--to drop a user a privileged user sys or system needed.    
sqlplus / as sysdba <<EOF
@drpUsr.sql;
exit;
EOF

呼叫

$ . userDrop.sh

并且不要忘记通过DB的exit命令返回命令提示符。