your programing

낮은 권한으로 PL-SQL을 사용하여 Oracle에서 열 데이터 유형을 얻으려면 어떻게해야합니까?

lovepro 2021. 1. 5. 19:46
반응형

낮은 권한으로 PL-SQL을 사용하여 Oracle에서 열 데이터 유형을 얻으려면 어떻게해야합니까?


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 문으로 읽기 액세스 권한이있는 테이블에서 열의 데이터 유형과 데이터 길이를 어떻게 얻을 수 있습니까?


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)

desc명령을 사용할 수 있습니다 .

desc MY_TABLE

그러면 열 이름, null이 유효한지 여부 및 데이터 유형 (및 해당되는 경우 길이)이 제공됩니다.


그런 경우에 내가 찾은 최고의 해결책은

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, 수정 해 주셔서 감사합니다!


참고 : 다른 SCHEMA에있는 테이블에 대해이 정보를 얻으려는 경우 all_tab_columns보기를 사용하면 애플리케이션이 보안 목적으로 다른 SCHEMA를 사용하므로이 문제가 발생합니다.

다음을 사용하십시오.

예 :

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

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

Oracle : 테이블의 전체 데이터 유형 목록을 가져옵니다.

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

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

빠르고 더러운 방법 (예 : 데이터가 오라클에 저장되는 방식 확인)

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 (숫자)임을 보여줍니다.


이것을 시도 할 수 있습니다.

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)';

참조 URL : https://stackoverflow.com/questions/2339053/how-do-i-get-column-datatype-in-oracle-with-pl-sql-with-low-privileges

반응형