如何通过 SQLPlus 将 SQL 脚本附加到 bash 循环?
How attach the SQL script by SQLPlus to the bash loop?
我想通过 sqlplus[从所有数据(Table_with_DB(它在程序 sqldeveloper 中))中清除 table =44=] 并基于路径中的文件名 (path/to/files) 使用 SQLPlus 完成 table (Table_with_DB)路径中的文件名。
我创建了 2 个单独的 SQL 文件
(clear.sql ; register.sql)
和 1 与 bash (bashloop.sh)
clear.sql
BEGIN
package.clear('Table_with_DB');
END;
register.sql
BEGIN
package.register('folderName' , '&1);
END;
bashloop.sh
for i in path/to/files;
do
sqlplus -s userid/password@ @clear.sql
sqlplus -s userid/password@ @register.sql
done
我希望查询清楚 Table_with_DB 并将文件名从 path/to/files 转移到 Table_with_DB 使用 SQLPlus
但实际上它不起作用:(
如果我明白你想做什么,那么在你的 bashloop.sh 中你想用 $i[= 替换 db_name 14=] - 或者 ${i} 如果你有带空格的文件名。
循环中的 sqlplus 示例。
#!/bin/bash
username=system
password=passwordsystem
tns_alias=esmd
for i in /opt/oracle/example1/test*/file*.txt;
do
$ORACLE_HOME/bin/sqlplus $username/$password@$tns_alias <<EOF
SET SERVEROUTPUT ON SIZE 2000
BEGIN
dbms_output.put_line('$i');
END;
/
EOF
done;
示例输出
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL> SQL> 2 3 4 /opt/oracle/example1/test2/file2.txt
PL/SQL procedure successfully completed.
SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL*Plus: Release 11.2.0.3.0 Production on Tue Oct 22 13:59:24 2019
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL> SQL> 2 3 4 /opt/oracle/example1/test3/file3.txt
PL/SQL procedure successfully completed.
SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL*Plus: Release 11.2.0.3.0 Production on Tue Oct 22 13:59:24 2019
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL> SQL> 2 3 4 /opt/oracle/example1/test4/file4.txt
PL/SQL procedure successfully completed.
SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
oracle@esmd:~/example1>
我想通过 sqlplus[从所有数据(Table_with_DB(它在程序 sqldeveloper 中))中清除 table =44=] 并基于路径中的文件名 (path/to/files) 使用 SQLPlus 完成 table (Table_with_DB)路径中的文件名。
我创建了 2 个单独的 SQL 文件 (clear.sql ; register.sql)
和 1 与 bash (bashloop.sh)
clear.sql
BEGIN
package.clear('Table_with_DB');
END;
register.sql
BEGIN
package.register('folderName' , '&1);
END;
bashloop.sh
for i in path/to/files;
do
sqlplus -s userid/password@ @clear.sql
sqlplus -s userid/password@ @register.sql
done
我希望查询清楚 Table_with_DB 并将文件名从 path/to/files 转移到 Table_with_DB 使用 SQLPlus
但实际上它不起作用:(
如果我明白你想做什么,那么在你的 bashloop.sh 中你想用 $i[= 替换 db_name 14=] - 或者 ${i} 如果你有带空格的文件名。
循环中的 sqlplus 示例。
#!/bin/bash
username=system
password=passwordsystem
tns_alias=esmd
for i in /opt/oracle/example1/test*/file*.txt;
do
$ORACLE_HOME/bin/sqlplus $username/$password@$tns_alias <<EOF
SET SERVEROUTPUT ON SIZE 2000
BEGIN
dbms_output.put_line('$i');
END;
/
EOF
done;
示例输出
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL> SQL> 2 3 4 /opt/oracle/example1/test2/file2.txt
PL/SQL procedure successfully completed.
SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL*Plus: Release 11.2.0.3.0 Production on Tue Oct 22 13:59:24 2019
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL> SQL> 2 3 4 /opt/oracle/example1/test3/file3.txt
PL/SQL procedure successfully completed.
SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL*Plus: Release 11.2.0.3.0 Production on Tue Oct 22 13:59:24 2019
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL> SQL> 2 3 4 /opt/oracle/example1/test4/file4.txt
PL/SQL procedure successfully completed.
SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
oracle@esmd:~/example1>