最大35,000円進呈!IPoEはOCN光

OracleツールのJDeveloperを使って、PL/SQLでストアドプロシジャを作成しています。
(Oracleは9i)

DBが2つありまして(DB-AとDB-Bとする)、
DB-Bから、データベースリンクを介してDB-Aのテーブルを参照しています。
(SELECT * FROM XXXXX.テーブル名@データベースリンク名)

DB-Bに接続してSQL*PLUS上で上記SELECT文を実行すると正しく処理されるのですが
上記SELECT文が組み込まれているDB-B上のプロシジャをコンパイルすると、
「ORA-04052」が返ってきてしまいます。

エラーコードを調べると、
DB-A側のテーブルを参照できていないようで、
「KGLR.SQLが実行されていることを確認してください」とのことなのですが、
この「KGLR.SQL」とやらが何者かわかりません。

タチの悪いことに、上記の現象が出る端末と出ない端末があります。
みんな同じIDでログインしているので権限の問題ではないと思ってるのですが・・・

「KGLR.SQL」は置いといて、このような事象に出くわしたことのある方、
推測でもなんらかの情報をお持ちの方がいらっしゃいましたらご教授ください。

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

catrpc.sqlですがクライアントにはインストールされませんのでサーバー側にしかありません。

もしも、サーバー側も検索されたとなるとインストールに失敗している恐れがあるかも...。(あまり不安にはならないでください。)
あった場合の実行方法ですが、
1.SQL*Plusを起動
2.sysで接続(conn sys/[passwrod]@[dbname])
3.実行(@c:\oracle\ora92\rdbms\admin\catrpc.sql)
また、不明点がありましたら、補足お願いします。
    • good
    • 0
この回答へのお礼

再度、ありがとうございます。
いろいろサイトで調べていたら、「catproc.sql」が出てきて、
desc ORA_KGLR7_DEPENDENCIES で記述が出てこなかったらカタログされていないので
「catproc.sql」を流してみたらどうか・・・というのが載っていました。
そこで、desc~を実行したところ、記述が出てきたので、catproc.sqlは実行済のようです。

この現象が発生する端末と発生しない端末があるので、
Oracleクライアントの設定に問題ありなのかとも考えています。
見当はつきませんが・・・

お礼日時:2006/02/24 21:31

またまたですが、


1.catproc.sqlとcatrpc.sqlは別物です。
2.catproc.sqlはOracleのToolでDBを作成したときに自動で流されるシステム用のPL/SQLです。厄介なことにcatproc.sqlは時たま壊れたりしますので、流しなおしは有効です。ちなみに、壊れている場合(validate=false)でもdescで表示されるはずです。両方再度流すことをお勧めします。
    • good
    • 0
この回答へのお礼

三度ありがとうございます。

サーバー側の処理のため勝手にできない環境なので保守契約先にいろいろ確認してみます。

お礼日時:2006/03/06 21:42

[ora_home]\RDBMS\ADMINのcatrpc.sqlに


Rem glumpkin 10/20/92 - Renamed from KGLR.SQL
とコメントがあります。
ひょっとすれば、catrpc.sqlを再度実行(sysユーザーのみ)すればよいかもしれません。保障とかはできませんが...。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
残念ながら、catrpc.sqlがありませんでした。
(ora_home以下で検索しても・・・)
ちなみにあったら、これをどのように実行すればよいのでしょうか?

お礼日時:2006/02/24 00:04

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qoracleで別のグローバルデータベースのテーブルからPL/SQLでデータをinsertする方法。

こんにちは。

別の場所に設置してあるoracleのデータベースからinsert文でデータを引っ張って来れないかと思っています。

ご存知の方いらっしゃれば宜しくお願い致します。

内容:
ここのoracleです。
グローバルデータベース名:testa.ok.com
(データベース名:testa)
スキーマ名:output
テーブル名:名称マスタ
項目内容:番号、名前
ユーザ名:tosi
password:tosi

あっちのoracleです。
グローバルデータベース名:testb.ok.com
(データベース名:testb)
スキーマ名:input
テーブル名:名称マスタ
項目内容:番号、名前
ユーザ名:tosi
password:tosi

PL/SQLで出来ないものでしょうか?
宜しくお願い致します。

Aベストアンサー

こんにちわ。

データベースリンクを使用すれば可能です。
まず、あっちのデータベース (testb.ok.com) に接続
するための接続文字列をtnsnames.ora に定義します。
→ sqlplus tosi/tosi@接続文字列 でtestb.ok.com
  に接続できる事を確認して下さい。

次にtesta.ok.com 側にデータベースリンクを作成します。
Create database link DBリンク名
 connect tosi identified by tosi using '接続文字列';
→ select ~ from input.名称マスタ@DBリンク名
  where ~
 で、データベースリンク経由でデータにアクセスできること
 を確認して下さい。

後は、SQL 文 (PL/SQL でも可) の中で
Insert into 名称マスタ select * from
 input.名称マスタ@DBリンク名 where ~;
とすれば、Ok です。

QDBリンク経由の参照について

サーバ【A】のスキーマ【あ】にDB【テーブル1】があります。
サーバ【A】のスキーマ【い】に、【あ】からセレクト権限を与えた所、【い】から【テーブル1】を参照できるようになりました。

次に、
サーバ【B】からサーバ【A】にDBLINKをはりました。
(tnspingで接続されているのを確認済)。
これで、
サーバ【B】のスキーマ【あ】からDBLINK経由で【テーブル1】を参照できるようになりました。

しかし、サーバ【B】のスキーマ【い】から【テーブル1】が参照できません。

私としては、スキーマ同士の権限を与え、DBLINKが正しく繋がっているので、参照できるのでは??と思うのですが、
何度やっても、
---------------------------------------------------------------
ORA-04043: オブジェクト"【あ】"."【テーブル1】"は存在しません。
---------------------------------------------------------------
が表示されてしまいます。

原因として何が考えられるでしょうか…??
説明不足だったらすみません。
何か考えられる可能性があったら教えて下さい。

サーバ【A】のスキーマ【あ】にDB【テーブル1】があります。
サーバ【A】のスキーマ【い】に、【あ】からセレクト権限を与えた所、【い】から【テーブル1】を参照できるようになりました。

次に、
サーバ【B】からサーバ【A】にDBLINKをはりました。
(tnspingで接続されているのを確認済)。
これで、
サーバ【B】のスキーマ【あ】からDBLINK経由で【テーブル1】を参照できるようになりました。

しかし、サーバ【B】のスキーマ【い】から【テーブル1】が参照できません。

私としては、ス...続きを読む

Aベストアンサー

データベースリンクの定義が適切ではないのだと思います。

サーバBからサーバAへのデータベースリンクでの権限は、
データベースリンク定義に書かれているユーザで決まります。

どのような定義にしたんですか?

Qデータベースリンクとシノニムについて

現在以下の様な状態で、サーバAのスキーマAからサーバBのテーブルを参照しています。
DBLINK(A)を外すとサーバAのスキーマAからサーバBのテーブルをSELECTする事が
出来なくなってしまいますか?
スキーマAでサーバBの必要なテーブルが
全てシノニムで定義されていたので、イメージ的に
スキーマBのDBLINKが残っていれば
サーバAのスキーマA→スキーマB→サーバBのテーブルって感じで
参照出来そうな気がするのですが、どうなのでしょうか?

サーバAのスキーマA → DBLINK(A) → サーバB
 ↓
シノニム
 ↓
サーバAのスキーマB → DBLINK(B) → サーバB

Aベストアンサー

スキーマA君がDBLINK(B)を使える権限さえあれば、問題ないように思いますが、
何か発生しましたかね?

なお、そもそもDBリンクオブジェクトはDBインスタンスに帰属するもので、スキーマの所有物のイメージではないと思います(^^)

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

QSYSユーザーでログインしたい

SQL plusでSYSユーザーでログインするにはどうすればよいのでしょうか?
SYSTEMユーザーやSCOTTユーザーではログインできるのですが、SYSユーザーになる方法がわかりません。
お願いします。

Aベストアンサー

>SQL plusでSYSユーザーでログインするにはどうすればよいのでしょうか?
特別なことする必要がないと思います。
ログインできない場合いろいろな原因が考えられます。
一番可能な原因は設定によってSYSユーザーNOMAL権限でログインできない場合あります。
この場合
sqlplus sys/パスワード@接続文字列 as sysdba
で試してください。


>SYSTEMユーザーやSCOTTユーザーではログインできるのですが、SYSユーザーになる方法がわかりません。
conn sys/パスワード@接続文字列 as sysdba

Qバインド変数について

PL/SQLのバインド変数について調べていますが理解できず困っています。

[理解内容]
1.利点
 :SQL文の検索にバインド変数を利用すると、同一のSQLとして実行できる
  ⇒ 繰り返し処理(ループ)では有効

2.使用方法
 :静的SQL・動的SQLで使用可能 

 [疑問点]
  静的SQLではバインド変数をどう宣言すればよいですか?
  [SQL*Plus]・[動的SQL]は例文がありました

  ●SQL*Plusでの宣言方法

   (例)
    SQL> set null '<null>'
    SQL> set head off
    SQL> variable var_at_sqlplus number

  ●動的SQLの記述方法

   (例)
    declare
     v_sql varchar2(256);
     v_id varchar2(3);

    begin
     v_sql = 'select id into :v_id from test';
     execute immediate v_sql into v_id;
    end;

  ●静的SQL ・・・【 エラーになる 】

    declare
     variable v_id varchar2(3);

    begin
     select id into :v_id from test'
    end;


どんな事でもかまいませんので回答よろしくお願いします

PL/SQLのバインド変数について調べていますが理解できず困っています。

[理解内容]
1.利点
 :SQL文の検索にバインド変数を利用すると、同一のSQLとして実行できる
  ⇒ 繰り返し処理(ループ)では有効

2.使用方法
 :静的SQL・動的SQLで使用可能 

 [疑問点]
  静的SQLではバインド変数をどう宣言すればよいですか?
  [SQL*Plus]・[動的SQL]は例文がありました

  ●SQL*Plusでの宣言方法

   (例)
    SQL> set null '<null>'
    SQL> set head off
    SQL> variable var_at...続きを読む

Aベストアンサー

#1 です。

>という事はPL/SQL内の静的SQLではバインド変数は使えないと言うことでしょうか?

ストアドプログラム(パッケージ/プロシージャ/ファンクション)内では動的以外には使えないと思います。
(SQL*PlusからストアドをEXECUTEする時の引数として使用する事は、もちろん可能ですが)

但し、私が例に書いた通り、無名PL/SQLブロック(DECLARE~BEGIN~END)内では静的にも使用可能です。

質問者様の試したサンプルで言えば。

CREATE OR REPLACE PROCEDURE TEST.TEST(v_Id IN VARCHAR2) IS

v_name varchar2(20);

BEGIN
SELECT name
INTO v_name
FROM test
WHERE id = v_Id;

EXCEPTION
WHEN OTHERS THEN
RETURN;
END;
/

これでコンパイルは通りますよね。(すいません、環境が無いので未検証です)

「これじゃ、v_Idはバインド変数にならないんじゃ?」と思うかもしれませんが、これバインド変数なんです。
(うーん、混乱しちゃいますかね?)

SQLトレースを取るとわかるんですが、引数v_Idが '1' だろうが '2' だろうがトレースで解析されるSQLでは

WHERE id = :b1

と言うバインド変数になるんですよ。

>このあたりが理解できていない部分です。

パフォーマンスチューニングで扱われるバインド変数と置換変数(リテラル)の差異を把握する事が、実はこの辺の理屈を理解する上での近道かもしれません。
OTNでパフォーマンス・チューニング・ガイドを落とすか、もしくはパフォチュー系の本を一冊読んでみるとよいかと思います。

もしJavaの経験がおありでしたら、"?"(プレースホルダ)を使ったSQLと、リテラル直指定の同じSQLをそれぞれ実行するJDBCプログラムを作って、SQLトレース(とtkprof)を取って較べてみると見えてくる物があると思います。
私自身、SQLトレースの中身を見るようになって、この辺の事が理解できるようになりましたから。
(SQLトレースに関しては前述のチューニング・ガイド等参照)

#1 です。

>という事はPL/SQL内の静的SQLではバインド変数は使えないと言うことでしょうか?

ストアドプログラム(パッケージ/プロシージャ/ファンクション)内では動的以外には使えないと思います。
(SQL*PlusからストアドをEXECUTEする時の引数として使用する事は、もちろん可能ですが)

但し、私が例に書いた通り、無名PL/SQLブロック(DECLARE~BEGIN~END)内では静的にも使用可能です。

質問者様の試したサンプルで言えば。

CREATE OR REPLACE PROCEDURE TEST.TEST(v_Id IN VARCHAR2) IS

v_name var...続きを読む

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

Q実行計画の「COST」と「BYTE」について教えていただきたいです。

実行計画の「COST」と「BYTE」について教えていただきたいです。

書籍には
COST・・・・CBOによって見積もられた操作コスト。
BYTE・・・・アクセスされるバイト数のCBOのアプローチによる見積もり。
と書かれていますが、いまいちピンときません。


私は、
COSTは、検索するテーブルのデータ量が多いほうがコスト値が大きくなる。
BYTEは、検索条件に合致して取得できるデータが多いほうがバイト値が大きくなる。
と思っているのですが、正しいでしょうか?

Aベストアンサー

このあたりを参考にしてください。
COSTはデータ量だけではなく、その表やViewのアクセスに要する時間やSortや結合が必要なら、そのために必要なCPU時間等も考慮されています。
表があるHDDのアクセス速度なんかも考慮されているし、表のエクステントが複数になっているかとかも考慮されています。
書籍はわかりにくいかもしれませんが、嘘は少ないと思います。著者が思い違いをしてないとは言い切れませんが。

参考URL:http://otn.oracle.co.jp/forum/message.jspa?messageID=35016743

QOracleで流したSQLのログを取得できますか?

ASP+Oracle9iで作られたシステムがあります。
Oracleの設定などは前任者がしており、まともな引継ぎを受けないまま私が維持運用員となりました。
現在DBからあるレコードが消えてしまい(最初から作られてない可能性もあり)、顧客からクレームがついています。
状況から考えて怪しいプログラムを調査したのですが、原因不明でした。
そこで、Oracleの方で今まで流れたSQLをログとして保存していれば手がかりがつかめるのではないかと思い、情報を探しているのですが見つからないので教えて頂きたいのです。
私はOracleの知識(管理面について)が殆どなく、Oracleを使うことはできるが、Oracleの設定がどういう状況になっているか調べることもできず、資料もありません。

1.そもそもOracleにSQLをログとして保存する機能があるのか?
2.あるとすれば、保存機能が有効になっているか、保存したファイルがどこにあるかをどこで確認できるか?

以上の点についてご存知の方、どうぞ回答よろしくお願いします。

Aベストアンサー

OracleのSQL実行痕跡は以下に示すものの中にあります。
ただし、それぞれの設定レベル、保存方法によって、参照できる範囲は変わります。

1.オンラインREDOログとアーカイブログ
  オンラインREDOログはすべてのOracleデータベースに存在します。
  ですが、そのREDOログのサイズとシステムのアクセス量によって保存期間は変化します。アーカイブログ設定しておけば、古いREDOログはアーカイブとして吐き出されます。
  これらは#1の方がおっしゃったLOGMINERで実行済みSQLを調査することができます。
  アーカイブログモードになっているかどうかは、下記で確認できます。
   SQL> select log_mode from v$database;

  また、どのアーカイブログファイルを調査するかは下記を参照すれば良いと思います。
   SQL> select name,to_char(completion_time, 'yyyy/mm/dd hh24:mi') adate from v$archived_log;

2.フラッシュバック問い合わせ
  これは初期化パラメータUNDO_MANAGEMENTがAUTOに設定されており、かつUNDO_RETENTIONが保存期間として適切に設定されている場合のみ使用できます。
  やっていることは、UNDO表領域(旧RBS用表領域)の中に残っている実行履歴を参照しています。したがって、データベース設計時にフラッシュバック問い合わせを前提としていない限り、使える可能性は低いです。

3.その他
  監査を実行していれば、実行SQLを取得できる可能性があります。
  ただし、監査レベルなどを理解しておかないと、すべてのSQLが取得されていない可能性がありますので、難しいかもしれません。

OracleのSQL実行痕跡は以下に示すものの中にあります。
ただし、それぞれの設定レベル、保存方法によって、参照できる範囲は変わります。

1.オンラインREDOログとアーカイブログ
  オンラインREDOログはすべてのOracleデータベースに存在します。
  ですが、そのREDOログのサイズとシステムのアクセス量によって保存期間は変化します。アーカイブログ設定しておけば、古いREDOログはアーカイブとして吐き出されます。
  これらは#1の方がおっしゃったLOGMINERで実行済みSQLを調査することができま...続きを読む

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング