- ベストアンサー
PL/SQL文においてオブジェクト型の変数を使用する方法と注意点
- PL/SQL文において、CREATE TYPEでオブジェクト型の変数を定義することができます。
- オブジェクト型の変数を使用する際には、適切な格納方法や初期化、配列への格納方法に注意が必要です。
- オブジェクト型の変数をカーソルから取得して格納する場合、正しく表示されないことがあるため注意が必要です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>となるとそこのnvl関数はどこに書いたらいいのか・・・ カーソルに割り当てられているSELECT文でもいいですし、 obj.income_person := obj.income_person + NVL(○○,0) でもいいです。
その他の回答 (3)
- jamshid6
- ベストアンサー率88% (591/669)
もしその方法で表示されないのであれば、足しこんでいるフィールドにNULLが含まれているということではないですか?NVLはかけていますか? なお、CREATE OR REPLACE TYPE HAIRETSU IS VARRAY(10) OF temp_number;でも格納できるはずです。
お礼
obj.income_person := obj.income_person + ○○ ○○にnullの場合も入り込んでます!!というこはそこを0に置き換えればいいんですね!?となるとそこのnvl関数はどこに書いたらいいのか・・・
- jamshid6
- ベストアンサー率88% (591/669)
内容が理解できました。 1.格納されます。もしかしてSET SERVEROUT ONしていないだけでは。。? 2.ここでいうHAIRETSUは、 CREATE OR REPLACE TYPE HAIRETSU IS TABLE OF temp_number; ですよね? answer(i) := obj;でanswerに格納できます。 3.可能です。
お礼
>>もしかしてSET SERVEROUT ONしていないだけでは。。? 私が行っていたのは1に書いた内容とは違って、カーソルからフェッチしたきたデータを使ってオブジェクト型の変数income_personにたしていきました。 obj.income_person := obj.income_person + ○○ これでフェッチするデータがなくなったときにループを抜けて、 dbms_output.put_line(obj.income_person)と出力させようと思ってやりましたが、表示されませんでした。(ただの文字列をその行の前後に出力させたものは出力されていました。)この足しかたがまずかったと思ったんではじめからオブジェクト変数にたしていくのではなくtemp_income_person合計値をもとめておいて、ループを抜けてからオブジェクト変数にいれればうまくいくのではないかと思い書いてみました。今実行環境がないんで試せませんが・・最初のやり方でもいけるなら表示されなかった原因はつかまめせんが・・・ HAIRETSUはVARRAY型でcreate typeしています。それでもanswer(i) := obj;でanswerに格納できますか?
- jamshid6
- ベストアンサー率88% (591/669)
Package Bodyに引数がついているし、内容もかなり混乱しているようです。おそらくobjの型が非常に都合よく理解されている気がします。 まずobjに割り当てられているオブジェクト型のCREATE TYPE文と、temp_answerの定義を示してもらえませんか。
お礼
create or replace type temp_answer is object( income_person NUMBER, ○○ NUMBER, ○○ NUMBER, ・・・・・・・・・・)です。 あと >>Package Bodyに引数がついているし、内容もかなり混乱しているようです。 すいません誤植です。 CREATE OR REPLAECE PACKAGE BODY PCG IS PROCEDURE プロシージャ1(○○ IN NUMBER、answer OUT NOCPY HAIRETSU) IS・・・・・です。
お礼
なるほどどちらでもいいんですね!とても勉強になりました。今度実行してみます!ありがとうございました。