Oracle 데이터 유형의 문자열 값을 코드로 결정하려면 어떻게 해야 합니까?
사용합니다.DBMS_SQL.DESCRIBE_COLUMNS
절차: 내 SELECT 쿼리에 대한 결과 집합에서 열에 사용되는 데이터 유형을 식별합니다.하지만 안타깝게도 이렇게 하면 Oracle의 데이터 유형 코드만 얻을 수 있습니다. (record.col_type
) - 1, 8, 12 등
그래서 어떻게 하면 숫자 코드 대신 반환된 데이터 유형의 코드(즉, VARCHAR2, LONG, DATE 등)에 해당하는 문자열을 쉽게 얻을 수 있는지 궁금합니다.
이 솔루션은 약간 투박하지만 CASE 문을 사용하여 데이터 유형 설명을 "검색"할 수 있습니다.
case record.col_type
when dbms_types.TYPECODE_DATE then 'DATE'
when dbms_types.TYPECODE_NUMBER then 'NUMBER'
when dbms_types.TYPECODE_RAW then 'RAW'
when dbms_types.TYPECODE_CHAR then 'CHAR'
when dbms_types.TYPECODE_VARCHAR2 then 'VARCHAR2'
when dbms_types.TYPECODE_VARCHAR then 'VARCHAR'
when dbms_types.TYPECODE_MLSLABEL then 'MLSLABEL'
when dbms_types.TYPECODE_BLOB then 'BLOB'
when dbms_types.TYPECODE_BFILE then 'BFILE'
when dbms_types.TYPECODE_CLOB then 'CLOB'
when dbms_types.TYPECODE_CFILE then 'CFILE'
when dbms_types.TYPECODE_TIMESTAMP then 'TIMESTAMP'
when dbms_types.TYPECODE_TIMESTAMP_TZ then 'TIMESTAMP_TZ'
when dbms_types.TYPECODE_TIMESTAMP_LTZ then 'TIMESTAMP_LTZ'
when dbms_types.TYPECODE_INTERVAL_YM then 'INTERVAL_YM'
when dbms_types.TYPECODE_INTERVAL_DS then 'INTERVAL_DS'
when dbms_types.TYPECODE_REF then 'REF'
when dbms_types.TYPECODE_OBJECT then 'OBJECT'
when dbms_types.TYPECODE_VARRAY then 'VARRAY'
when dbms_types.TYPECODE_TABLE then 'TABLE'
when dbms_types.TYPECODE_NAMEDCOLLECTION then 'NAMEDCOLLECTION'
when dbms_types.TYPECODE_OPAQUE then 'OPAQUE'
when dbms_types.TYPECODE_NCHAR then 'NCHAR'
when dbms_types.TYPECODE_NVARCHAR2 then 'NVARCHAR2'
when dbms_types.TYPECODE_NCLOB then 'NCLOB'
when dbms_types.TYPECODE_BFLOAT then 'BFLOAT'
when dbms_types.TYPECODE_BDOUBLE then 'BDOUBLE'
when dbms_types.TYPECODE_UROWID then 'UROWID'
end case
이에 대한 값을 얻으려면 tbone이 제안하는 대로 데이터 사전을 쿼리해야 합니다.
DBMS_TYPEs 패키지(나의 11gr2에서)를 확인합니다.
select text from all_source
where owner='SYS'
and name='DBMS_TYPES'
and type='PACKAGE';
PACKAGE dbms_types AS
TYPECODE_DATE PLS_INTEGER := 12;
TYPECODE_NUMBER PLS_INTEGER := 2;
TYPECODE_RAW PLS_INTEGER := 95;
TYPECODE_CHAR PLS_INTEGER := 96;
TYPECODE_VARCHAR2 PLS_INTEGER := 9;
TYPECODE_VARCHAR PLS_INTEGER := 1;
TYPECODE_MLSLABEL PLS_INTEGER := 105;
TYPECODE_BLOB PLS_INTEGER := 113;
TYPECODE_BFILE PLS_INTEGER := 114;
TYPECODE_CLOB PLS_INTEGER := 112;
TYPECODE_CFILE PLS_INTEGER := 115;
TYPECODE_TIMESTAMP PLS_INTEGER := 187;
TYPECODE_TIMESTAMP_TZ PLS_INTEGER := 188;
TYPECODE_TIMESTAMP_LTZ PLS_INTEGER := 232;
TYPECODE_INTERVAL_YM PLS_INTEGER := 189;
TYPECODE_INTERVAL_DS PLS_INTEGER := 190;
TYPECODE_REF PLS_INTEGER := 110;
TYPECODE_OBJECT PLS_INTEGER := 108;
TYPECODE_VARRAY PLS_INTEGER := 247; /* COLLECTION TYPE */
TYPECODE_TABLE PLS_INTEGER := 248; /* COLLECTION TYPE */
TYPECODE_NAMEDCOLLECTION PLS_INTEGER := 122;
TYPECODE_OPAQUE PLS_INTEGER := 58; /* OPAQUE TYPE */
/* NOTE: These typecodes are for use in AnyData api only and are short forms
for the corresponding char typecodes with a charset form of SQLCS_NCHAR.
*/
TYPECODE_NCHAR PLS_INTEGER := 286;
TYPECODE_NVARCHAR2 PLS_INTEGER := 287;
TYPECODE_NCLOB PLS_INTEGER := 288;
/* Typecodes for Binary Float, Binary Double and Urowid. */
TYPECODE_BFLOAT PLS_INTEGER := 100;
TYPECODE_BDOUBLE PLS_INTEGER := 101;
TYPECODE_UROWID PLS_INTEGER := 104;
SUCCESS PLS_INTEGER := 0;
NO_DATA PLS_INTEGER := 100;
109는 사용자 정의 유형이므로 대신 DESCERFORM_COLUMNS3을 사용해야 할 수도 있습니다.
사용하다ANYDATA.GetTypeName
다음은 설명과 예시가 있는 링크입니다. http://www.oracle-developer.net/display.php?id=218
그리고 나는 다음을 인용합니다.
SQL> DECLARE
2 v_anydata ANYDATA := ANYDATA.ConvertVarchar2('String');
3 v_typename VARCHAR2(128);
4 BEGIN
5 v_typename := v_anydata.GetTypeName();
6 DBMS_OUTPUT.PUT_LINE('Type of ANYDATA instance is [' || v_typename || ']');
7 END;
8 /
Type of ANYDATA instance is [SYS.VARCHAR2]
PL/SQL procedure successfully completed.
다음은 선택에서 이를 사용하는 몇 가지 예입니다.
시도:
select
distinct
c.type# type_code,
decode(c.type#, 1, decode(c.charsetform, 2, 'NVARCHAR2', 'VARCHAR2'),
2, decode(c.scale, null, decode(c.precision#, null, 'NUMBER', 'FLOAT'), 'NUMBER'),
8, 'LONG',
9, decode(c.charsetform, 2, 'NCHAR VARYING', 'VARCHAR'),
12, 'DATE',
23, 'RAW', 24, 'LONG RAW',
69, 'ROWID',
96, decode(c.charsetform, 2, 'NCHAR', 'CHAR'),
100, 'BINARY_FLOAT',
101, 'BINARY_DOUBLE',
105, 'MLSLABEL',
106, 'MLSLABEL',
111, 'REF',
112, decode(c.charsetform, 2, 'NCLOB', 'CLOB'),
113, 'BLOB', 114, 'BFILE', 115, 'CFILE',
121, 'USER_TYPE',
122, 'USER_TYPE',
123, 'USER_TYPE',
178, 'TIME(' ||c.scale|| ')',
179, 'TIME(' ||c.scale|| ')' || ' WITH TIME ZONE',
180, 'TIMESTAMP(' ||c.scale|| ')',
181, 'TIMESTAMP(' ||c.scale|| ')'||' WITH TIME ZONE',
231, 'TIMESTAMP(' ||c.scale|| ')'||' WITH LOCAL TIME ZONE',
182, 'INTERVAL YEAR(' ||c.precision#||') TO MONTH',
183, 'INTERVAL DAY(' ||c.precision#||') TO SECOND(' ||
c.scale || ')',
208, 'UROWID',
'UNDEFINED') type_name from sys.col$ c order by c.type#;
언급URL : https://stackoverflow.com/questions/12040140/how-can-i-determine-string-value-of-oracles-datatype-by-its-code
'programing' 카테고리의 다른 글
MySQL이 null/empty를 반환하는지 확인하는 방법은 무엇입니까? (0) | 2023.11.01 |
---|---|
정수를 문자 등가로 변환합니다. 여기서 0 = > a, 1 = > b 등 (0) | 2023.11.01 |
임베디드 시스템에서의 malloc 동작 (0) | 2023.11.01 |
Maria로 전환한 후 MATCH 쿼리 문제DB (0) | 2023.11.01 |
파워셸에 연관 배열이 있습니까? (0) | 2023.11.01 |