
PostgreSQLでストアドファンクションを作成しました。
ファンクションの内容は下記の通りです。
CREATE FUNCTION getRenban (VARCHAR) RETURNS VARCHAR(7) AS
'
DECLARE
key ALIAS FOR $1;
code VARCHAR(7);
code2 VARCHAR(2);
code5 VARCHAR(5);
renban INTEGER;
new_code VARCHAR(7);
BEGIN
SELECT MAX(code) INTO code FROM M_ITEM WHERE flg = TRIM($1);
code2 := TRIM($1);
IF code IS NULL THEN
renban := 1;
ELSE
SELECT SUBSTR(code, 2) INTO code5;
SELECT TO_NUMBER(code5, ''99999'') INTO renban;
renban := renban + 1;
END IF;
code5 := '''';
SELECT TO_CHAR(renban, ''00000'') INTO code5;
SELECT code2 || code5 INTO new_code;
RETURN new_code;
END;
'
language 'plpgsql'
;
コンソール上で下記のコマンドを実行したらエラーが出力されました。
SELECT getrenban('01');
出力されたエラーの内容は下記の通りです。
ERROR: value too long for type character varying(5)
CONTEXT: PL/pgSQL function "getrenban" line 19 at SQL statement
お恥ずかしいですがいくらコードを見てもどこが原因なのかわかりません。
申し訳ありませんがご教授お願いできませんでしょうか。
昨日から悩んでいます。
どうか助けて下さい、宜しくお願いします。
No.1ベストアンサー
- 回答日時:
>ERROR: value too long for type character varying(5)
>CONTEXT: PL/pgSQL function"getrenban" line 19 at SQL statement
line 19と言う事は
code5 := '''';
SELECT TO_CHAR(renban, ''00000'') INTO code5;
↑
この辺ですよね。
で、「長過ぎてvarchar(5)に入れられない」と怒られています。
PL/pgSQLは実務で使った事がないのですが、オラクルのPL/SQLの観点で回答します。
5桁の数字が入ったintegerの変数をTO_CHARすると結果は6桁になります。
+-が一桁付加されるからです。
(正の場合は半角スペース)
なので「長過ぎてvarchar(5)に入れられない」と怒られたわけです。
代入時にスペースをトリムすれば解決します。
それと、クリア時のダブルクォートが気になりましたが、コンパイルが通っているので、これは問題無いのでしょうね。
回答ありがとうございます。
知りませんでした。
結果が6桁になるなんて・・・
大変、勉強になりました。
本当に助かりました、ありがとうございました。
No.2
- 回答日時:
1点気になりましたが、複数セッ
ションからの同時アクセスに
ついての要件はどうなっています
でしょうか?
これだと同時アクセスの際に、
運が悪ければ同じ連番になって
しまいます。
通常はこの手の場合、シーケンス
オブジェクトを使用します。
(重複する事なく、カウントアップ
できます)
要件的に許されるのであれば、今
の作りでもよいですが、そうで
なければ、シーケンスの使用を
検討してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- Visual Basic(VBA) ローマ字、ハイフン付きの並び替え ローマ字抽出方法 Excelマクロ 4 2022/04/01 14:10
- PHP $_SESSIONについて教えて下さい。 4 2023/03/13 13:45
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- その他(プログラミング・Web制作) visual studio code 共有方法 1 2022/04/06 17:55
- Windows 10 VirtualBox 7のゲストOSでの物理HDDパーティションのマウント方法 2 2023/05/04 13:01
- その他(プログラミング・Web制作) VS codeを使って、ラズパイ Picoを動かせる簡単な方法 1 2023/04/27 13:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで縦のカラムデータを...
-
自治会総会の成立要件について
-
Windows10がインストールできま...
-
SQLでUPSERTを一度に複数行やる...
-
plgファイルの開き方
-
PostgreSQLとmysqlはどちらを選...
-
レンタルサーバーのPostgreSQL...
-
postgresqlでのトランザクショ...
-
直近2年度連続で減少していない...
-
列が存在しないと言われる
-
postgreSQLのint型は桁数指定が...
-
postgresql についてです
-
PostgreSQL14.6のSSL対応について
-
PuTTyにログインまでは出来たの...
-
PostgreSqlでFunctionの作成に...
-
ウィンドウズ10へアップロー...
-
PostgresSQLの環境設定について
-
mplabの事です。 2年くらい前に...
-
Windows10でQuickTimeがインス...
-
select文の書き方「半角カナ+...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
自治会総会の成立要件について
-
postgresql についてです
-
postgreSQLのint型は桁数指定が...
-
SQLでUPSERTを一度に複数行やる...
-
plgファイルの開き方
-
SQLにて指定日付より前、かつ最...
-
select文の書き方「半角カナ+...
-
エクセルで縦のカラムデータを...
-
PostgreSqlでFunctionの作成に...
-
postgresqlでのトランザクショ...
-
新規作成したPostgresqlデータ...
-
select文の書き方で分からない...
-
列が存在しないと言われる
-
PostgreSQLについて教えてくだ...
-
shellからpostgresqlへの変数の...
-
Windows10でQuickTimeがインス...
-
Postgreのupdateコマンドでエラー
-
bashスクリプトでpostgreSQLの...
-
Windows10がインストールできま...
-
PostgresSQLの環境設定について
おすすめ情報