0

UNDO テーブルスペースの統計を 6 時間ごとに 1 つのテーブルに保存したいと考えています。簡単なテーブルを作成しました:

CREATE TABLE SYS.TB_UNDOSTAT (
 MAX_UNDOBLKS NUMBER,
 MAX_QUERY_LENGTH NUMBER,
 MAX_QUERY_ID VARCHAR2(13),
 DATE_OF_STAT DATE,
 DMY_OF_STAT VARCHAR2(30),
 TIME_OF_STAT VARCHAR2(30)); 

その後、Oracle 外部ジョブを作成しました。

BEGIN
   DBMS_SCHEDULER.CREATE_JOB
        (job_name=>'ACCUMULATE_UNDOSTAT',
        repeat_interval =>'FREQ=DAILY; BYHOUR=05,11,17,23',
        job_type=>'EXECUTABLE',
        job_action=>'/home/oracle/scripts/UNDOSTAT/accumulate_undostat_111.bsh',
        enabled =>TRUE,
        auto_drop=>FALSE,
        comments=>'Take accumulate statistics from V$UNDOSTAT to 
        SYS.TB_UNDOSTAT one time through 6 hours On 111 Server'
        );
END;

Accumulate_undostat_111.bsh ファイルの内容は次のとおりです。

#!/bin/bash
export ORACLE_HOME=/u01/home/oracle/product/11.2.0/db_1
export ORACLE_SID=parustest
export PATH=$ORACLE_HOME/bin:$PATH 
sqlplus -s << EOF
/ as sysdba
INSERT INTO FGA_OWNER.TB_UNDOSTAT (MAX_UNDOBLKS, MAX_QUERY_LENGTH,
MAX_QUERY_ID, DATE_OF_STAT, DMY_OF_STAT, TIME_OF_STAT)
SELECT max(undoblks), max(maxquerylen), maxqueryid, sysdate, to_char(sysdate,'DD.MM.YYYY'), 
to_char(sysdate,'HH24:MI:SS') FROM SYS.V_$UNDOSTAT GROUP BY maxqueryid;
COMMIT;
exit;
EOF
exit 0

ジョブは問題なく作成されました。必要なすべての権限が付与されています。しかし、シェル スクリプトをデバッグすると、いくつかの問題が発生します。

[oracle@parustest111 UNDOSTAT]$ bash -o xtrace accumulate_undostat_111.bsh            + export ORACLE_HOME=/u01/home/oracle/product/11.2.0/db_1
+ ORACLE_HOME=/u01/home/oracle/product/11.2.0/db_1
+ export ORACLE_SID=parustest
+ ORACLE_SID=parustest
+ export PATH=/u01/home/oracle/product/11.2.0/db_1/bin:/u01/home/oracle/product/11.2.0/db_1/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin
+ PATH=/u01/home/oracle/product/11.2.0/db_1/bin:/u01/home/oracle/product/11.2.0/db_1/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin
+ sqlplus -s
to_char(sysdate,'HH24:MI:SS') FROM V_ GROUP BY maxqueryid
                                   *
ERROR at line 4:
ORA-00942: table or view does not exist


Elapsed: 00:00:00.00

Commit complete.

Elapsed: 00:00:00.00
+ exit 0
[oracle@parustest111 UNDOSTAT]$

誰かが私を説明して助けてくれますか?ありがとうございました!

4

1 に答える 1

1

UNIXシェルで$は、変数の開始であるため、ステートメント

FROM SYS.V_$UNDOSTAT 

シェルによって解釈される$UNDOSTATため、 という UNIX 変数が検索されますUNDOSTAT。これを防ぐには、ステートメントをエスケープする必要があります

FROM SYS.V_\$UNDOSTAT 

例えば:

$ cat foo.bash
#!/bin/bash

sqlplus /<<EOF
select count(*) from v$session;
EOF

$ ./foo.bash

SQL*Plus: Release 11.2.0.2.0 Production on Mon Jan 28 12:56:43 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

SQL> select count(*) from v
                     *
ERROR at line 1:
ORA-00942: table or view does not exist

対:

$ cat foo2.bash
#!/bin/bash

sqlplus /<<EOF
select count(*) from v\$session;
EOF

$ ./foo2.bash

SQL*Plus: Release 11.2.0.2.0 Production on Mon Jan 28 12:56:49 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options

SQL>
  COUNT(*)
----------
       184

それでもなお良いのですが、私があなただったら、SQL ファイルを別にして、それを呼び出すだけです

sqlplus -s << EOF
/ as sysdba
@yoursql.sql
COMMIT;
exit;
EOF

yoursql.sqlファイルにはすべてのSQL. その場合、エスケープすることを心配する必要はありません。

于 2013-01-28T12:55:23.763 に答える