• ベストアンサー

カラムサイズの取得

度々の質問で少々気恥ずかしいのですが・・・ 先日カラム一覧を取得する方法として、多くのRDBMSではシステムカタログを 参照するのが一般的な方法ということを教えて頂きました。 現在pgAdminIIIを使って、システムカタログの中がどうなっているのか、 色々勉強しているのですが、カラムサイズを取得するにはどこを参照すれば 良いのでしょうか? たとえばvarchar(40)のカラムがあった場合に「40」 という数値を取得したいのですが・・・ どなたかご存知であれば、ご教授下さい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#1回答者です。 PostgreSQLはデータ型が豊富なためか、システムカタログの参照方法が分かりにくいですね。 表中にシステム用の列も作っており、そのまま定義情報を検索すると、ユーザの定義列と一緒に情報を拾ってしまいます。 #1のSQLから、対応するデータ型の追加、「_bpchar」→「char」といった表示変更をするようにしました。 #1と併せて実行してもらえると、違いが分かりやすいと思います。 select relname as 表名, attname as 列名, attnum as 列番, case typname when '_bpchar' then 'char' when '_varchar' then 'varchar' when '_date' then 'date' when '_float8' then 'float8' when '_int4' then 'integer' when '_interval' then 'interval' when '_numeric' then 'numeric' when '_float4' then 'float4' when '_int2' then 'smallint' when '_text' then 'text' when '_time' then 'time' when '_timestamp' then 'timestamp' end as 型, case typname when '_bpchar' then atttypmod - 4 when '_varchar' then atttypmod - 4 when '_numeric' then (atttypmod - 4) / 65536 else attlen end as 長さ, case typname when '_numeric' then (atttypmod - 4) % 65536 else 0 end as 小数 from pg_stat_user_tables as a, pg_attribute as b, pg_type as c where schemaname='u1' and relname='t1' and a.relid=b.attrelid and b.attnum>0 and b.atttypid=c.typelem and substr(typname,1,1)='_' order by schemaname,relname,attnum;

noname#100297
質問者

お礼

chukenkenkouさん、こんばんは。二度も助けて頂いて恐縮です。 ちょっとバタバタとしており、お返事が遅くなったこと、また、せっかく ご回答を戴いたのに、未だ自分自身で確認ができておりませんことを お詫び致しますm(_ _)m  近日中に自分自身の手で確認してみようと思います。 いつも丁寧なご回答を戴き、本当にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

列の定義長は、intやdateなど固定もものは、pg_attribute表のattlen列に入っています。 charやvarchar,decimalなどは、pg_attribute表のatttypmod列に入っています。 (長さを管理するための4バイトが、付加されています) データ型の種類(char,varchar等)は、pg_type表のtypname列に入っています。 ただ、格納形式はcharの場合、「_bpchar」のように入っています。 【試作したSQL】 select relname as 表名, attname as 列名, attnum as 列番, typname as 型, case typname when '_bpchar' then atttypmod - 4 when '_varchar' then atttypmod - 4 when '_numeric' then (atttypmod - 4) / 65536 when '_decimal' then (atttypmod - 4) / 65536 else attlen end, case typname when '_numeric' then (atttypmod - 4) % 65536 when '_decimal' then (atttypmod - 4) % 65536 else 0 end from pg_stat_user_tables as a, pg_attribute as b, pg_type as c where schemaname='u1' and a.relid=b.attrelid and b.attnum>0 and b.atttypid=c.typelem order by schemaname,relname,attnum; ●他の方が作成していたSQL http://www.shonan.ne.jp/~nkon/cslpg.a.semi/mgp00029.txt ●pg_attribute表 http://www.postgresql.jp/document/pg801doc/html/catalog-pg-attribute.html ●pg_type表 http://www.postgresql.jp/document/pg801doc/html/catalog-pg-type.html

noname#100297
質問者

お礼

このコミュニティーを上手く使いこなせていないので、お礼のやり方が変に なりましたが、どうしてもお礼が言いたかったので、ここに記入しました。 chukenkenkouさん、いつも的確なご返答を戴き大変感謝しております。 #2の方法で、必要としている情報が一目瞭然でした。本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 行情報だけが欲しい(カラム名いらいない)

    set(確かOracleだと)などを使って、カラム名とあとカラム名と行の間の-------を省く方法を教えて下さい。 実行の結果だけが欲しいのです。 あと、SQL実行結果のフィールドサイズ(カラムサイズ)を変更できませんか? SET TEXTSIZEだとvarcharが変えられいみたいです。何卒よろしくお願いします。

  • ストアド内でカラム名一覧を取得

    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ストアド内でカラム名一覧を取得、カンマで繋げてひとつの変数にまとめたい。 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 現在開発でストアドを使用する機会があり、そこで不明点が発生し悩んでおります。 以下、現状と質問です。 ■SQL SERVER 2000 ■テーブル(※)のカラム名一覧を取得し、  カラム名をカンマで繋げてひとつの変数に格納したいと思っています。  ※先の処理でカラムを取得したいテーブルをSELECTしており、  対象のテーブル名を変数に代入しています。  カラム一覧を取得するにあたり、以下のようにカーソルで習得し、  FETCHでカラム名を変数に格納しようと考えていましたが、  「'対象テーブル名'」には変数がいれられないので、どうしようかと悩んでいます。  DECLARE CURS_test CURSOR FOR   SELECT name FROM dbo.syscolumns   WHERE id IN   (SELECT id FROM dbo.sysobjects WHERE name = '対象テーブル名')   ORDER BY id, colid;  「sp_executesql」を使用してselect文を流そうとしたのですが、  複数ある列名を取得して、上記で記載しましたように  カラム名をカンマで繋げてひとつの変数に格納する方法がわかりませんでした。  こういった場合、どのように考えて、どのように書けばよいのでしょうか。  まだ触り始めたばかりで、わからないことがわかっていない部分もあり、  質問内容でわかりにくい部分がありましたらご指摘いただければと思います。  どうぞよろしくお願いいたします。

  • MySQL(5.5)1テーブル内のカラム数制限

    首記、InnoDBであれば1000、MyISAMであれば4096という仕様かと思いますが、CREATE TABLEを実行するとカラム数1500くらいから #1117 Too many columns のエラーが出てしまい、カラム数の多いテーブル追加ができない状況です。 こちら、事象や考えられる原因、対処方法などご存じの方がいれば教示いただけますか。 またVARCHARの64K制限があるため多くのカラムはTEXTにしています。

    • ベストアンサー
    • MySQL
  • カーソルで取得した項目のサイズについて質問です。。

    カーソルで取得した項目のサイズについて質問です。。 SELECTした項目のサイズが下記の場合、 レコード格納変数.Cの最大サイズは(14)で、それ以上のバイト数値を代入すると エラーになると思ったのですが、エラーになりませんでした。(最大28バイトになった) レコード格納変数の取得した項目サイズは何で決まってくるのでしょうか? この項目を別テーブルのVARCHAR(20)の項目へ設定しようと思っているのですが、 理由がわからないので、このままでいいのか、サイズを考慮した設計にするべきか困っています。 <oracle 9i> TABLE1{A VARCHAR2(4), B VARCHAR2(10)} DECLARE  CURSOR カーソル変数 IS SELECT A||B AS C FROM TABLE1;  レコード格納変数 カーソル変数%ROWTYPE; BEGIN  OPEN カーソル変数  LOOP   FETCH カーソル変数 INTO レコード格納変数;   EXIT WHEN カーソル変数%NOTFOUND;    :    レコード格納変数.C := VARCAHR2(15) --代入可能?    :    INSERT 項目1 VARCHAR(20) TABLE2 レコード格納変数.C;    :  END LOOP  CLOSE カーソル変数 END;

  • DBのFLOATカラムに格納した値の取得

    お世話になります。 MySQLのFLOATのカラムに9999999のような数値を格納すると、x.xxxxe+xxxのような値になってしまいます。 これを普通にselectで取得すると、x.xxxxe+xxxのままの数値なのですが、これを格納時点の999999のような数値に整形する方法はあるでしょうか? また、879.823928のような少数の値もよく判らないx.xxxxe+xxxのような値になっております。 この場合の整形方法もありませんでしょうか? ご教授ください。よろしくお願い致します。

    • 締切済み
    • PHP
  • MySQLでvarchar型のデータの最大値を取得する方法

    お世話になります。 どなたかご回答&アドバイスをよろしくお願い致します。 MySQLで、以下のように登録されているデータがあるとします。 ID(varchar) | name(varchar) 0000001 | ああああ 0000002 | いいいい 0000004 | ううううう それで、登録されているIDの最大値+1を取得したいのです。 IDのカラムのデータ型がIntならmaxで取得できると思うのですが、データ型がvarcharなので…。 レコードの数+1というのは、IDが必ずしも1から飛びがなく登録されているとは限らないので、 その方法は危ないのでできません。 上の例だと、「0000005」を取得したいです。 どうぞご教授お願い致します。

    • ベストアンサー
    • PHP
  • 改行コードを削除して取得する方法はあるでしょうか?

    改行コードを削除して取得する方法はあるでしょうか? DB2で開発しているのですが、charやvarcharやgraphicなどのカラムに改行コードが含まれた文字列が入っていた場合、改行コードを抜いて取得する方法などはあるでしょうか。 よろしくければアドバイス頂けると嬉しいです。

  • クエリー : テーブル一覧&定義情報取得

    手元にOracleがなく、実際にクエリーを投げて試すこともできず困っています。以下について教えて下さい。 1.Oracleにて、自分で作ったテーブルの名前の一覧を取得するクエリーを教えて下さい。 2.各テーブルにおいて、定義情報(カラム名、カラムサイズetc)を取得するクエリーを教えて下さい。 よろしくお願いします。

  • WINDOWSNTでディスクサイズを取得

    ディスクサイズをチェックするシステムを作成しているのですが、 WINDOWSXPでは、正常に動作したのですが、 WINDOWSNTでは、うまく動作しません、どなたか、 ディスクサイズを取得する方法を教えてください。 また、WINDOWSNTの環境では無理なのでしょうか? よろしくお願いします。

  • Excel VBA で Oracle CLOB型カラムの文字列を取得する方法

    Excel VBA を使用して、Oracleに格納されている文字列を取得しようとしています。 Number型やVarchar2型のカラムからは問題なく取得できるようになったのですが、CLOB型で文字列を格納しているカラムからの取得でつまずいています。 自分の書いた方法だと、1600バイト以上の文字列が格納されているとエラー文字が返ってきてしまいます。 これ以上の文字数を取得する方法について教えてもらえないでしょうか? '---// コード抜粋 ココから //--- 'ORAセッション生成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'ORADB生成 Set OraDatabase = OraSession.OpenDatabase(<<dbname>>, <<id>> & "/" & <<passwd>>, 0) Dim SQL As String '一覧取得用SQL Dim RS As Object 'レコードセット SQL = " SELECT <<<clob_col_name>> FROM <<table_name>> " Set RS = OraDatabase.DbCreateDynaset(SQL, 0&) Range("A1").Value = RS.fields("<<clob_col_name>>").GetChunk(0, 3263) RS.Close '---// コード抜粋 ココまで //--- 環境は、Excel 2003、Oracle 9iです。 ひとつよろしくお願いいたします。

このQ&Aのポイント
  • ひらがな入力の方法を教えてください。
  • 指を離しているのに、キーが押下されたままになる現象について故障かどうか知りたいです。
  • エレコム株式会社の製品に関する質問です。
回答を見る