我需要使用sqlplus客户端和bash脚本创建与Oracle db的短/长连接10分钟(出于示例目的),两者之间的区别如下:
长连接:
短连接:
我有一个基准,我需要针对上述情况(2个不同的bash文件)进行调整:
#!/bin/sh
for i in $(seq 1 10);
do
echo "CREATE TABLE oracle_BEQ_$i (id NUMBER NOT NULL);
! sleep 30
select * from oracle_BEQ_$i ;
! sleep 30
DROP TABLE oracle_BEQ_$i;" | sqlplus <user>/<password> &
done
wait
该脚本当前仅执行以下操作:
1)创建10个连接(同时)
2)运行3个查询
3)完成后,关闭连接
对于上述2种情况,我需要进行哪些调整?
最佳答案
示例1.
您可以在后台运行脚本pipe.sh
。然后在另一个 session 中,发送sql文件或sql。与重新连接后运行sql。
more pipe.sh
#!/bin/bash
rm /tmp/sqlplus_pipe.sql
mknod /tmp/sqlplus_pipe.sql p
while :
do
$ORACLE_HOME/bin/sqlplus "system/manager" <<EOF
@/tmp/sqlplus_pipe.sql
EOF
sleep 1
done
在backgroud中运行此脚本
nohup ./pipe.sh >pipe_log.log 2>&1 &
在其他bash session 中,您可以将sql文件或sql发送到此背景进程。
oracle@esmd:/tmp> cat test2.sql >>/tmp/sqlplus_pipe.sql
oracle@esmd:/tmp> cat test2.sql >>/tmp/sqlplus_pipe.sql
oracle@esmd:/tmp> echo "select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;" >>/tmp/sqlplus_pipe.sql
oracle@esmd:/tmp> echo "select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;" >>/tmp/sqlplus_pipe.sql
oracle@esmd:/tmp> more test2.sql
select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;
oracle@esmd:~> more pipe_log.log
SQL*Plus: Release 11.2.0.3.0 Production on Thu Aug 8 14:50:35 2019
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL>
TO_CHAR(SYSDATE,'DD
-------------------
08-08-2019 14:50:46
SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL*Plus: Release 11.2.0.3.0 Production on Thu Aug 8 14:50:47 2019
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL>
TO_CHAR(SYSDATE,'DD
-------------------
08-08-2019 14:50:48
SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL*Plus: Release 11.2.0.3.0 Production on Thu Aug 8 14:50:49 2019
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
SQL>
TO_CHAR(SYSDATE,'DD
-------------------
08-08-2019 14:50:49
SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
更新。
示例2.
您可以在Oracle数据库服务器的后台运行脚本
pipev2.sh
。然后在另一个 session 中,发送sql文件或sql。运行sql后无需重新连接。 nohup ./pipev2.sh >output.log 2>&1 &
#!/bin/bash
rm /home/trs/db2Toora/sql/sqlplus_pipe.sql
mknod /home/trs/db2Toora/sql/sqlplus_pipe.sql p
$ORACLE_HOME/bin/sqlplus "system/manager" <<EOF
SET SERVEROUTPUT ON
BEGIN
RUN_SQL;
END;
/
EOF
CREATE OR REPLACE DIRECTORY TEMP_DIR_CHANGE AS '/home/trs/db2Toora/sql'
/
GRANT READ ON DIRECTORY TEMP_DIR_CHANGE TO SYSTEM
/
GRANT WRITE ON DIRECTORY TEMP_DIR_CHANGE TO SYSTEM
/
CREATE OR REPALCE PROCEDURE RUN_SQL
is
sql_text VARCHAR2(2000);
file_sql_name VARCHAR2(100):='sqlplus_pipe.sql';
sql_delimiter VARCHAR2(1):=';';
stop_script VARCHAR2(10):='%QUIT%';
sql_output VARCHAR2(2000);
InFile utl_file.file_type;
vNewLine VARCHAR2(4000);
k pls_integer :=0;
BEGIN
dbms_output.enable;
while k <>1
loop
InFile := utl_file.fopen('TEMP_DIR_CHANGE', file_sql_name,'r');
LOOP
BEGIN
utl_file.get_line(InFile, vNewLine);
if vNewLine like '%'||sql_delimiter||'%' then
sql_text:=sql_text||vNewLine;
dbms_output.put_line(sql_text);
begin
execute immediate replace(sql_text,sql_delimiter,'' ) into sql_output;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('!---!--Error--!---!');
dbms_output.put_line(substr(sqlerrm, 1, 500));
end;
dbms_output.put_line(sql_output);
dbms_output.put_line('---------------------------------------------------------------');
sql_text:='';
elsif vNewLine like stop_script then
dbms_output.put_line('---!--QUIT--!---');
EXIT;
else
sql_text:=sql_text||vNewLine;
end if;
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
END;
END LOOP;
if vNewLine like stop_script then
exit;
end if;
end loop;
utl_file.fclose(InFile);
END;
测试
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> cat test2.sql >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql> echo 'QUIT' >sqlplus_pipe.sql
oracle@esmd:/home/trs/db2Toora/sql>
oracle@esmd:/home/trs/db2Toora/sql> more test2.sql
select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS')
from dual
;
select to_char(sysdate,'DD-MM-YYYY HH24:MI')
from dual
;
nohup: ignoring input
SQL*Plus: Release 11.2.0.3.0 Production on Tue Aug 13 10:11:23 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 select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;
13-08-2019 10:11:34
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI') from dual;
13-08-2019 10:11
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;
13-08-2019 10:11:35
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI') from dual;
13-08-2019 10:11
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;
13-08-2019 10:11:35
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI') from dual;
13-08-2019 10:11
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;
13-08-2019 10:11:36
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI') from dual;
13-08-2019 10:11
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;
13-08-2019 10:11:36
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI') from dual;
13-08-2019 10:11
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;
13-08-2019 10:11:37
---------------------------------------------------------------
select to_char(sysdate,'DD-MM-YYYY HH24:MI') from dual;
13-08-2019 12:19
---------------------------------------------------------------
---!--QUIT--!---
PL/SQL procedure successfully completed.
SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
关于linux - 使用Bash脚本在X时间内创建短和长的sqlplus连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59045640/