【PostgreSQL】テーブル存在チェック,フィールド存在チェックなストアドプロシジャ[PL/pgSQL]
関連記事
- 【#PostgreSQL】3ヶ月ぶりぐらいにSQLを眺めているが,判らん!!モルモルモル 【2024年07月25日(木)】
- 【#PostgreSQL】太古の昔から動いているシステムのレコード,手修正作業をするなど,と 【2023年10月06日(金)】
- 【#PostgreSQL】テーブルから取得したレコードセットをCSVへ落とそうとすると,空ファイルが出来る...ドロドロドロ 【2023年03月08日(水)】
- 仕事オワタ 昼寝しよ(GRB爆 【2023年02月23日(木)】
- 【#PostgreSQL】鬼のような4本のSQLを書き上げた 【2023年01月13日(金)】
チョロっと書いてみた
ストアドレベルで書いておけば,取り回しも楽じゃろと?
ざっと調べて,ネットに事例もなかったんで載せておきまする
※SQLインジェクションな対応コードにはなってませんです
SQL文を文字列結合で組み立てる凶悪なコード(汗
バインドしても良かったけど,面倒くさくなったんでやめた(爆
ネット公開なサーバに本ストアド載せるときは,前段に必ずSQLインジェクション対応処理をおねがいしまする
今回のうちの案件は,完全ローカルなクローズドシステムなんでSQLインジェクションは関係ないもんで(GRB汗
毎度おなじみ,バグってたらスマソ(猛汗
—–
istable(テーブル名)がテーブルの存在チェック
isfield(テーブル名, フィールド名)がフィールドの存在チェック
どっちもtrueかfalseを返しまする
ex)
select istable(‘test_tbl’);
select isfield(‘test_tbl’, ‘mainkey’);
CREATE OR REPLACE FUNCTION public.istable(tblname text)
RETURNS boolean AS
$BODY$
DECLARE
sqlstr text;
cur_max refcursor;
colfields record;
result boolean;
BEGIN
-- 処理
result := false;
sqlstr := 'select count(tablename) as cnt from pg_tables where tablename = ''' || tblname || ''''; --SQL定義
open cur_max for EXECUTE sqlstr; --カーソル Open
loop
fetch cur_max into colfields;
if not found then
exit;
end if;
if colfields.cnt > 0 then
result := true;
else
result := false;
end if;
exit;
end loop;
close cur_max; --カーソルクローズ
return result;
END;
$BODY$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION public.isfield(
tblname text,
fieldname text)
RETURNS boolean AS
$BODY$
DECLARE
sqlstr text;
cur_max refcursor;
colfields record;
result boolean;
BEGIN
-- 処理
result := false;
sqlstr := '
select count(attname) as cnt
from pg_attribute
where attnum > 0
and attrelid = (select relfilenode from pg_class where relname = ''' || tblname || ''')
and attname = ''' || fieldname || ''''; --SQL定義
open cur_max for EXECUTE sqlstr; --カーソル Open
loop
fetch cur_max into colfields;
if not found then
exit;
end if;
if colfields.cnt > 0 then
result := true;
else
result := false;
end if;
exit;
end loop;
close cur_max; --カーソルクローズ
return result;
END;
$BODY$
LANGUAGE plpgsql;

コメント
広島カープの羽月隆太郎容疑者、「ゾンビたばこ」使用の疑いで逮捕
【#総選挙】衆議院選挙 きょう公示 12日間の選挙戦へ
青森 スノーモービル乗るため入山の約10人と連絡取れず 遭難か
【#不発弾】宮崎市中心部の不発弾 17日に処理 避難指示や交通規制予定(26/1/17)
【総選挙】立民 公明 衆院選に向け新党結成で合意(26/1/15)
【大雪】大雪と雷及び突風に関する全般気象情報 第3号(26/1/1)
ブルーレイはオワコン? ソニー生産終了が意味する「次世代メディア」の失敗
ビジネスホテルで火事 1人遺体で見つかる 宿泊客4人けが 水戸
【#ドラセナ】御神木たる幸福の木(ドラセナ):花芽がほころびだした!すごい香りで部屋が満たされてる!