• 締切済み

viewの状態について

こんにちは。 viewについての質問です。 環境構築について、table、view等を作成しています。 その際、viewを作成する際に、viewを呼んで作成されるパターンがあります。※呼ばれるviewはまだ作成されていない時です。 この時もちろんエラーになるのですが、このviewをリコンパルする時に、ソースを再実行以外に何か良いコマンド等ないでしょうか? ex)リコンパイル view名 みたいな感じです。 また、viewが正常に作成されているかどうかがわかるコマンド等ご存知でしたら教えて頂けないでしょうか? 宜しくお願い致します。

みんなの回答

  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.2

質問のお答えとしては、NO.1さんのおっしゃる通りとなります。 なお、"CREATE OR REPLACE VIEW FORCE"と、FORCEオプションはつけておられますよね。でないと、コンパイルエラー時にビューの作成自体に失敗してしまうので、「INVALIDなビューを探してリコンパイル」という方法が取れません。 <おすすめの手順> 1.FORCEオプション付きで全ビュー作成 (すべてひととおりのオブジェクトが作成された後) 2.dba_objects・user_objectsなどシステムテーブルから、STATUSがINVALIDのものだけ抜き出してリコンパイル(PL/SQLプロシージャか、スクリプト化しておくとよい。) ※依存関係の階層が深い場合は、2を2回以上繰り返さないと、INVALIDがなくならない場合もあるので気をつけましょう。

teng046
質問者

お礼

uresiiwaさん ご回答ありがとうございます。 FORCEオプション、知らなかったです。勉強になります。 教えて頂いて恐縮ですが、「CREATE OR REPLACE FORCE VIEW」になるかと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

ALTER VIEW view_name COMPILE;  でコンパイルができます。  また、all_objects ディクショナリーviewで調べたいviewのレコードを検索してstatusフィールドを調べれば有効か無効か識別できます。  当然しかるべき権限は必要です。念のため

teng046
質問者

お礼

mitonekoさん ご回答ありがとうございました。 色々システムのviewを探したのですが、よくわからなく・・・。 all_objects の status ですね。 ありがとうございました。

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

関連するQ&A

  • ビューに追加・削除が出来ません。

    皆さん、はじめまして。 今回業務mysqlでデータベースを作成することになりました。 ビューを用いて二つのテーブルに値の追加・削除・更新をしようと試みたのですが、追加、削除が上手くできませんでした。 mysqlのバージョンは5.0.37です。 今回以下のコマンドを実行しました。 1.<cwork1テーブル作成> create table cwork1 (testname1 varchar(255), testname2 varchar(255), primary key(testname1))TYPE=INNODB; primary key(id)); 2.<cwork2テーブル作成> create table cwork2 (r_name1 varchar(255), yakusyoku varchar(255), foreign key(r_name1) references cwork1(testname1) ON DELETE CASCADE ON UPDATE CASCADE )TYPE=INNODB; 3.<cwork1テーブルに追加> insert into cwork1(testname1,testname2) values('山田','太郎'); 4.<cwork2テーブルに追加> insert into cwork2(r_name1,yakusyoku) values('山田','一般'); 5.<ビュー作成> CREATE VIEW testview AS SELECT * FROM cwork1,cwork2 where cwork1.testname1=cwork2.r_name1; この5つを実行後、 <insert実行> insert into testview(testname1,testname2,yakusyoku) values('斉藤','花子','一般'); ERROR 1395 (HY000):Can not modify more than one base table through a join view 'sampledb.testview' <delete実行> delete from testview where testname1='山田'; ERROR 1395 (HY000): Can not delete from join view 'sampledb.testview' というようにinsert、delete文実行時にエラーが帰ってきてしまいます。 原因がわかるかたがいらっしゃいましたらご教授のほうよろしくお願いします。

    • ベストアンサー
    • MySQL
  • サブフォームのビューを切り替えたい

    親フォーム(フォーム1)にサブフォームとして、 テーブルをソースとするサブフォーム(テーブル1のサブフォーム)を配置しました。 親フォームからサブフォームのビューを変更したいのですが どうすればいいか教えてください。 親フォームのコマンドボタンにはそれぞれ Private Sub 単票フォームへ切り替え_Click() Me.Controls("テーブル1のサブフォーム").Form.DefaultView = 1 '帳票フォーム End Sub Private Sub 帳票フォームへ切り替え_Click() Me.Controls("テーブル1のサブフォーム").Form.DefaultView = 0 '単票フォーム End Sub としたのですが、 実行すると 実行時エラー 2136 "このプロパティを設定するには、フォームまたはレポートをデザインビューで開きます"。 となってしまいます。 Private Sub 帳票フォームへ切り替え_Click() DoCmd.SelectObject acForm, "テーブル1のサブフォーム" DoCmd.RunCommand acCmdFormView End Sub にしたところ、 実行時エラー 2489 “オブジェクト テーブル1が開いていません、” になります。 サブフォームに埋め込んでいて親フォームを開いていても 開いてない事になるのですね。 フォームビューの時に、切り替える事は不可能なのでしょうか? 帳票ビュー表示用フォーム、 単票ビュー表示用フォーム を作るしかないのでしょうか?

  • 無名ブロック内でのDDL実行について

    環境は Linux + oracle 10g R2です。 簡単な無名プロシージャを書いていてはまって しまいました。 分かる方でしたら、あっというまに指摘していただけそうなので こちらに質問しました。 無名ブロック内で以下の事を行いたいのですが、うまく動作を確認できません。 ※以下は意味の無い処理となっていますが、今回説明用に短くしてみました。 ◇実現したい事 1.CREATE TABLE文の実行 (ここではEX01テーブルを作成します) 2.CREATE したテーブルにたいしてINSERT 3.CREATE したテーブルのDROP ◇私の実行結果 $ sqlplus scott/tiger@orcl SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME ='EX01'; レコードが選択されませんでした。 -- 私の思いでは以下のプロシージャは正常に動作するのでは? -- と思うのですが、以下の通りエラーとなってしまいます。 -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))'); 3 INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); 4 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01'); 5 END; 6 / INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); * 行3でエラーが発生しました。: ORA-06550: 行3、列13: PL/SQL: ORA-00942: 表またはビューが存在しません。 ORA-06550: 行3、列1: PL/SQL: SQL Statement ignored -- -- なので、処理を分割して行ってみました。 -- まずはCREATE TABLEのみ -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))'); 3 END; 4 / PL/SQLプロシージャが正常に完了しました。 -- -- CREATE TABLEは正常に動作したようです。 -- SQL> INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); 1行が作成されました。 -- -- INSERT文も正常に動作したようです。 -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01'); 3 END; 4 / PL/SQLプロシージャが正常に完了しました。 -- -- なんとDROP TABLEも正常に動作したようです。 -- SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME ='EX01'; レコードが選択されませんでした。 SQL> そうなんです。3行まとめて記載するとエラーとなるのですが、 上記の通りそれぞれ分けて実行すると正常に動作するのです。 これはどこが悪いのでしょうか? 情けない事に、今日の午後はこれでほとんどつぶれてしまいました。 どなたか助けてください。 以上よろしくお願いします。

  • ビューにインデックスを設定できませんか?

    SQL Server 2005 EXPRESS を使用しています。 トランザクションのテーブルにマスタを結合して表示するビューを作成しました。 実際に利用する時はトランザクションテーブルの主キーを検索に多用すると予想されるので、該当のフィールドにインデックスを設定したいのですが… Management Studio でインデックスを設定しようとするとエラーになります。 エラーメッセージは インデックス '' の作成に失敗しました。 (Microsoft.SqlServer.Express.Smo) ------------------------------ ADDITIONAL INFORMATION: Transact-SQL ステートメントまたはバッチの実行中に例外が発生しました。 (Microsoft.SqlServer.Express.ConnectionInfo) ------------------------------ ビュー 'View' に インデックス を作成できません。ビューにはスキーマがバインドされていません。 (Microsoft SQL Server, Error: 1939) となっています。まさにメッセージのとおりだとは思うのですが 「ビューにスキーマをバインドする」方法がわかりません。 どなたかご教授いただければ助かります。 よろしくお願いいたします。

  • 【JAVA】与えられた金額を貨幣にした時の紙幣と硬貨の枚数を算出し、表示するプログラムを作成

    今JAVAの勉強中です。 下記の問題が与えられて、うまくできなくて、ソースを教えて頂きたいです。 問題: 与えられた金額を貨幣にした時の紙幣と硬貨の枚数を算出し、表示するプログラムを作成してください。 0枚の紙幣、硬貨に関しては表示されないように。 【ヒント】 今回のプログラムではユーザの操作により金額が与えられます。 その際にすべきエラー処理を忘れずに組み込むこと。 【引数の渡し方】 コマンドプロンプトより下記のようにコマンドを実行することにより金額をプログラム外部から渡すことができる。 java ex 1117823

    • ベストアンサー
    • Java
  • ORACLE10g VIEW UNION

    VIEW同士をUNIONすることは可能でしょうか? というより、実行してみたのですが、データ型が一致していない列があり出来ませんでした。 View作成時にのデータ型を設定する方法などはあるのでしょうか? 識者の方がいればご教示いただきたいです。 よろしくお願いいたします。

  • CLASSファイルの他UNIX上での動作について

    こんにちわ。早速なんですけど、教えて下さい。 以下のことを行った場合、 (1)javaソースをHP-UNIX上でコンパイル後、圧縮。 (2)windows2000にダウンロード後、CDに焼く。 (3)Solarisで解凍し、実行環境に投入。 で、Solarisで正常に動作するでしょうか? javaだから出来るような気もするんですけど、やっぱりリコンパイルは必要な気もして。 よろしくお願いします。

    • ベストアンサー
    • Java
  • コマンド結果のリダイレクト

    UNIXコマンドで「sar」がありますが、 その中のオプション「-o」を使用しないで ファイルにリダイレクトをしたいです。 なお、その際にバックグランドで実行しています。 sarコマンドは長時間動かし途中でリダイレクト結果をviewなどで見たいのですがどうしたらよいでしょうか? ex) sar 5 10000 > log.txt & これだと、sarコマンドが終了しないとlog.txtに出力されません。いつでもviewなどで最新のlog.txtを見たいです

  • Visual C++でC言語の基礎学習

    Visual C++を使ったC言語についての質問です。 (アプリケーションの作成ではなく、コマンドプロンプト上で起動する基礎的な文法の学習です) Win32コンソール プロジェクトを作成し、そのプロジェクトの中でCのソースファイルを作成して実行確認をしようと思っています。 プロジェクト内のソースファイルが1つだけだと正常にビルドできますが、2つ以上のソースファイルを作成してビルドすると 「1 つ以上の複数回定義されているシンボルが見つかりました。」 というエラーがでてしまい、実行することができません。 新たにWin32コンソール プロジェクトを作成し、その中でソースファイルを作成しなければ実行できないのでしょうか? よろしくお願いします。

  • 異なるスキーマのビューを元にしたマテリアライズドビューの作成

    「所有していないマテリアライズド・ビューのマスター表にアクセスする場合は、各表に対するSELECTオブジェクト権限またはSELECT ANY TABLEシステム権限が必要です。」 ということから、selectオブジェクト権限をつけた『ビュー』をもとに、マテリアライズドビューの作成はできないのでしょうか? 例)Aスキーマが所有するTESTビュー表をもとに、Bスキーマでマテリアライズドビューを作成する。 create materialized view mview as select * from A.TESTビュー; create materialized view 権限は付与しました。 A.TESTビューに対するSELECTオブジェクト権限は付与しました。 結果としては、表またはビューがありません。とエラーがでます。 しかし、Aスキーマが所有するテーブルに対しては、問題なくマテリアライズドビューの作成はできます。 異なるスキーマの『ビュー』を元にマテリアライズドビューの作成は できない。といった記述はないのですが、実際に作成ができません。 ご教授ください。

年配者のパソコン上達法は
このQ&Aのポイント
  • 年配者がパソコンを上達するための方法とは?
  • パソコンを再び使いこなすためのアドバイスを教えてください。
  • 脳の老化現象を抑えるにはパソコンが良いと聞きました。
回答を見る