プロシージャの共有について

このQ&Aのポイント
  • プロシージャやファンクション、パッケージ等のソース内に書かれたDMLは基本的に自分のスキーマが参照対象なので、(ユーザは異なるが)同一構造のスキーマが複数存在する場合はスキーマ毎に同じプロシージャ等を用意する必要がありますが、このソースを(動的SQLを使わずに)一つのスキーマで一元管理することはできないでしょうか。
  • たとえば下記の状態で、スキーマA(またはB)から、スキーマCのTEST_FUNCTIONを呼び出し、実際はスキーマA(またはB)のTEST_TABLEを参照したい場合です。大変お手数ですが、宜しくお願い致します。
  • create function TEST_FUNCTION return NUMBER is nRET NUMBER; begin SELECT COUNT(*) INTO nRET FROM TEST_TABLE; return nRET; end;
回答を見る
  • ベストアンサー

プロシージャの共有について

プロシージャやファンクション、パッケージ等のソース内に書かれたDMLは基本的に自分のスキーマが参照対象なので、(ユーザは異なるが)同一構造のスキーマが複数存在する場合はスキーマ毎に同じプロシージャ等を用意する必要がありますが、このソースを(動的SQLを使わずに)一つのスキーマで一元管理することはできないでしょうか。たとえば下記の状態で、スキーマA(またはB)から、スキーマCのTEST_FUNCTIONを呼び出し、実際はスキーマA(またはB)のTEST_TABLEを参照したい場合です。大変お手数ですが、宜しくお願い致します。 --------------------------------------------- スキーマA   TEST_TABLE   ファンクション無し スキーマB   TEST_TABLE   ファンクション無し スキーマC   TEST_TABLE   TEST_FUNCTION create function TEST_FUNCTION return NUMBER is   nRET NUMBER; begin   SELECT COUNT(*) INTO nRET FROM TEST_TABLE;   return nRET; end;

  • Oracle
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 > 一つのスキーマで一元管理・・・ ストアド・ファンクションを、実行者権限で定義すれば可能です。 Create function ~ return number AUTHID CURRENT_USER is ・・・ としてみて下さい。

kitasuke
質問者

お礼

素晴らしいです! 本当に助かりました。ありがとうございました!

関連するQ&A

  • プロシージャとトリガー

    Aというテーブルのaカラムが更新されれば、Bテーブルの列の中でAテーブルの列id含む列(複数)のbカラムをFalseからTrueに変更されるような、トリガー と プロシージャを作りたいのです。 考えていたのは、プロシージャは、 CREATE FUNCTION update_edit_b() RETURNS OPAQUE AS ' BEGIN (複数列指定?) NEW.b := 't'; RETURN NEW; END; ' LANGUAGE 'plpgsql'; プロシージャで、Bテーブルの複数列を指定するにはどうしたら良いでしょうか? トリガーは CREATE TRIGGER trgger_a AFTER UPDATE OF a ON Table_a FOR EACH STATEMENT EXECUTE PROCEDURE update_edit_b ; こんな感じでしょうか?

  • DBリンク&シノニム経由インデックス

    Oracle8iサーバ(サービス名:Aサーバ)と Oracle10gサーバ(サービス名:Bサーバ)があります。 Aサーバに作られた、aスキーマに、test_tableというテーブルがあります。 そのtest_tableをBサーバに作られた、bスキーマから参照する為に、 DBリンク:BA_linkを作成しました。 実際に、bスキーマから参照する場合は、 同スキーマに、 CREATE SYNONYM test_table FOR test_table@BA_link; のように作られたシノニムを利用して、参照します。 抽出に時間がかかるので、インデックスを作成しようと思うのですが、 どのスキーマにどのように作成すればよいのでしょうか? ちなみにインデックスの対象にしたい項目は、 VAR_ITEM VARCHAR2(10) NUM_ITEM NUMBER(5) とします。 ちなみにbスキーマにて、 CREATE INDEX test_table_IX1 ON test_table (VAR_ITEM, NUM_ITEM); と実行したところ、 ORA-02021: リモート・データベースに対するDDL操作が無効です・ というエラーが発生しました。 DBリンク先自身に、作成すべきということはなんとなく予想が つくのですが、そのインデックスはDBリンク経由でも有効なのでしょうか?

  • Oracleのプロシージャについて

    Oracleのプロシージャについて教えてください。 現在、Aテーブル(カラム1、カラム2、カラム3、カラム4):件数40万件     Bテーブル(カラムA、カラムB、カラムC):件数50件 と言うテーブルがあります。 この中でデータ置換を行う必要があり、 Aテーブルのカラム2とBテーブルのカラムBが一致したらAテーブルの カラム3にBテーブルのカラムCで更新するプロシージャを作成しています。 通常のUpdate文で3000件単位でCommitを切るようにしていますが時間がかかります。 皆さんはこういう場合どういう手法でやられていますか? ご教授ください。 ちなみに、 サーバOS:Windows2008SERVER クライアントOS:Windows7 Oracle11 です。

  • エクセル マクロのFunctionプロシージャについて

    エクセルでユーザー定義関数を使う時にセル範囲を任意に指定して参照したいのですがやり方がよく分かりません。 たとえば、以下のマクロを記述して Function test(a,b) test=a+b End Function エクセルのシート上で =test(A1,A2) とすれば、計算結果が出てくると思いますが、この A1、A2と参照していたのを A1:A3 というように参照できるようにマクロを変更したいです。 どなたか教えてください。

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

    サーバ【A】のスキーマ【あ】にDB【テーブル1】があります。 サーバ【A】のスキーマ【い】に、【あ】からセレクト権限を与えた所、【い】から【テーブル1】を参照できるようになりました。 次に、 サーバ【B】からサーバ【A】にDBLINKをはりました。 (tnspingで接続されているのを確認済)。 これで、 サーバ【B】のスキーマ【あ】からDBLINK経由で【テーブル1】を参照できるようになりました。 しかし、サーバ【B】のスキーマ【い】から【テーブル1】が参照できません。 私としては、スキーマ同士の権限を与え、DBLINKが正しく繋がっているので、参照できるのでは??と思うのですが、 何度やっても、 --------------------------------------------------------------- ORA-04043: オブジェクト"【あ】"."【テーブル1】"は存在しません。 --------------------------------------------------------------- が表示されてしまいます。 原因として何が考えられるでしょうか…?? 説明不足だったらすみません。 何か考えられる可能性があったら教えて下さい。

  • VBA Functionプロシージャで複数の値を

    エクセルでVBAのFunctionプロシージャについて複数の値を戻り値として 受け取る方法を考えています。 下記のようなサンプルプログラムを作りました。 --------------------------------------------------------------------------------- Option Explicit Private Sub CommandButton1_Click() Dim kekka(3) As Double Dim txt As String txt = "12.12A,34.34B,56.56C,78.78D" kekka(0) = test(txt) End Sub Public Function test(ByVal text As String) As Double Dim txt_kakou(3) As String '## 渡された「txt = "12.12A,34.34B,56.56C,78.78D"」を加工し、数値のみを取り出し '## 下記のように配列txt_kakou(3)に振り分ける '## 加工方法は割愛 txt_kakou(0) = 12.12 txt_kakou(1) = 34.34 txt_kakou(2) = 56.56 txt_kakou(3) = 78.78 'string型からdouble型に変換する。 txt_kakou(0) = CDbl(txt_kakou(0)) txt_kakou(1) = CDbl(txt_kakou(1)) txt_kakou(2) = CDbl(txt_kakou(2)) txt_kakou(3) = CDbl(txt_kakou(3)) test = txt_kakou() End Function ----------------------------------------------------------------------------------- まず、呼び出し側のプロシージャでkekka(3)という配列を宣言します。 次に変数txtに「"12.12A,34.34B,56.56C,78.78D"」の文字列を代入します。 そして変数txtをFunctionプロシージャに投げます。 Functionプロシージャでは、受け取った「"12.12A,34.34B,56.56C,78.78D"」 を数値のみに分解し、4つの変数に代入します。 この4つの変数も配列で用意し、txt_kakou(3)とします。 このtxt_kakou(3)を呼び出し元に返し、呼び出しもとの変数kekka(3)に入れたいのです。 また、はじめ変数txtに代入される値は文字列ですが、この文字列をFunctionプロシージャで分解し、 分解した値は、最終的には数値として扱いたいので、途中でdouble型に変換しています。 これを実行すると、Functionプロシージャの最後のtest = txt_kakou()で、型が一致しません といわれてしまいます。 どのように書き直せばいいのでしょうか。 よろしくお願いします。

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

    現在以下の様な状態で、サーバ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

  • ストアドプロシージャ

    以下のような事が行いたいのですが、うまくいきません。  <テーブル1>   id  計算式    1  注文数×単価    2  在庫数×単価  <テーブル2>    No. 注文数 在庫数 単価    A   50   20  500    B   70   85  860 ここで、テーブル1より計算式を検索し、 その計算式をもとにテーブル2のデータを計算したいのです。 ストアドプロシージャ等を使用すれば出来るのかとおもったのですが、 どうしてもうまくいきません。 このようなことはできないのでしょうか? 開発環境  ORACLE 8.1.7

  • 引数をとるプロシージャの記述方法

    Functionプロシージャへ文字型と数値型の両方の引数の指定したいのですが記述方法が解りません。 文字型のAとBと数値型のCを引数に渡したいのですが、文字だけの場合は Public Function Calc_1(A,B As String) As String でいいと思いますが、これに数値型のCを追加したいのですがどのように記述したらいいのか教えていただけないでしょうか。 よろしくお願いいたします。

  • セルから呼び出したプロシージャ内でセルの塗りつぶし

    初めて質問させていただきます 宜しくお願い致します セルから呼び出したプロシージャ内からセルの塗りつぶしを 実行しても塗りつぶしが有効になりません たとえば A1のセルに10を入力 B1のセルに=TEST(A1) と入力 マクロのモジュール内に Public Function TEST(tmp_No As Integer) As Integer TEST = tmp_No * 25 '(1)ここから If TEST = 250 Then    'Msgbox "チェック用MSG"    Cells(1, 1).Interior.ColorIndex = 38 End If '(2)ここまで End Function というファンクションプロシージャがあるとします 引数で10を持って行ってるので10×25で TESTが250になりB1には計算結果として 250と問題なく表示されています しかし (1)~(2)のセルの塗りつぶしは実行されません 仮にチェック用のメッセージボックスのコメント を外すとキチンとメッセージボックスは 表示されます また、塗りつぶしダケのマクロを作成し Public Sub cell_paint()    Cells(1, 1).Interior.ColorIndex = 38 End Sub 実行すると、これも問題なく動作しますので EXCELの設定ではないと判断しています セルから呼び出したプロシージャの時 だけ、動作しないようなのですが なぜでしょうか? 他の方法で回避可能でしょうか? ※実際には塗りつぶしの判定方法が  20個あり、条件付書式では対応出来ないので  マクロで処理を試みてます 宜しくお願い致します