• ベストアンサー

DBMS_STATS.GATHER_DATABASE_STATSの使い

DBMS_STATS.GATHER_DATABASE_STATSの使い方がわかりません。 PLSQLで下記のように入力して実行しましたが、1時間経っても結果が返ってきません。  BEGIN   DBMS_STATS.GATHER_DATABASE_STATS (     OPTIONS => 'GATHER'    ,CASCADE => TRUE   ) ;  END; 記述が間違っているのでしょうか? DBMS_STATSの使い方がわかっていないのですが、プロシージャに埋め込まないとダメなものなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.1

まず、回答としては、実行の仕方は合っています。 わざわざプロシージャを作る必要はありません。 質問者様の習熟度合いがわからないので一応書きますが、上記の無名PL/SQLブロックをSQL*Plus上にペーストした、と言う事でよろしいでしょうか? この状態だとバッファに読み込まれただけで実行はされていないので、最後にスラッシュが無いと実行されません。 BEGEN … END; / そうではなくて、既に実行したのが結果が返って来ないと言う意味でしたら、GATHER_DATABASE_STATSで、GATHER CASCADE だと、相当時間が掛かるはずです。 普通は、cronかタスクスケジューラで仕掛けて夜間に走らせるような処理ですので

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

記載の記述内容で間違っていないです。プロシージャに埋め込む必要もありません。 記載内容をコピペして全角スペースを消したら当方の環境(10.2.0.1)で正常に処理できました。 4分くらいで完了しましたが。 DBの規模がわからないのですが、ただ純粋に処理に時間がかかっているだけなのではないしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ストアドプロシージャからアナライズをしたいです

    どなたかアドバイス願います。 ストアドプロシージャから「DBMS_STATS.GATHER_TABLE_STATS」パッケージを使って アナライズをやりたいと思っているのですができません。 以下のSQLをSQL*Plusから実行するとうまく動作するのですが、 プロシージャから「EXECUTE IMMEDIATE」を使って動作させると コンパイルエラーとなってしまうのです。 ※本当はテーブル名を動的に変更したいと考えているのですが、まずはコンパイルを 通したいと思いまして以下サンプルとしています。 (SQL*Plus経由で以下を実行すると動作します) exec DBMS_STATS.GATHER_TABLE_STATS (OWNNAME=>'SCOTT',TABNAME=>'EX001',METHOD_OPT =>'FOR ALL INDEXED',CASCADE => TRUE); (コンパイルエラーとなるプロシージャ) CREATE OR REPLACE PROCEDURE TEAT01 AS BEGIN EXECUTE IMMEDIATE DBMS_STATS.GATHER_TABLE_STATS (OWNNAME=>'SCOTT',TABNAME=>'EX001',METHOD_OPT =>'FOR ALL INDEXED',CASCADE => TRUE); END TEAT01; (エラーメッセージ) Error(3,19): PLS-00222: この有効範囲内に、名前GATHER_TABLE_STATSの関数は存在しません。 以上よろしくお願いします。

  • PL/SQLプロシージャの実行方法

    shスクリプトからplsql ID/PASSWORD@SID @plsql.sql コマンドにてplsql.sqlファイルに記述したPROCEDUREを実行しようと すると、 プロシージャが作成されました。 SQL> となって入力待ちとなり、実行されません。 ごく基本的な質問かもしれませんが、 どうやったらPROCEDUREを実行できるのでしょうか。

  • DBMS_OUTPUT.PUT_LINEを実行したらすぐに画面表示する

    DBMS_OUTPUT.PUT_LINEを実行したらすぐに画面表示する方法 Oracle 10g を SQLPLUS で使っています。 ストアドプロシージャ内に多数のDBMS_OUTPUT.PUT_LINEを記述しておりますが、プロシージャが終了しないとDBMS_OUTPUT.PUT_LINEの出力結果がが画面表示されません。 たとえば10分の処理だと10分後にまとめてDBMS_OUTPUT.PUT_LINEの表示がされるのですが、DBMS_OUTPUT.PUT_LINEが実行されたタイミングでリアルタイムに画面表示する方法はありますか?

  • PLSQLのCASE文でNULLを評価する際の動作について

    PLSQLのCASE文でNULLを評価する際の動作について PLSQLのCASE文でNULLを評価する時、下記の例1ではNULLを判定できず、 例2を使えばNULLを判定できました。 問題は解決したのですが理屈がわかりません。 ご存知の方、教えてください。 --例1 DECLARE MOJI VARCHAR2(1); BEGIN CASE MOJI WHEN NULL THEN DBMS_OUTPUT.PUT_LINE('NULL DESU'); ELSE DBMS_OUTPUT.PUT_LINE('NULL DEHA NAI'); END CASE; END; --例2 DECLARE MOJI VARCHAR2(1); BEGIN CASE NVL(MOJI,' ') WHEN ' ' THEN DBMS_OUTPUT.PUT_LINE('NULL DESU'); ELSE DBMS_OUTPUT.PUT_LINE('NULL DEHA NAI'); END CASE; END;

  • ストアドプロシージャのbegin、end

    下記の様なストアドプロシージャを作成し、VB側から実行させています。 どうしても、★SQL文2★の後のreturn文を実行してくれません。 (VB側ではreturn値が0と判断します。) このreturn文を★SQL文2★の前に移動すると、return値が-1として正常に取得できます。 begin、endのブロックの記述に何か間違いがあるのでしょうか? 環境:sqlserver2000,windows2000,vb6 よろしくお願いします。 CREATE PROCEDURE [sp_AAA] @PARAM1 varchar(16) AS begin if (~) begin ★SQL文1★ if (@@ERROR <> 0) begin return @@ERROR end end ★SQL文2★ return -1 ←ココ end

  • 実行されない

    アクセス初心者です プロシージャの実行をしても 答えがでてきません 何が必要なのでしょうか Option Compare Database Public Function Doreka() Doreka = 1 * 3.305785 End Function

  • PL/SQL 実行中のSID

    自作のストアドプロシージャのどの関数がいつ呼ばれたかを記録したいと思いました。 例えば FUNC_A という関数があって、その関数の先頭で、その関数を実行しているセッションのSIDと関数名を取得できないものでしょうか。 そのようなパッケージ DBMS_**** みたいなものがあって、下記のような感じで使えたらなあと考えています。 ------------------ FUNC_A IS sid NUMBER; funcName VARCHAR2(30); BEGIN SELECT DBMS_****.GET_EXECUTING_SID INTO sid FROM DUAL; SELECT DBMS_****.GET_CURRENT_FUNC INTO funcName FROM DUAL; ... (sid と funcName を現時刻とともに記録) END; ------------------ このような目的に合致したパッケージ、あるいはこの目的を実現する方法などありますでしょうか。 よろしくお願いします

  • プロシージャの実行方法

    テキストファイル(test.txt)から文字列を一行ずつ読み込んでDBMS_OUTPUTで表示を最後の行まで繰り返すプロシージャを作りたいのですが、プロシージャ制作までは出来るのですがプロシージャの実行が出来ません。 原因が理解できないのですが返答をお願いします。 create or replace procedure TXT_R as FH UTL_FILE.FILE_TYPE; V_LINE VARCHAR2(32767); BEGIN FH := UTL_FILE.FOPEN('DATA_PUMP_DIR','test.txt','R'); LOOP UTL_FILE.GET_LINE(FH,V_LINE); DBMS_OUTPUT.PUT_LINE(V_LINE); END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(FH); END TXT_R; ここまでプロシージャです。 そしてネットで調べた結果引数が無い時は書かなくていいと書かれていたのですが、 exec TXT_R; で実行すると ORA-00900: SQL文が無効です。 となってしまいます。

  • PL/SQLのプロシージャが動かない

    テキストファイル(test.txt)から文字列を一行ずつ読み込んでDBMS_OUTPUTで表示を最後の行まで繰り返すプロシージャを作りたいのですが、declareで実行する時は何の問題も出ないのにプロシージャを作ろうとするとエラーが発生します。 原因が理解できないのですが返答をお願いします。 create or replase procedure TXT_R as FH UTL_FILE.FILE_TYPE; V_LINE VARCHAR2(32767); BEGIN FH := UTL_FILE.FOPEN('DATA_PUMP_DIR','test.txt','R'); LOOP UTL_FILE.GET_LINE(FH,V_LINE); DBMS_OUTPUT.PUT_LINE(V_LINE); END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(FH); END; 実行すると ORA-00905: キーワードがありません。 のエラ-が出ます

  • PL/SQLでエラー

    PL/SQLの使用方法を検討しており、下記のようにサンプルを作成しました。 //1. 宣言部 create or replace package Pac is procedure Pro1(p1 in varchar2); end; / パッケージが作成されました //2. 本体 create or replace package body Pac is procedure Pro1(p1 in varchar2) is tempdate DATE; begin select to_char(sysdate, 'yyyy/mm/dd') INTO tempdate from dual; DBMS_OUTPUT.PUT_LINE('引数は' || p1 || 'です。'); DBMS_OUTPUT.PUT_LINE('日付は' || tempdate || 'です。'); end; end; / パッケージ本体が作成されました //3. 実行 execute Pac.Pro1('a'); // エラー内容 行1でエラーが発生しました。: ORA-00900: invalid SQL statement SQLPlusより、上記の[1. 宣言部]でパッケージを作成し、[2. 本体]で本体部分を作成しました。 その後、[3. 実行]を実施しましたが、 エラーが出力されて実行されません。 何がいけないのかお気づきの点がございましたら、 よろしくお願いします。