programing

ORACLE의 select 문에서 데이터 유형 필드 가져오기

closeapi 2023. 3. 12. 10:49
반응형

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

반응형