Oracleパッケージの仕様とは?

このQ&Aのポイント
  • Oracleのパッケージの仕様について、関数のメモリ使用に関する疑問があります。
  • パッケージ内の関数が実行されるたびにメモリがたまり、開放されないと聞いたが本当か疑問。
  • AユーザとBユーザ間で別々のメモリが使用され、Oracleが自動的に開放しないとのこと。
回答を見る
  • ベストアンサー

oracle パッケージの仕様?

Oracleのパッケージの仕様で、 パッケージの中で定義されている関数が実行されるたびに、 メモリがたまっていき、開放されないと聞いたのですが、 本当にそうなのでしょうか? たとえば CREATE OR REPLACE PACKAGE BODY PackA IS FUNCTION FuncA( pv_Para IN VARCHAR2 ) RETURN VARCHAR2 IS BEGIN RETURN 'TEST'; END FuncA; END PackA; AユーザがPackA.FuncAを実行し、 そのあと、BユーザがPackA.FuncAを実行すると、 それぞれ別にメモリが使用され、Oracleが自動的に開放してくれない。 ということなんですが、本当なんでしょうか??? 開発環境は WindowsNT 4.0 Oracle 8.1.7 です。 よろしくお願いします。

  • kagep
  • お礼率62% (36/58)

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

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

> AユーザがPackA.FuncAを実行し、 > そのあと、BユーザがPackA.FuncAを実行すると、 > それぞれ別にメモリが使用され、Oracleが自動的に開放してくれない。 > ということなんですが、本当なんでしょうか??? についてちょっと考えてみました。 パッケージは、ユーザ毎に定義が可能なので、同じ名前のパッケージ でもユーザが異なれば、プロシージャの内容が異なる可能性があるので 別の領域を使用すると言う事ではないでしょうか? メモリの開放についてですが、パッケージ (Stored Procedure) って、 Shared Pool で動くので、「自動的に開放」と言う事にはならないと 思います。 プロシージャを実行する時に、所有者を指定して実行すれば同じ領域を 使用するのではないでしょうか? (多分)

kagep
質問者

お礼

助かりました。 ありがとうございました。

関連するQ&A

  • oracle ファンクションの実行

    oracleでファンクションを作成しております。 このファンクションをVisualBasicより実行しているのですが、 以下のエラーが出力される状況です。 ORA-06550: 行1、列8: PLS-00553: キャラクタ・セット名が認識されません。 ORA-06550: 行0、列0: どのように対処すれば良いか分らず、 どなたか分る方がいらっしゃればご教授頂けますと 幸いです。 ★作成したファンクション CREATE OR REPLACE FUNCTION HINODE.H_HND8010U ( p_in_yoyakuid in varchar2) RETURN varchar2 --********************************************************* --* □ プロシージャ名 --* H_HND8010U --********************************************************* IS vSum varchar2(10); BEGIN vSum := p_in_yoyakuid; RETURN vSum; END; /

  • oracleのfunctionで戻り値複数個

    oracleのストアドプロシージャのファンクションについてですが、 ファンクションは、戻り値を返すことができますが、 それを、複数個返すことはできるのでしょうか。 CREATE [OR REPLACE] FUNCTION ファンクション名(引数 IN データ型[, ...]) RETURN 戻り値の型 IS 宣言部 BEGIN 処理部 END ; お願いします。

  • PerlからOracleのストアドを呼びたいのですが、パラメータに配列は使えますか?

    Perl(5.005_03) からOracle(8i)のストアドを呼びたいのですが、パラメータに配列は使えますか? 使えるのなら、以下のようなストアドをPerl側から呼ぶには、どうすればよいでしょうか? ---------------------------------------------------------------------- /* 配列型 */ CREATE OR REPLACE PACKAGE text_util IS   TYPE vc_arr IS TABLE OF VARCHAR2(10)   INDEX BY BINARY_INTEGER; END; / /* 呼びたいストアド */ CREATE OR REPLACE PROCEDURE TEST_PROC ( v_DATA in text_util.vc_arr, i_IDX in INTEGER ) IS END; / ---------------------------------------------------------------------- よろしくお願いします。 【環境】sun4-solaris, apache

  • 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. 実行]を実施しましたが、 エラーが出力されて実行されません。 何がいけないのかお気づきの点がございましたら、 よろしくお願いします。

  • ORACLEのUTL_FILEパッケージについて

    皆さん、いつもありがとうございます。 OracleのUTL_FILEパッケージを使ったのですが うまくいきません。 どなたか教えてください。 よろしくお願いします。 目的) UTL_FILEパッケージを使ってファイルを作成したい 出力先はネットワークにある共有フォルダーです。 質問) ファイルの書き込み先をネットワークドライブまたは 他の端末(\\コンピュータ名\共有フォルダー)した時 以下のエラーになります。出力先を自端末にした場合は うまくいきます。ちなみに初期パラには「UTL_FILE_DIR = *」 と記述してOracleの再起動もしております。 エラーメッセージ : User-Defined Exception 以上です。

  • ストアドプロシージャの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

  • ストアドファンクションがうまく作成できない

    SQL Server 2005 にて、 以下のようなストアドファンクションを作成しようとしても、 「メッセージ 156、レベル 15、状態 1、プロシージャ TestKansu、行 30 キーワード 'end' 付近に不適切な構文があります。」 といったエラーメッセージが表示されてしまい、 うまく作成できません。。 文法など、いろいろ調べてみたところ、特に問題なさそうな 感じではあるのですが。。 どこに問題があるのか、どなたかご教授願えないでしょうか? なにとぞ、よろしくお願いいたします。 -------------------------------- use tempdb go -- 呼び出し形式 create function TestKansu ( @Date as datetime, @Type as varchar(1) ) returns @ReturnTable table ( StartDate varchar(8), EndDate varchar(8) ) as begin if @Type is null begin raiserror('正しいtypeを指定してください',-1,-1) end if @Date is null begin SET @Date = getdate() end if @Type = '0' begin insert into @ReturnTable select convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as StartDate, convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as EndDate, end if @Type = '1' begin insert into @ReturnTable select convert(varchar(8), @Date, 112) as StartDate, convert(varchar(8), @Date, 112) as EndDate end return end --------------------------------

  • PL/SQLのOPEN cursor_name FOR文でCLOSEは必要?

    お世話になります、 Orcacleのストアドで質問があります。 以下のようなストアドを組んだ場合「Close cu1;」は必要なのでしょうか? カーソルをクローズしないとOracleエラー「カーソルが最大数を超えました。。。」というエラーが出るそうなのですが。 ちなみにClose cu1;を入れるとVBからストアドを呼んだ場合に 以下のOracleエラー 「ORA-01403:データがありません」のエラーが出てしまいます。 アドバイス等、よろしくお願いします。 CREATE OR REPLACE PACKAGE MASTERS as CURSOR c1 IS select * from userTable; TYPE type1 IS REF CURSOR RETURN c1%ROWTYPE; PROCEDURE GetD( cu1 OUT type1); end; / -- CREATE OR REPLACE PACKAGE BODY MASTERS IS PROCEDURE GetD( cu1 OUT type1) IS BEGIN OPEN cu1 FOR select * from userTable ; これが必要?→ Close cu1; END GetD; END MASTERS; /

  • PL/SQLでファンクション名に変数を使用するには

    PL/SQLでファンクションの呼出を行いたいと思っています。 そこでファンクション名を変数で指定したいと思っているのですがうまくいきません。 ファンクション FUNCTION Check ( pi_Syori_No   IN NUMBER,  -- 処理No. po_Function_Name OUT VARCHAR2  -- ファンクション名 ) RETURN BOOLEAN IS TYPE Test_List IS VARRAY(100) OF VARCHAR2(10) NOT NULL; TYPE FcNameList IS VARRAY(100) OF VARCHAR2(10) NOT NULL; MmsCheckList Test_List := Test_List('○','×'); FcNameCheckList FcNameList := FcNameList('Check','Check'); BEGIN IF MmsCheckList(pi_Syori_No) = '○' THEN po_Function_Name :=FcNameCheckList(pi_Syori_No); ELSE po_Function_Name :=NULL; END IF; RETURN TRUE; EXCEPTION WHEN OTHERS THEN RETURN FALSE; END Check; メイン CREATE OR REPLACE PROCEDURE Test ( po_Out OUT VARCHAR2 ) IS Modoriti BOOLEAN :=TRUE; F_Neme VARCHAR2(2000) :=NULL; BEGIN IF Check(1,F_Neme) = TRUE THEN Modoriti := F_Neme(2,F_Neme); END IF; EXCEPTION WHEN OTHERS THEN po_Out := 'エラー'; END Test; この状態で実行すると下記のエラーが出てしまいます。 [PLS-00222: この有効範囲内に、名前'F_Neme'の関数は存在しません。] ファンクション名に変数を使うのは無理なのでしょうか? よろしくお願いいたします。

  • UTL_FILEパッケージについて

    UTL_FILEパッケージを使用してPL/SQLよりテキスト出力したいのですが上手くいきません。 まずsysdbaにて「create directory aaa as 'd:\'」にてディレクトリを作成しました。 次に以下のようにプロシージャを作成しました。 create procedure kan_exp( fir IN varchar2, filename IN varchar2) is file UTL_FILE.FILE_TYPE; CURSOR tk01_kan_c IS select aaa,bbb from tableCCC begin file := UTL_FILE.FOPEN(dir, filename, 'w'); UTL_FILE.PUT_LINE(file, 'TEST'); UTL_FILE.NEW_LINE(file); for kanrec in tk01_kan_c loop UTL_FILE.PUT_LINE(file, 'TEST'); end loop; END kan_exp; / それを以下のように呼び出しましたが、 execute kan_exp('UTL_FILE_DIR', 'aaa.csv'); 「ORA-29280:無効なディレクトリパスです。」エラーが発生します。 色々と調べてユーザに権限が必要かと思い、「grant read on directory to User」としましたが、ユーザーまたはロール'User'は存在しませんと出てきます。※もちろんUserは存在します。 なにか足りないものがあるのでしょうか? ご教示いただけますでしょうか?宜しくお願いします。