![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
いつもお世話になっております。たびたびの質問で恐縮です。
ストアドプロシージャでのパラメータのデータ型が設定できず困っております。たとえば次はパラメータの文字を表示させるものです。
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の変数あるいはパラメータではどのように記述すればよろしいのでしょうか。
基本的なことを理解しておらず、申し訳ありません。
どうか、よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
INパラメータは参照渡し、
OUTおよびIN OUTパラメータは値渡しされます。
(NOCOPYを指定すれば参照渡しにもなります)
私の想像です……
実パラメータはスタック領域という
メモリ領域を介して仮パラメータに渡されます。
参照渡しの場合、
スタックに積まれるのはポインタなので
サイズを指定する意味がない(できない)。
値渡しの場合、
スタックに積まれるのは実パラメータのコピーです。
Oracleのデータの内部形式でサイズ情報を管理しているので、
サイズを指定する必要がない。
……想像おわり
これに関してくわしく解説している文献やWebサイトはありません。
マニュアルにも載っていないと思います。
(見つけられないだけかもしれません……)
本当のところは誰も知らないのではないでしょうか。
(Oracleの人を除いては……)
# KEYWORDをいくつか挙げましたので興味があれば調べてください。
実行時、オーバーフローでエラーにならないようにするのは、
プログラマの責任です。
あまり難しいことを考えずに
こういうものだと割り切って、
バリバリとプログラムを作るほうが幸せになれると思います(笑)。
# INパラメータにはきちんとINを指定する癖をつけたほうがいいと思う。
dda167様
本当にいつもありがとうございます。また、いつもの豊富な知識に驚かされてしまいます。ありがとうございます。
>これに関してくわしく解説している文献やWebサイトはありません。
>マニュアルにも載っていないと思います。
そういうレベルの話だと聞いて、逆に安心しました。
>参照渡しの場合、
>スタックに積まれるのはポインタなので
>サイズを指定する意味がない(できない)。
だから、サイズを指定するとエラーになるのですね。
>バリバリとプログラムを作るほうが幸せになれると思います
>INパラメータにはきちんとINを指定する癖をつけたほうがいいと思う。
ありがとうございます。さっそく気をつけたいと思います。
No.3
- 回答日時:
補足です。
これに関して → PL/SQLのパラメータの受け渡しに関して
C言語などの解説サイトはたくさんあります。
# パラメータの参照渡しについては知識として知っておいたほうがいいかもしれない
ありがとうございます。
>C言語などの解説サイトはたくさんあります。
Cは私には少々つらいですが、がんばってみます。
いつもありがとうございます。
感謝しております。
No.1
- 回答日時:
具体的には
1行目は
CREATE OR REPLACE PROCEDURE test(p VARCHAR2)
3行目は
t VARCHAR2(10);
とすればよいかと思います。
1行目の(p VARCHAR2)は「pに入る値は可変長文字列型ですよ」
ということを宣言しているに過ぎないので、最大文字長などは
このタイミングでは定義する必要はありません。
あくまでt := p;
とtestプロシージャの第一引数をVARCHAR2(10)の変数tに
代入するところで、10バイトを超えているとエラーとなるだけです。
さっそくのご回答ありがとうございます。
>ということを宣言しているに過ぎないので、最大文字長などは
>このタイミングでは定義する必要はありません。
調べても私には見つけられなかったので感謝しております。
やはり仮パラメータには、「最大文字長」やNUMBERの「桁数」は設定できない
ということでしょうか?
また、これはパラメータとは関係ないことなのかもしれませんが、
ストアドプロシージャの本体ではVARCHAR2の「最大文字長」を設定しないと
エラーになるものでしょうか?
何か、可変長で受け取ったものを、固定長に入れるのに抵抗があるのですが。
お手数をおかけして申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- 統計学 ARMAモデルが適用できる状態について 1 2022/12/30 05:58
- Chrome(クローム) Chromeの描画領域を2分割して異なるスクロール位置を同時に表示させることはできますか 1 2023/03/01 16:53
- 数学 モデルのパラメータの定義がいまいちわかりません。 3 2022/10/11 15:16
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL テーブル作成時のカラムについて 2 2022/08/27 21:48
- その他(プログラミング・Web制作) 下記内容はpythonの重回帰分析で可能でしょうか? python初心者です。現在の業務でもしかした 2 2022/06/16 00:36
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[SQL]重複内容を持つデータから...
-
SQLでlike検索条件を副問い合わ...
-
Exp.exeに指定するparfileパラ...
-
”パラメータ値を TextBox から ...
-
shellからストアドプロシージャ...
-
特定のセルが空白だったら、そ...
-
i=cells(Rows.Count, 1)とi=cel...
-
ListView 項目の選択/選択解除...
-
VB.NETで DataRow()を利用して...
-
count(*)で取得した値をJAVAの...
-
Excelで指定した日付から過去の...
-
【Excel VBA】指定行以降をクリ...
-
VBA:小数点以下の数字を取得で...
-
ExcelVBAを使って、値...
-
vbaの繰り返しで求める最大値に...
-
エクセルで、絶対値の平均を算...
-
長音「ー」とマイナス「-」の...
-
テキストボックスのvalueとtext...
-
TODAY()で設定したセルの日付...
-
VB.NETでコンボボックスの1行目...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[SQL]重複内容を持つデータから...
-
”パラメータ値を TextBox から ...
-
SQLでlike検索条件を副問い合わ...
-
shellからストアドプロシージャ...
-
MERGE文について
-
ビュー(インラインビュー)で...
-
Exp.exeに指定するparfileパラ...
-
ストアドプロシージャでのパラ...
-
バッチからのSQLPlusの実行につ...
-
PLSQLで条件によりSQLを動的に...
-
ExcelVBAを使って、値...
-
VB.NETで DataRow()を利用して...
-
特定のセルが空白だったら、そ...
-
【Excel VBA】指定行以降をクリ...
-
i=cells(Rows.Count, 1)とi=cel...
-
テキストボックスのvalueとtext...
-
count(*)で取得した値をJAVAの...
-
Excelで指定した日付から過去の...
-
データ数をカウントしたいのですが
-
【Excel】指定したセルの名前で...
おすすめ情報