65

Oracle データベースのいくつかのテーブルへの「読み取り専用」アクセス権があります。一部の列のスキーマ情報を取得する必要があります。MS SQL に似たものを使用したいと思いますsp_help

興味のあるテーブルが次のクエリに表示されます。

SELECT * FROM ALL_TABLES

このクエリを実行すると、Oracle から「スキーマにテーブルが見つかりません」と表示されますが、パラメータは正しいです。

SELECT 
DBMS_METADATA.GET_DDL('TABLE', 'ITEM_COMMIT_AGG', 'INTAMPS') AS DDL
FROM DUAL;

Oracle Universal Translator 9000 を使用した後、十分な権限がないため、これは機能しないと推測しました。制約がある場合、PL-SQL ステートメントで読み取りアクセス権を持つテーブルの列のデータ型とデータ長を取得するにはどうすればよいですか?

4

11 に答える 11

62

ALL_TAB_COLUMNSPL/SQL からクエリ可能である必要があります。 DESCSQL*Plus コマンドです。

SQL> desc all_tab_columns;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER                                     NOT NULL VARCHAR2(30)
 TABLE_NAME                                NOT NULL VARCHAR2(30)
 COLUMN_NAME                               NOT NULL VARCHAR2(30)
 DATA_TYPE                                          VARCHAR2(106)
 DATA_TYPE_MOD                                      VARCHAR2(3)
 DATA_TYPE_OWNER                                    VARCHAR2(30)
 DATA_LENGTH                               NOT NULL NUMBER
 DATA_PRECISION                                     NUMBER
 DATA_SCALE                                         NUMBER
 NULLABLE                                           VARCHAR2(1)
 COLUMN_ID                                          NUMBER
 DEFAULT_LENGTH                                     NUMBER
 DATA_DEFAULT                                       LONG
 NUM_DISTINCT                                       NUMBER
 LOW_VALUE                                          RAW(32)
 HIGH_VALUE                                         RAW(32)
 DENSITY                                            NUMBER
 NUM_NULLS                                          NUMBER
 NUM_BUCKETS                                        NUMBER
 LAST_ANALYZED                                      DATE
 SAMPLE_SIZE                                        NUMBER
 CHARACTER_SET_NAME                                 VARCHAR2(44)
 CHAR_COL_DECL_LENGTH                               NUMBER
 GLOBAL_STATS                                       VARCHAR2(3)
 USER_STATS                                         VARCHAR2(3)
 AVG_COL_LEN                                        NUMBER
 CHAR_LENGTH                                        NUMBER
 CHAR_USED                                          VARCHAR2(1)
 V80_FMT_IMAGE                                      VARCHAR2(3)
 DATA_UPGRADED                                      VARCHAR2(3)
 HISTOGRAM                                          VARCHAR2(15)
于 2010-02-26T03:55:13.430 に答える
42

コマンドを使用できますdesc

desc MY_TABLE

これにより、列名、null が有効かどうか、およびデータ型 (および該当する場合は長さ) が得られます。

于 2010-02-26T02:07:18.267 に答える
17

注: all_tab_columns ビューを使用して別の SCHEMA にあるテーブルについてこの情報を取得しようとしている場合、アプリケーションがセキュリティ上の目的で別の SCHEMA を使用しているため、この問題が発生します。

以下を使用します。

例えば:

SELECT
    data_length 
FROM
    all_tab_columns 
WHERE
    upper(table_name) = 'MY_TABLE_NAME' AND upper(column_name) = 'MY_COL_NAME'
于 2012-11-07T18:59:15.177 に答える
13
select t.data_type 
  from user_tab_columns t 
 where t.TABLE_NAME = 'xxx' 
   and t.COLUMN_NAME='aaa'
于 2010-03-04T06:38:18.547 に答える
12

Oracle: テーブル内の完全なデータ型のリストを取得します。

select data_type || '(' || data_length || ')' 
from user_tab_columns where TABLE_NAME = 'YourTableName'
于 2011-07-18T20:05:22.810 に答える
5
select column_name, data_type || '(' || data_length || ')' as datatype
from all_tab_columns 
where TABLE_NAME = upper('myTableName')
于 2014-08-20T10:58:58.180 に答える
2

手っ取り早い方法 (たとえば、Oracle にデータがどのように格納されているかを確認するため)

SQL> select dump(dummy) dump_dummy, dummy
     , dump(10) dump_ten
from dual

DUMP_DUMMY       DUMMY DUMP_TEN            
---------------- ----- --------------------
Typ=1 Len=1: 88  X     Typ=2 Len=2: 193,11 
1 row selected.

テーブル sys.dual のダミー列には typ=1 (varchar2) があり、10 は Typ=2 (数値) であることを示します。

于 2015-09-22T19:05:02.113 に答える
1

これを試すことができます。

SELECT *
  FROM (SELECT column_name,
               data_type,
               data_type
               || CASE
                     WHEN data_precision IS NOT NULL
                          AND NVL (data_scale, 0) > 0
                     THEN
                        '(' || data_precision || ',' || data_scale || ')'
                     WHEN data_precision IS NOT NULL
                          AND NVL (data_scale, 0) = 0
                     THEN
                        '(' || data_precision || ')'
                     WHEN data_precision IS NULL AND data_scale IS NOT NULL
                     THEN
                        '(*,' || data_scale || ')'
                     WHEN char_length > 0
                     THEN
                        '(' || char_length
                        || CASE char_used
                              WHEN 'B' THEN ' Byte'
                              WHEN 'C' THEN ' Char'
                              ELSE NULL
                           END
                        || ')'
                  END
               || DECODE (nullable, 'N', ' NOT NULL')
                  DataTypeWithLength
          FROM user_tab_columns
         WHERE table_name = 'CONTRACT')
 WHERE DataTypeWithLength = 'CHAR(1 Byte)';
于 2019-03-02T05:11:44.863 に答える