ORACLE의 select 문에서 데이터 유형 필드 가져오기
select 문을 사용하여 값 대신 선택한 각 열의 데이터 유형을 가져올 수 있습니까?
예:
SELECT a.name, a.surname, b.ordernum
FROM customer a
JOIN orders b
ON a.id = b.id
그리고 결과는 다음과 같아야 한다.
name | NVARCHAR(100)
surname | NVARCHAR(100)
ordernum| INTEGER
또는 다음과 같이 줄지어 있어도 상관없습니다.
name | surname | ordernum
NVARCHAR(100) | NVARCHAR(100) | INTEGER
감사해요.
저는 이 작업을 직감적이지 않은 방법으로DUMP()
SELECT DUMP(A.NAME),
DUMP(A.surname),
DUMP(B.ordernum)
FROM customer A
JOIN orders B
ON A.id = B.id
다음과 같이 반환됩니다.
'Typ=1 Len=2: 0,48'
각 컬럼에 대해.
Type=1
수단VARCHAR2/NVARCHAR2
Type=2
수단NUMBER/FLOAT
Type=12
수단DATE
,기타.
데이터 유형 코드에 대한 정보는 이 Oracle 문서를 참조하십시오.
또는 Oracle 유형 코드 매핑을 단순하게 매핑하는 경우
문의할 수 있습니다.all_tab_columns
를 참조해 주세요.
SELECT table_name, column_name, data_type, data_length FROM all_tab_columns where table_name = 'CUSTOMER'
저는 보통 뷰를 만들고DESC
명령어:
CREATE VIEW tmp_view AS
SELECT
a.name
, a.surname
, b.ordernum
FROM customer a
JOIN orders b
ON a.id = b.id
그리고 나서DESC
명령어는 각 필드의 유형을 표시합니다.
DESC tmp_view
저도 같은 상황에 처했어요.이 문제를 해결하려면view
(특권이 있는 경우) 및 설명 후 드롭합니다.:)
Oracle에서 뷰를 작성할 수 있는 권한이 없는 경우 MS Access를 사용하기 위한 "해크"는 다음과 같습니다.
MS Access에서 sql을 사용하여 패스스루 쿼리를 작성하고(단, where 구를 추가하여 레코드를 1개만 선택), 뷰에서 선택 쿼리를 만들고(매우 중요), 모두 *를 선택한 다음 선택 쿼리에서 작성 테이블을 만듭니다.이렇게 하면 레코드가 1개 있는 테이블이 생성됩니다.즉, 패스스루 --> [ MakeTable ] --> [ Table ]를 선택합니다.
다른 더 좋은 방법이 있을 거라고 확신하지만, 제한된 도구와 권한이 있으면 이 방법이 효과적입니다.
또한 Toad for Oracle을 사용하는 경우 문을 강조 표시하고 +를 누르면 열과 해당 데이터 유형을 볼 수 있습니다.
필드 데이터 유형 데이터는 ODP의 클라이언트 코드에서 사용할 수 있습니다.Net. Oracle의 다른 라이브러리도 스키마 정보를 지원해야 합니다.C# 스크립트에서는 접속 문자열과 SELECT 문만 있으면 됩니다.Schema Data Only(스키마 데이터만)를 요청합니다.이 솔루션에는 지금까지 테스트에 필요한 추가 CREATE VIEW 권한이 없습니다.선택한 식에 대한 유형을 확인합니다.Con은 데이터베이스에 추가 라운드 트립을 추가합니다.
이 예에서는 c# 10을 사용하고 있으며 구문을 다운그레이드해야 할 수 있습니다.상수.Container Connection String은 연결 문자열 및 상수입니다.DvcrSyntax는 임의의 선택 스테이트먼트입니다.
using System.Data;
using Oracle.ManagedDataAccess.Client;
using OracleSchemaSample;
var connectionBuilder =
new OracleConnectionStringBuilder(Constants.ContainerConnectionString)
{
ConnectionTimeout = 30,
Enlist = "false",
PersistSecurityInfo = true
};
await using var connection = new OracleConnection(connectionBuilder.ConnectionString);
await using var command = new OracleCommand(Constants.DvcrSyntax, connection);
var cts = new CancellationTokenSource();
try
{
await connection.OpenAsync(cts.Token);
connection.ModuleName = "MyUnqueApplicatonName";
connection.ClientId = Guid.NewGuid().ToString(); // Tracing identity
await using var schemaReader = await command.ExecuteReaderAsync(CommandBehavior.SchemaOnly, cts.Token);
var columnSchema = await schemaReader.GetColumnSchemaAsync(cts.Token);
foreach (var column in columnSchema)
Console.WriteLine(
$"{column.ColumnOrdinal}\t{column.ColumnName}\t{column.DataType}\t{column.DataTypeName}\t{column.ColumnSize}");
}
catch (Exception exception)
{
Console.WriteLine(exception);
throw;
}
you can use the DBMS_SQL.DESCRIBE_COLUMNS2
SET SERVEROUTPUT ON;
DECLARE
STMT CLOB;
CUR NUMBER;
COLCNT NUMBER;
IDX NUMBER;
COLDESC DBMS_SQL.DESC_TAB2;
BEGIN
CUR := DBMS_SQL.OPEN_CURSOR;
STMT := 'SELECT object_name , to_char(object_id), created FROM DBA_OBJECTS where rownum<10';
SYS.DBMS_SQL.PARSE(CUR, STMT, DBMS_SQL.NATIVE);
DBMS_SQL.DESCRIBE_COLUMNS2(CUR, COLCNT, COLDESC);
DBMS_OUTPUT.PUT_LINE('Statement: ' || STMT);
FOR IDX IN 1 .. COLCNT
LOOP
CASE COLDESC(IDX).col_type
WHEN 2 THEN
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': NUMBER');
WHEN 12 THEN
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': DATE');
WHEN 180 THEN
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': TIMESTAMP');
WHEN 1 THEN
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': VARCHAR'||':'|| COLDESC(IDX).col_max_len);
WHEN 9 THEN
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': VARCHAR2');
-- Insert more cases if you need them
ELSE
DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': OTHERS (' || TO_CHAR(COLDESC(IDX).col_type) || ')');
END CASE;
END LOOP;
SYS.DBMS_SQL.CLOSE_CURSOR(CUR);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM(SQLCODE()) || ': ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
SYS.DBMS_SQL.CLOSE_CURSOR(CUR);
END;
/
full example in the below url
https://www.ibm.com/support/knowledgecenter/sk/SSEPGG_9.7.0/com.ibm.db2.luw.sql.rtn.doc/doc/r0055146.html
언급URL : https://stackoverflow.com/questions/22962114/get-data-type-of-field-in-select-statement-in-oracle
'programing' 카테고리의 다른 글
JSON.stringify에서 기능을 유지할 수 있습니까? (0) | 2023.03.12 |
---|---|
개인 방법 Jasmine을 사용한 단위 테스트 (0) | 2023.03.12 |
매개 변수 속성이 있는 스프링 데이터 JPA 쿼리 (0) | 2023.03.12 |
Mongoose에서 다른 스키마 참조 (0) | 2023.03.12 |
Word Press는 왜 아직도 adslash(), register_globals() 및 magic_quotes를 사용하고 있습니까? (0) | 2023.03.12 |