使用Bash脚本在X时间内创建短和长的sqlplus连接

我需要使用sqlplus客户端和bash脚本创建与Oracle db的短/长连接10分钟(出于示例目的),两者之间的区别如下:

长时间连接:

  • 已建立连接
  • 连接每隔5到10秒就会执行某种查询
  • 10分钟后,客户端被终止

短连接:

  • 已建立连接
  • 进行查询
  • 连接已关闭
  • 重复该过程10分钟(连接打开和关闭,始终保持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个场景需要进行哪些调整?

plxlzzplxl 回答:使用Bash脚本在X时间内创建短和长的sqlplus连接

示例1。 您可以在后台运行脚本 <TextField classes={{ root: classes.root }} select name="userRoles" id="userRoles" variant="outlined" label="userRoles" SelectProps={{ multiple: true,value: formState.userRoles,onChange: handleFieldChange }} > <MenuItem value="admin">Admin</MenuItem> <MenuItem value="user1">User1</MenuItem> <MenuItem value="user2">User2</MenuItem> </TextField> 。在另一个会话中,发送sql文件或sql。使用sql之后重新连接。

pipe.sh

在backgroud中运行此脚本

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

在其他bash会话中,您可以将sql文件或sql发送到此backgroud进程。

   nohup ./pipe.sh  >pipe_log.log 2>&1  & 

更新。 示例2。 您可以在Oracle数据库服务器的后台运行脚本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,'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,'DD ------------------- 08-08-2019 14:50:49 SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production 。在另一个会话中,发送sql文件或sql。运行sql后无需重新连接。

pipev2.sh

测试

 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;
本文链接:https://www.f2er.com/3031164.html

大家都在问