dポイントプレゼントキャンペーン実施中!

いつもお世話になっております。たびたびの質問で恐縮です。
ストアドプロシージャでのパラメータのデータ型が設定できず困っております。たとえば次はパラメータの文字を表示させるものです。

CREATE OR REPLACE PROCEDURE test(p VARCHAR2(10))
IS
t VARCHAR2(10);
BEGIN
t:=p;
DBMS_OUTPUT.PUT_LINE(t);
END;
/
コンパイルエラーになるので、パラメータのデータ型を、VARCHAR2のように(10)を取るとうまくいきます。しかし、変数定義の「t VARCHAR2(10)」の(10)を取ると文字列の制約制限からはずれるとのエラーになります。
VARCHAR2というのは、PL/SQLの変数あるいはパラメータではどのように記述すればよろしいのでしょうか。
基本的なことを理解しておらず、申し訳ありません。
どうか、よろしくお願いいたします。

A 回答 (3件)

INパラメータは参照渡し、


OUTおよびIN OUTパラメータは値渡しされます。
(NOCOPYを指定すれば参照渡しにもなります)

私の想像です……

実パラメータはスタック領域という
メモリ領域を介して仮パラメータに渡されます。
参照渡しの場合、
スタックに積まれるのはポインタなので
サイズを指定する意味がない(できない)。
値渡しの場合、
スタックに積まれるのは実パラメータのコピーです。
Oracleのデータの内部形式でサイズ情報を管理しているので、
サイズを指定する必要がない。

……想像おわり

これに関してくわしく解説している文献やWebサイトはありません。
マニュアルにも載っていないと思います。
(見つけられないだけかもしれません……)
本当のところは誰も知らないのではないでしょうか。
(Oracleの人を除いては……)

# KEYWORDをいくつか挙げましたので興味があれば調べてください。

実行時、オーバーフローでエラーにならないようにするのは、
プログラマの責任です。

あまり難しいことを考えずに
こういうものだと割り切って、
バリバリとプログラムを作るほうが幸せになれると思います(笑)。

# INパラメータにはきちんとINを指定する癖をつけたほうがいいと思う。
    • good
    • 0
この回答へのお礼

dda167様
本当にいつもありがとうございます。また、いつもの豊富な知識に驚かされてしまいます。ありがとうございます。

>これに関してくわしく解説している文献やWebサイトはありません。
>マニュアルにも載っていないと思います。

そういうレベルの話だと聞いて、逆に安心しました。

>参照渡しの場合、
>スタックに積まれるのはポインタなので
>サイズを指定する意味がない(できない)。

だから、サイズを指定するとエラーになるのですね。

>バリバリとプログラムを作るほうが幸せになれると思います
>INパラメータにはきちんとINを指定する癖をつけたほうがいいと思う。

ありがとうございます。さっそく気をつけたいと思います。

お礼日時:2010/01/09 22:41

補足です。



これに関して → PL/SQLのパラメータの受け渡しに関して

C言語などの解説サイトはたくさんあります。

# パラメータの参照渡しについては知識として知っておいたほうがいいかもしれない
    • good
    • 0
この回答へのお礼

ありがとうございます。

>C言語などの解説サイトはたくさんあります。

Cは私には少々つらいですが、がんばってみます。
いつもありがとうございます。
感謝しております。

お礼日時:2010/01/09 22:43

具体的には


1行目は
CREATE OR REPLACE PROCEDURE test(p VARCHAR2)
3行目は
t VARCHAR2(10);
とすればよいかと思います。
1行目の(p VARCHAR2)は「pに入る値は可変長文字列型ですよ」
ということを宣言しているに過ぎないので、最大文字長などは
このタイミングでは定義する必要はありません。

あくまでt := p;
とtestプロシージャの第一引数をVARCHAR2(10)の変数tに
代入するところで、10バイトを超えているとエラーとなるだけです。
    • good
    • 0
この回答へのお礼

さっそくのご回答ありがとうございます。

>ということを宣言しているに過ぎないので、最大文字長などは
>このタイミングでは定義する必要はありません。

調べても私には見つけられなかったので感謝しております。
やはり仮パラメータには、「最大文字長」やNUMBERの「桁数」は設定できない
ということでしょうか?
また、これはパラメータとは関係ないことなのかもしれませんが、
ストアドプロシージャの本体ではVARCHAR2の「最大文字長」を設定しないと
エラーになるものでしょうか?
何か、可変長で受け取ったものを、固定長に入れるのに抵抗があるのですが。
お手数をおかけして申し訳ありません。

お礼日時:2010/01/09 08:02

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