낮은 권한으로 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_COLUMNS
PL / SQL에서 쿼리 할 수 있어야합니다. DESC
SQL * 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)';
'your programing' 카테고리의 다른 글
ASP.NET GridView RowIndex As CommandArgument (0) | 2021.01.05 |
---|---|
Windows에서 pkg 구성을 설치하는 방법은 무엇입니까? (0) | 2021.01.05 |
android sdk main.out.xml 파싱 오류? (0) | 2021.01.05 |
NSCharacterSet : alphanumericCharacterSet 텍스트 제한에“_”를 어떻게 추가합니까? (0) | 2021.01.05 |
Google MAP API v3 : 표시된 마커의 중앙 및 확대 / 축소 (0) | 2021.01.05 |