2010-02-26 16 views
44

Oracle veritabanında birkaç tabloya "salt okunur" erişimim var. Bazı sütunlarda şema bilgileri almam gerekiyor. MS SQL'in sp_help ile benzer bir şey kullanmak istiyorum.Oracle'da, düşük ayrıcalıklara sahip PL-SQL ile sütun veri türünü nasıl alabilirim?

Ben bu sorguda belirtilen ilgileniyorum tabloya bakınız: Ben bu sorguyu çalıştırdığınızda

SELECT * FROM ALL_TABLES 

Oracle söylüyor "masa şemasında mevcut değil" ve evet parametreler doğru. Benim Oracle evrensel tercüman 9000 kullandıktan sonra

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

ben yeterli ayrıcalıklara sahip olmadığı için bu işe yaramazsa tahmin edebilmiş ettik. Kısıtlamalarım göz önüne alındığında, bir PL-SQL ifadesiyle okuduğum bir tablodaki bir sütunun veri türü ve veri uzunluğunu nasıl alabilirim?

cevap

42

ALL_TAB_COLUMNS PL/SQL den sorgulanabilir olmalıdır olacak. DESC bir SQL * Plus komutudur.

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) 
+5

Bir örnek güzel olurdu. – leanne

+2

@leanne Bu tabloyu şöyle kullanıyorsunuz: 'SELECT * FROM user_tab_columns WHERE table_name = 'FILL_IN_THE_TABLE_NAME' AND column_name = 'FILL_IN_THE_COLUMN_NAME';' – Tenzin

+0

Yep, @Tenzin - Sizinki gibi birkaç örnek burada verilmiştir. Bu yazıya yapılan düzenleme. Bu cevapta 'düzenlenmiş ...' satırını tıklarsanız, Adem'in daha iyi açıklamak için neler eklediğini göreceksiniz. Teşekkürler Adam!) – leanne

26

desc komutunu kullanabilirsiniz.

desc MY_TABLE 

Bu boş geçerli olup olmadığını, size sütun adlarını vermek ve veri türü (ve uzunluk varsa)

+0

@akf - İşe yarıyor, teşekkürler. – James

6
select t.data_type 
    from user_tab_columns t 
where t.TABLE_NAME = 'xxx' 
    and t.COLUMN_NAME='aaa' 
+0

Nice, geçerli şemanın dışındaki tablolarda "user_tab_columns" ile değiştirilebiliyor "all_tab_columns" –

5

Oracle:

select data_type || '(' || data_length || ')' 
from user_tab_columns where TABLE_NAME = 'YourTableName' 
14

Not: Tablonuzdaki tam veri türü bir listesini alın farklı bir şemada olan tablolar için bu bilgileri almak için çalışıyorsanız all_tab_columns görünümünü kullanın, uygulamalarımız güvenlik nedeniyle farklı bir SCHEMA kullandıkça bu problemi yaşıyoruz. Ben böyle bir durum için buldum

SELECT 
    data_length 
FROM 
    all_tab_columns 
WHERE 
    upper(table_name) = 'MY_TABLE_NAME' AND upper(column_name) = 'MY_COL_NAME' 
13

iyi çözüm

select column_name, 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') 
from user_tab_columns 
where table_name = 'TABLE_NAME' 
and column_name = 'COLUMN_NAME'; 

@Aaron Stainback olan düzeltme için teşekkür ederim:

EG:

aşağıdaki kullanın!

+1

CHAR_USED ekleyebilmeniz gerekir, böylece bir varchar2 –

+0

gibi bir şeyde bayt veya char olarak tanımlanıp tanımlanmadığını anlayabilirsiniz. kod, ancak INT alanı durumunda "NUMARASI (*, 0)" döndürür Bazı düzeltme gerekiyor –

+0

@ FirasNizam deneyin - belki doğru anlamıyorum ama data_scale 0 olduğunda, NUMBER (*) döndürür =! 0 ise NUMBER (*, data_scale) döndürüyor – sev3ryn

2
select column_name, data_type || '(' || data_length || ')' as datatype 
from all_tab_columns 
where TABLE_NAME = upper('myTableName') 
1

hızlı ve kirli bir şekilde (örneğin, veri oracle saklanır görmek için), 10 ise,

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. 

Tablo sys.dual kukla sütun tip = 1 (varchar2) sahip olduğunu gösterir Tip = 2 (sayı).

İlgili konular