• 締切済み

PL/SQLに関しての質問です。

はじめまして。 PL/SQLの入門書を一冊程度読んで開発に携わってしまった初心者です。 どうしてもわからず、行き詰ってしまったので質問させて下さい。 現在あるパッケージを作成しています。 例えとして、パッケージ内にプロシージャAとプロシージャBが有るとします。 プロシージャA内で、SELECTにてDBから取ってきた値を変数Cに入れます。 その変数Cはパッケージの呼出し元のモジュールに返します。 ここまでは解りますが問題はここからです。 プロシージャAで変数Cに格納した値を、そのままプロシージャBでも使用したいのです。 変数Cを仕様部で宣言して、グローバル変数として使用すれば楽だと思うのですが、 グローバル変数は一切使用してはならない。と言われています。 ご回答お待ちしております。

みんなの回答

  • Yohjira
  • ベストアンサー率66% (14/21)
回答No.1

プロシージャAの終了後、変数Cを引数にしてプロシージャBを呼び出したりとか、 プロシージャA内から直接プロシージャBを呼んだりしたらだめでしょうか。

henaxs
質問者

お礼

ありがとうございます。

henaxs
質問者

補足

ご回答ありがとうございます。 やはりそのやり方しかないのでしょうか。。。 単純に変数Cを渡すってことは出来ないのでしょうか?

関連するQ&A

  • PL/SQLを使った開発について質問があります。

    PL/SQLを使った開発について質問があります。 私は、Java(eclipse)を使用して開発を経験しております。 そこで質問があります。 eclipseを使ってPL/SQLの開発は可能でしょうか? また、可能な場合ですが、以下の条件を達成できますか? ・プロシージャが多くても、一発で目的の位置にジャンプしたい ・プロシージャの呼び出し元へジャンプしたい ・変数の宣言へジャンプしたい ・変数名の変更時などに自動リファクタリングしてほしい 等です。 どうか、ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • PL/SQLについての質問です。

    PL/SQLについての質問です。 カーソルデータ(emp_rec(i))を、TABLE変数(emp_ins(i))に代入して、代入されたTABLE変数を使用して、DML処理を行うことは可能ですか? エラーを解読し対処を行っても、エラーが発生してしまいます。 どうか、ご教授お願いします。 下記を実行すると、下記エラーが発生します。 -実行結果------------------------------------ DECLARE * 行1でエラーが発生しました。: ORA-06502: PL/SQL: 数値または値のエラーが発生しました ORA-06512: 行127 -エラー番号解読----------------------------------------- ●エラー名: PL/ SQL: 数値または値のエラーstring が発生しました ●原因: 算術、数値、文字列、変換または制約エラーが発生しました。たとえば、NULL 値をNOT NULL で宣言した変数に割り当てようとした場合、または100 以上の整数をNUMBER( 2) で宣言した変数に割り当てようとした場合にこのエラーが発生します ●処置:値が制約違反をしないように、データ、操作方法または宣言方法を変更してください。 -ソース------------------------------------ DECLARE --カーソル定義 CURSOR emp_cur IS SELECT a,b,c FROM emp TYPE emptabtype IS TABLE OF emp%ROWTYPE INDEX BY PLS_INTEGER; emp_rec emptabtype; /* 処理対象データ格納変数 */ -- insert作業用 emp_ins emptabtype; ins_count NUMBER := 1; BEGIN /* empカーソルオープン・フェッチ・クローズ */ OPEN emp_cur; FETCH emp_cur BULK COLLECT INTO emp_rec; CLOSE emp_cur; /* (挿入)処理対象のデータを、処理対象データ格納変数に格納する。 */ FOR i IN emp_rec.FIRST..emp_rec.LAST LOOP --挿入するレコードを格納 emp_ins(ins_count) := emp_rec(i); ins_count := ins_count + 1; END LOOP; /* DML処理 */ -- 挿入する FOR count_ins IN emp_ins.FIRST..emp_ins.LAST LOOP INSERT INTO temp VALUES(emp_ins(count_ins).a ,emp_ins(count_ins).b ,emp_ins(count_ins).c); END LOOP; COMMIT; END; /

  • PL/SQLの初歩的な質問

    失礼します。 PL/SQLについて、初歩的な質問をさせてください。 DBに以下のような文字列が入っていて、 それを抽出し変数にセットするとします。 A'1234567'→変数aにセット B'  12A345B'→変数bにセット 質問1 Aの文字列を取得した際、'123-4567'のように 間にハイフンを付けて変数aにセットする場合 どのようなPL/SQLの記述になりますか? 質問2 Bの文字列を取得した際、'12345'のように 左側の空欄と数字以外の文字を取り、 なおかつ数字を半角にして変数bにセットする場合 どのようなPL/SQLの記述になりますか? お手数お掛けしますが ご回答宜しくお願いします。

  • PL/SQL文についてです。

    PL/SQL文において、CREATE TYPEでオブジェクト型のものを用意しました。そこにはnumber型の変数が10個あります。 そしてパッケージ内のプロシージャでそのオブジェクトを使用したいんです。 CREATE OR REPLAECE PACKAGE BODY BIG(○○ IN NUMBER、answer OUT NOCPY HAIRETSU) IS・・・・・・・・・・・・・・ BEGIN answer := HAIRETSU(); answer.extend(8); obj := temp_answer(0,0,0,0,0,0,0,0,0,0); 1.このあとにカーソルからいろいろ計算をしてtemp_income_personをもとめたとします。これをオブジェクト型の変数income_personにいれるときにobj.income_person := temp_income_personで格納されますか??dbms_output.put_line(obj.income_person)と入力しておいても表示されません。 2.このようにオブジェクトの10個の変数をすべてうめたあとでこのオブジェクトをまるまるanswer配列に格納します。 answer(i) := obj; これで配列に格納されたことになりますか? 3.次にobj := temp_answer(0,0,0,0,0,0,0,0,0,0); で初期化し、ループを用いて配列をうめていきます。可能ですか?

  • PL/SQLのグローバル変数保持期間

    PL/SQLのグローバル変数の保持期間についての質問です。 例えば、 パッケージA、 パッケージBが あったとします。 パッケージBには グローバル変数BH、 ファンクションBF があります。 パッケージAからファンクションBFを呼び出します。ファンクションBFの処理で、グローバル変数BHに文字列"こんにちは"をセットします。 ここからです。パッケージAからグローバル変数BHを使用するとき、文字列"こんにちは"は保持されたままなのでしょうか? ファンクションBFで戻り値、又はOUTで呼び出し側パッケージAに返せばいいのですが、訳ありでできません。 このような状況なので、パッケージBのグローバル変数を見ようと考えています。 ファンクションBFは共通関数なので、BFの処理でBHにセットせず、ファンクションAのグローバル変数にセットすることもできません。 ファンクションBFは色々なファンクションから呼び出されているためです。 Java等はインスタンスの概念があるので、上記のような処理は問題ないのですが、PL/SQLでこのような方法は可能でしょうか? 皆さん、お忙しい中申し訳ございませんが、よろしく お願いします。 又、他に良い方法がありましたら、アドバイスお願いします。

  • PL/SQLのIN演算子で使う文字列の宣言について

    PL/SQLの変数の宣言の仕方について質問です!! PL/SQLで変数と変数の使用について質問があります。 PL/SQL内部でUPDATEなどを分を作成する際の、その要素を使用部に変数で格納したいと思ってい ストアドを作成していました。 例えば: update tableA set columnA = 'aaaaaa' where columnA not in ('c1','c2','c3') and columnA like 'c%'; というを --仕様部-- afterset varchar2(100) :='aaaaaa'; --変換したい値 nochg_before varchar2(100) := 'C1'',''C2'',''C3'; --特定で変換してはいけないもの beforeset varchar2(100) := 'c%'; --変換したい対象 --本体部-- update tableA set columnA = afterset where columnA not in (nochg_before) and columnA like beforeset; で、作成して実行した際に、なぜか「特定で変換してはいけないもの」 も一緒に更新をかけていました。 おそらく、2番目の変数の宣言に問題があり、レコードが除外できなかったと思うのですが、 正しい書き方とはどうすればいいのでしょうか? お力を貸してください。 お願いします。

  • パブリック変数を宣言する時に・・・

    エクセルVBAの質問です。 モジュールAとBがあるとしまして、 Aの中にあるプロシージャからBの中のプロシージャを呼び出す場合、 変数を引き渡したいとしたらパブリック変数を使いますよね? この場合宣言は、 Aの宣言セクションでするのか、 Bの宣言セクションでするのか、 あるいは両方で同じ変数を宣言するのか、 どれなんでしょ?

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

  • PL/SQLについて

    PL/SQLについて お世話になります。 現在Oracle 11gと.Net C#で開発をしている物です。 正直どちらも初心者で悪戦苦闘している日々ですが、 PL/SQLのカーソルについて知りたい事があります。 PL/SQLでカーソルを作成しました。 そしてその同一ストアドプロシージャ文の中で、 先のカーソルの結果で得られた値から別の新たなカーソル でまた新たな結果を返すと言う様な、二重カーソルの様な 事は可能でしょうか。 どなたかご親切な方、ご教授頂きたく宜しくお願い致します。 出来れば、サンプルや、HP等ご紹介頂ければありがたく 思います。

  • PL/SQLでの処理について

    キーの異なる2つのトランザクションテーブルA,Bに マスタCの値を引っ張ってきて各A,B埋める処理を、テーブル名を引数にPL/SQLのプロシージャにしたいのですが、良い方法はありますか? 以下のイメージです。 <TABLE A> KEY_A C_CD C_VALUE -----+----+------- 1 3 2 3 3 1 <TABLE B> KEY_B C_CD C_VALUE -----+----+------- 1 3 2 3 3 1 <TABLE C> C_CD C_VALUE ----+-------- 1 A 2 B 3 C SQL>EXECUTE foo('A'); <TABLE A> KEY_A C_CD C_VALUE -----+----+------- 1 3 C 2 3 C 3 1 A SQL>EXECUTE foo('B'); <TABLE B> KEY_B C_CD C_VALUE -----+----+------- 1 3 C 2 3 C 3 1 A <処理イメージ> CREATE OR REPLACE PROCEDURE FOO(TNAME VARCHA2) IS c_cd NUMBER; C1 INTEGER; SQL1 VARCHAR2(2000); I INTEGER; BEGIN SQL1 := 'SELECT c_cd FROM ' || tname; C1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(C1, SQL1, DBMS_SQL.V7); DBMS_SQL.DEFINE_COLUMN(C1, 1, c_cd); LOOP IF DBMS_SQL.FETCH_ROWS(C1) > 0 THEN DBMS_SQL.COLUMN_VALUE(C1, 1, c_cd); UPDATE tname set value = c_cd; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↑ここの部分をうまくかけないでしょうか? ELSE EXIT; END IF; END LOOP; end /

専門家に質問してみよう