ORA-01000: maximum open cursors exceeded
ORA-01000: 최대 열기 커서 수를 초과했습니다

--sys나 system 유저로 접속하여 현재 설정된 커서 개수를 확인 한다.
show parameter open_cursors 

--현재 사용중인 섹션의 커서 (100개 초과) 확인
select a.sid, s.process, s.machine, s.module, s.action, count(*) as cnt             
from V$OPEN_CURSOR a, V$SESSION s
where s.sid = a.sid
group by a.sid, s.process, s.machine, s.module, s.action
having count(*) > 100
order by count(*) desc;

--특정 SID 기준 조회
select * from V$OPEN_CURSOR where sid = 4;

--커서 개수 재설정
alter system set open_cursors = 4000 scope=both;

 

출처 : https://jack-of-all-trades.tistory.com/398

오라클 에러 정보 (ORA-01000) - maximum open cursors exceeded.pdf
0.11MB

--//Oracle 11.2.0 for Windows 버전 기준
--//SYSDBA로 접속 ex) C:\>SQLPLUS "/as sysdba"
--//이하 SQL-Plus : SQL>

@"C:\oracle\product\11.2.0\dbhome_1\sqlplus\admin\plustrce.sql"

grant plustrace to [사용자];

--//=======================================

conn [사용자]/[패스워드];
@"C:\oracle\product\11.2.0\dbhome_1\rdbms\admin\utlxplan.sql"

--//PLAN 확인
set linesize 120;
set autot on;
select * from tab where rownum=1;

 

======================================================

 

AUTOTRACE 주요 명령어

명령 수행 결과 실행 계획 실행 통계 plustrace 권한 여부
set autotrace on O O O O
set autotrace on explain O O X X
set autotrace on statistics O X O O
set autotrace traceonly X O O O
set autotrace traceonly explain X O X X
set autotrace traceonly statistics X X O O

참조 : https://coding-factory.tistory.com/745

 문자열 값(통화, 자리수 구분)을 숫자타입으로 변경

※ 자세한 설명은 생략 (정규식은 10g 이상 가능)

 

SELECT TO_NUMBER( REGEXP_REPLACE('$-1,234,567.89', '[^0-9.-]', '') ) NUM FROM DUAL

 

오라클의 여러행을 하나의 컬럼으로 합치는 쿼리를 메모하고져 글을 남깁니다.

자세한 설명은 하지 않겠습니다.

(XMLAGG 및 정규식은 10g부터 사용 가능)

  • WM_CONCAT
SELECT
    WM_CONCAT(job) AS WM_JOBS
  FROM emp

 

  • LISTAGG
SELECT
    LISTAGG(job, ',') WITHIN GROUP(ORDER BY job) AS AGG_JOBS
FROM emp

 

  • LISTAGG (deptno 기준)
SELECT
    LISTAGG(job, ',') WITHIN GROUP(ORDER BY job) OVER(PARTITION BY deptno) AS AGG_JOBS2
FROM emp

 

  • LISTAGG (중복제거)
SELECT
    LISTAGG(job, ',') WITHIN GROUP(ORDER BY job) AS AGG_JOBS
    , REGEXP_REPLACE( LISTAGG(job, ',') WITHIN GROUP(ORDER BY job), '([^,]+)(,\1)*(,|$)', '\1\3') AS AGG_JOBS3
FROM emp

 

  • XMLAGG, XMLELEMENT (CLOB타입 - WM_CONCAT, LISTAGG : VARCHAR2라 최대 4000byte)
SELECT
    XMLAGG(XMLELEMENT(A, A.job || ',') ORDER BY A.job).EXTRACT('//text()').GETCLOBVAL() AS CLOB_JOBS
FROM emp A

 

  • XMLAGG, XMLELEMENT (CLOB타입, 중복제거, 시작/끝 구분자 삭제)
WITH A AS
(
SELECT
    XMLAGG(XMLELEMENT(A, A.job || ',') ORDER BY A.job).EXTRACT('//text()').GETCLOBVAL() AS CLOB_JOBS1
    , XMLAGG(XMLELEMENT(A, ',' || A.job ) ORDER BY A.job).EXTRACT('//text()').GETCLOBVAL() AS CLOB_JOBS2
FROM emp A
)
SELECT 
    SUBSTR(A.CLOB_JOBS1, 1, LENGTH(A.CLOB_JOBS1) - 1) AS SUB_JOBS1
    , SUBSTR(A.CLOB_JOBS2, 2) AS SUB_JOBS2
    , SUBSTR(REGEXP_REPLACE ( A.CLOB_JOBS2, '([^,]+)(,\1)*(,|$)', '\1\3'), 2) AS SUB_JOB3
FROM A

 

  • 통합 (LISTAGG -PARTITION 제외)
WITH A AS
(
SELECT
    WM_CONCAT(job) AS WM_JOBS
    , LISTAGG(job, ',') WITHIN GROUP(ORDER BY job) AS AGG_JOBS
    , REGEXP_REPLACE( LISTAGG(job, ',') WITHIN GROUP(ORDER BY job), '([^,]+)(,\1)*(,|$)', '\1\3') AS AGG_JOBS3
    , XMLAGG(XMLELEMENT(A, A.job || ',') ORDER BY A.job).EXTRACT('//text()').GETCLOBVAL() AS CLOB_JOBS1
    , XMLAGG(XMLELEMENT(A, ',' || A.job ) ORDER BY A.job).EXTRACT('//text()').GETCLOBVAL() AS CLOB_JOBS2
FROM emp A
)
SELECT
    A.*
    , SUBSTR(A.CLOB_JOBS1, 1, LENGTH(A.CLOB_JOBS1) - 1) AS SUB_JOBS1
    , SUBSTR(A.CLOB_JOBS2, 2) AS SUB_JOBS2
    , REGEXP_REPLACE( REGEXP_REPLACE ( A.CLOB_JOBS1, '([^,]+)(,\1)*(,|$)', '\1\3'), '(,)$', '') AS SUB_JOB3
    , REGEXP_REPLACE( REGEXP_REPLACE ( A.CLOB_JOBS2, '([^,]+)(,\1)*(,|$)', '\1\3'), '^(,)', '') AS SUB_JOB4
FROM A

 

※ ORA-01489 문자열 연결의 결과가 너무 깁니다.

 : 오류 발생시 XMLAGG를 이용하여 CLOB 사용.

자작이며, PHP Library중 하나인 ADOdb의 crypt.inc.php의 MD5Crypt Class를 C#으로 변경 후 Oracle용 PL/SQL에 맞게 변경하였습니다.

 

MS-SQL, SQLite는 C#을 이용하여 DLL로 제작하여 로딩하시면 사용 가능합니다.

 

패키지명은 HxCrypt라고 하였습니다.

별도로 비트연산용 PKG_UTILS( http://overoid.tistory.com/35 ) / 첨부(PKG_UTILS_Oracle.sql) 참조를 이용하였습니다.

 

자세한 내용은 첨부파일을 참고하시기 바랍니다.

 

 

(ADODB가 GNU 라이센스이므로 공유는 당연하다 판단했습니다. / C#과 Oracle용으로 마이그레이션한 라이블러리를 공개합니다.)

PHP용 소스 출처 : http://adodb.org/

 

 

- 암호화 : HxCrypt.Encrypt(문자열, 키값) //호출 할 때마다 다른 값이 리턴됨

- 복호화 : HxCrypt.Decrypt(암호 문자열, 키값)

 

암호화 문자열과 키값은 반드시 키보드에 존재하는 영문+숫자+특수키 값만을 정상적으로 사용 가능하며,

 

기타 다른 문자(특수문자, 한글, )들은 문자 인코딩 타입과 플랫폼에 따라 상이한 결과가 나오므로 주의가 필요함.

 

 

[CODE]

CREATE OR REPLACE PACKAGE HxCrypt AS
/******************************************************************************
   // 출처 : userpark.net / userpark@userpark.net
   // 배포 라이센스 : GNU
   // 원 소스 출처 : http://adodb.org/ , crypt.inc.php, MD5Crypt
   NAME:       HxCrypt
   PURPOSE:

   REVISIONS:
   Ver        Date        Author           Description
   ---------  ----------  ---------------  ------------------------------------
   1.0        2018/05/10      userpark       1. Created this package.
******************************************************************************/

  FUNCTION base64_encode(inputString VARCHAR2) RETURN VARCHAR2;
  FUNCTION base64_decode(inputString VARCHAR2) RETURN VARCHAR2;
  FUNCTION Md5(inputString VARCHAR2) RETURN VARCHAR2;
  FUNCTION keyED(inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2;
  FUNCTION Encrypt (inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2;
  FUNCTION Decrypt (inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2;
  
END HxCrypt;
/



CREATE OR REPLACE PACKAGE BODY HxCrypt AS
  outputString VARCHAR2(2000);

FUNCTION base64_encode(inputString VARCHAR2) RETURN VARCHAR2 AS
  BEGIN
    outputString := utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(inputString)));
    RETURN outputString;
    EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
  END base64_encode;
  
  FUNCTION base64_decode(inputString VARCHAR2) RETURN VARCHAR2 AS
  BEGIN
    outputString := utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw(inputString)));
    RETURN outputString;
    EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
  END base64_decode;
  
  FUNCTION Md5(inputString VARCHAR2) RETURN VARCHAR2 AS
  BEGIN
    --outputString := Md5(inputString);
    outputString := LOWER(RAWTOHEX(UTL_RAW.CAST_TO_RAW(sys.dbms_obfuscation_toolkit.md5(input_string => inputString))));
    RETURN outputString;
    EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
  END Md5;
  
  FUNCTION KeyED (inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2 IS
ctr NUMBER := 0;
i NUMBER := 0;
nInput NUMBER := 0;
nKey NUMBER := 0;
keyValue VARCHAR2(2000);
iTxt NUMBER;
iKey NUMBER;
iVal NUMBER;
BEGIN
    i := 1;
    keyValue := Md5(inputKey);
    nInput := LENGTH(inputValue);
    nKey := LENGTH(keyValue);
    ctr := 1;
    outputString := null;
    WHILE i <= nInput LOOP
        IF ctr = nKey THEN 
           ctr := 1;
        END IF;
        --utl_raw.cast_to_raw(inputString)
        iTxt := ASCII(SUBSTR(TO_CHAR(inputValue), i, 1));
        --iTxt := utl_raw.cast_to_raw(SUBSTR(TO_CHAR(inputString), i + 1, 1));
        iKey := ASCII(SUBSTR(TO_CHAR(keyValue), ctr, 1));
        --iKey := utl_raw.cast_to_raw(SUBSTR(TO_CHAR(keyValue), ctr + 1, 1));
        --iVal := iTxt ^ iKey;
        iVal := PKG_UTILS.BITXOR(iTxt,iKey);
        outputString := outputString || CHR(iVal);
        --outputString := outputString || utl_raw.cast_to_varchar2(TO_CHAR(iVal));
        ctr := ctr + 1;
        i := i + 1;
        EXIT WHEN i > nInput; 
    END LOOP;
    RETURN outputString;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END KeyED;

FUNCTION Encrypt (inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2 IS
Result VARCHAR2(2000);
ctr NUMBER := 0;
i NUMBER := 0;
n NUMBER := 0;
keyValue VARCHAR2(2000);
nKey NUMBER := 0;
iTxt NUMBER;
iKey NUMBER;
iVal NUMBER;
cKey VARCHAR2(8);
BEGIN
    i := 1;
    ctr := 1;
    keyValue := Md5(TO_CHAR(CEIL(DBMS_RANDOM.VALUE(0,32000))));
    n := LENGTH(inputValue);
    nKey := LENGTH(keyValue);
    Result := null;
    WHILE i <= n LOOP
        IF ctr = nKey THEN 
           ctr := 1;
        END IF;
        cKey := SUBSTR(TO_CHAR(keyValue), ctr, 1);
        iTxt := ASCII(SUBSTR(TO_CHAR(inputValue), i, 1));
        iKey := ASCII(cKey);
        --iVal := iTxt ^ iKey;
        iVal := PKG_UTILS.BITXOR(iTxt,iKey);
        Result := Result || cKey || CHR(iVal);
        ctr := ctr + 1;
        i := i + 1;
        EXIT WHEN i > n; 
    END LOOP;
    outputString := base64_encode(KeyED(Result, inputKey));
    RETURN outputString;
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END Encrypt;

FUNCTION Decrypt (inputValue VARCHAR2, inputKey VARCHAR2) RETURN VARCHAR2 IS
i NUMBER := 0;
n NUMBER := 0;
keyValue VARCHAR2(2000);
iTxt NUMBER;
iKey NUMBER;
iVal NUMBER;
BEGIN
    i := 1;
    keyValue := KeyED(base64_decode(inputValue), inputKey);
    n := LENGTH(keyValue);
    outputString := null;
    WHILE i <= n LOOP
        iKey := ASCII(SUBSTR(TO_CHAR(keyValue), i, 1));
        i := i + 1;
        iTxt := ASCII(SUBSTR(TO_CHAR(keyValue), i, 1));
        --iVal := iTxt ^ iKey;
        iVal := PKG_UTILS.BITXOR(iTxt,iKey);
        outputString := outputString || CHR(iVal);
        i := i + 1;
        EXIT WHEN i > n; 
    END LOOP;
    
    RETURN outputString;
   
   EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
           
END Decrypt;


END HxCrypt;
/

 

 

HxCrypt_Oracle_userpark.sql

 

PKG_UTILS_Oracle.sql

 


[PHP / Crypt / MD5Crypt]암호화, 복호화 Class (ADOdb의 crypt.inc.php

http://userpark.net/124


[C# / .NET / Crypt / HxCrypt]암호화, 복호화 Class

http://userpark.net/125


[ORACLE / PL/SQL / Crypt / HxCrypt]암호화, 복호화 PACKAGE(Class)

http://userpark.net/126

 

 


자작이며, PHP Library중 하나인 ADOdb의 crypt.inc.php의 MD5Crypt Class를 C#에 맞게 변경하였습니다.

(ASP.NET, MS-SQL, SQLite에서도 사용 가능)

 

Class명은 HxCrypt라고 하였습니다.

자세한 내용은 첨부파일을 참고하시기 바랍니다.

 

(ADODB가 GNU 라이센스이므로 공유는 당연하다 판단했습니다. / C#과 Oracle용으로 마이그레이션한 라이블러리를 공개합니다.)

PHP용 소스 출처 : http://adodb.org/

 

 

- 암호화 : HxCrypt.Encrypt(문자열, 키값) //호출 할 때마다 다른 값이 리턴됨

- 복호화 : HxCrypt.Decrypt(암호 문자열, 키값)

 

암호화 문자열과 키값은 반드시 키보드에 존재하는 영문+숫자+특수키 값만을 정상적으로 사용 가능하며,

 

기타 다른 문자(특수문자, 한글, )들은 문자 인코딩 타입과 플랫폼에 따라 상이한 결과가 나오므로 주의가 필요함.

 

 

[CODE]

public class HxCrypt
{
    /******************************************************************************************
    // 출처 : userpark.net / userpark@userpark.net
    // 배포 라이센스 : GNU
    // 원 소스 출처 : http://adodb.org/ , crypt.inc.php, MD5Crypt
    // .NET Standard 2.0 기준 제작 / System.Security.Cryptography
    *******************************************************************************************/
    
    //랜덤(난수)값
    // - PHP에서는 랜덤값 중복을 방지하기 위하여 sland를 이용하였으나
    // - C#에서는 단위 변수로 이용시 중복되지 않음
    private static Random sland = new Random(); 
    #region base64 Encode/Decode
    /// 
    /// Base64 Encode
    /// 
    /// 입력값
    /// Encoding Type
    /// Base64 Encode 문자열
    public static string base64_encode(string input, HxEncodingType encodingType = HxEncodingType.ASCII)
    {
        //byte[] inputStringAsBytes = Encoding.ASCII.GetBytes(input);
        byte[] inputStringAsBytes = GetString2Bytes(input, encodingType);
        string Result = Convert.ToBase64String(inputStringAsBytes);
        return Result;
    }

    /// 
    /// Base64 Decode
    /// 
    /// 입력값
    /// Encoding Type
    /// Base64 Decode 문자열
    public static string base64_decode(string input, HxEncodingType encodingType = HxEncodingType.ASCII)
    {
        byte[] inputStringAsBytes = Convert.FromBase64String(input);

        //string Result = Encoding.ASCII.GetString(inputStringAsBytes);
        string Result = GetBytes2String(inputStringAsBytes, encodingType);
        return Result;
    }
    #endregion

    /// 
    /// CryptAPI를 이용한 암호화, 복호화 키 생성
    /// 
    /// 입력 문자
    /// 키 문자
    /// 생성 Key 문자열
    public static string keyED(string inputValue, string keyValue)
    {
        string Result = string.Empty;
        try
        {
            keyValue = Md5(keyValue);
            int ctr = 0;
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < inputValue.Length; i++)
            {
                if (ctr == keyValue.Length)
                    ctr = 0;
                //char cTxt = Convert.ToChar(txt.Substring(i, 1));
                //char cKey = Convert.ToChar(encrypt_key.Substring(ctr, 1));
                //int iVal = Convert.ToInt32(cTxt) ^ Convert.ToInt32(cKey);
                int iTxt = Convert.ToInt32(Convert.ToChar(inputValue.Substring(i, 1)));
                int iKey = Convert.ToInt32(Convert.ToChar(keyValue.Substring(ctr, 1)));
                int iVal = iTxt ^ iKey;
                sb.Append(Convert.ToChar(iVal));
                ctr++;
            }
            Result = sb.ToString();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Result = string.Empty;
        }
        return Result;
    }

    /// 
    /// CryptAPI를 이용한 암호화
    /// 
    /// 암호화할(일반) 문자열
    /// 키 문자
    /// 암호화된 문자열
    public static string Encrypt(string inputValue, string keyValue)
    {
        string Result = string.Empty;
        try
        {
            if (!String.IsNullOrWhiteSpace(inputValue))
            {
                string encrypt_key = Md5(sland.Next(0, 32000).ToString());
                int ctr = 0;
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < inputValue.Length; i++)
                {
                    if (ctr == encrypt_key.Length)
                        ctr = 0;
                    char cKey = Convert.ToChar(encrypt_key.Substring(ctr, 1));
                    int iTxt = Convert.ToInt32(Convert.ToChar(inputValue.Substring(i, 1)));
                    int iKey = Convert.ToInt32(cKey);
                    int iVal = iTxt ^ iKey;
                    sb.Append(cKey);
                    sb.Append(Convert.ToChar(iVal));
                }
                Result = base64_encode(keyED(sb.ToString(), keyValue));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Result = string.Empty;
        }
        return Result;
    }

    /// 
    /// CryptAPI를 이용한 복호화
    /// 
    /// 암호화된 문자열
    /// 키 문자
    /// 복호화된 문자열
    public static string Decrypt(string inputValue, string keyValue = null)
    {
        string Result = string.Empty;
        try
        {
            if (!String.IsNullOrWhiteSpace(inputValue))
            {
                inputValue = keyED(base64_decode(inputValue), keyValue);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < inputValue.Length; i++)
                {
                    //char cKey = Convert.ToChar(txt.Substring(i, 1));
                    int iKey = Convert.ToInt32(Convert.ToChar(inputValue.Substring(i, 1)));
                    i++;
                    //char cTxt = Convert.ToChar(txt.Substring(i, 1));
                    int iTxt = Convert.ToInt32(Convert.ToChar(inputValue.Substring(i, 1)));
                    //int iVal = Convert.ToInt32(cTxt) ^ Convert.ToInt32(cKey);
                    int iVal = iTxt ^ iKey;
                    sb.Append(Convert.ToChar(iVal));
                }
                Result = sb.ToString();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Result = string.Empty;
        }
        return Result;
    }

    /// 
    /// 랜덤으로 요청 자리수 만큼의 문자열 생성
    /// 
    /// 요청 자리수(1 이상, 0일 경우 기본값(8))
    /// 랜덤 문자열
    public static string RandPass(uint maxLength = 8)
    {
        string Result = string.Empty;
        if (maxLength <= 0)
        {
            maxLength = 8;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < maxLength; i++)
        {
            int randnumber = sland.Next(48, 120);
            while ((randnumber >= 58 && randnumber <= 64) || (randnumber >= 91 && randnumber <= 96))
            {
                randnumber = sland.Next(48, 120);
            }
            sb.Append(Convert.ToChar(randnumber));
        }
        Result = sb.ToString();
        return Result;
    }

    /// 
    /// Byte형을 Encoding Type 문자열로 변환
    /// 
    /// 입력값
    /// Encoding Type
    /// 변환 값
    public static string GetBytes2String(byte[] input, HxEncodingType encodingType)
    {
        string Result;
        switch (encodingType)
        {
            case HxEncodingType.UTF7:
                Result = Encoding.UTF7.GetString(input);
                break;
            case HxEncodingType.UTF32:
                Result = Encoding.UTF32.GetString(input);
                break;
            case HxEncodingType.Unicode:
                Result = Encoding.Unicode.GetString(input);
                break;
            case HxEncodingType.BigEndianUnicode:
                Result = Encoding.BigEndianUnicode.GetString(input);
                break;
            case HxEncodingType.ASCII:
                Result = Encoding.ASCII.GetString(input);
                break;
            case HxEncodingType.Default:
                Result = Encoding.Default.GetString(input);
                break;
            case HxEncodingType.UTF8:
            case HxEncodingType.None:
            default:
                Result = Encoding.UTF8.GetString(input);
                break;
        }
        return Result;
    }

    public static byte[] GetString2Bytes(string input, HxEncodingType encodingType = HxEncodingType.None)
    {
        byte[] Result;
        switch (encodingType)
        {
            case HxEncodingType.UTF7:
                Result = Encoding.UTF7.GetBytes(input);
                break;
            case HxEncodingType.UTF32:
                Result = Encoding.UTF32.GetBytes(input);
                break;
            case HxEncodingType.Unicode:
                Result = Encoding.Unicode.GetBytes(input);
                break;
            case HxEncodingType.BigEndianUnicode:
                Result = Encoding.BigEndianUnicode.GetBytes(input);
                break;
            case HxEncodingType.ASCII:
                Result = Encoding.ASCII.GetBytes(input);
                break;
            case HxEncodingType.Default:
                Result = Encoding.Default.GetBytes(input);
                break;
            case HxEncodingType.UTF8:
            case HxEncodingType.None:
            default:
                Result = Encoding.UTF8.GetBytes(input);
                break;
        }
        return Result;
    }

    /// 
    /// Byte형을 문자열로 변환
    /// 
    /// 입력 값
    /// 문자 포멧
    /// 변환 값
    public static string GetBytes2String(byte[] input, string format = null)
    {
        StringBuilder sBuilder = new StringBuilder();

        // Loop through each byte of the hashed data 
        // and format each one as a hexadecimal string.
        for (int i = 0; i < input.Length; i++)
        {
            sBuilder.Append(input[i].ToString(format));
        }

        // Return the hexadecimal string.
        return sBuilder.ToString();
    }

    #region System.Security.Cryptography
    /// 
    /// MD5 
    /// 
    /// 
    /// 
    /// 
    public static string Md5(string inputValue, HxEncodingType encodingType = HxEncodingType.None)
    {
        string Result = null;
        using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create())
        {
            Result = GetMd5Hash(md5Hash, inputValue, encodingType);

        }
        //String.IsNullOrWhiteSpace
        return Result;
    }

    private static string GetMd5Hash(System.Security.Cryptography.MD5 md5Hash, string input, HxEncodingType encodingType = HxEncodingType.None)
    {

        // Convert the input string to a byte array and compute the hash.
        //byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
        //byte[] data = md5Hash.ComputeHash(Encoder.Default.GetBytes(input));
        byte[] data = md5Hash.ComputeHash(GetString2Bytes(input, encodingType));
        return GetBytes2String(data, "x2");

        //byte[] dataEA = md5Hash.ComputeHash(Encoding.ASCII.GetBytes(input));
        //byte[] dataE7 = md5Hash.ComputeHash(Encoding.UTF7.GetBytes(input)); 
        //byte[] dataE8 = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
        //byte[] dataEU = md5Hash.ComputeHash(Encoding.Unicode.GetBytes(input));
        //byte[] dataE32 = md5Hash.ComputeHash(Encoding.UTF32.GetBytes(input));
        //byte[] dataED = md5Hash.ComputeHash(Encoding.Default.GetBytes(input));

        //byte[] dataAA = md5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(input));
        //byte[] dataA7 = md5Hash.ComputeHash(ASCIIEncoding.UTF7.GetBytes(input));
        //byte[] dataA8 = md5Hash.ComputeHash(ASCIIEncoding.UTF8.GetBytes(input));
        //byte[] dataAU = md5Hash.ComputeHash(ASCIIEncoding.Unicode.GetBytes(input));
        //byte[] dataA32 = md5Hash.ComputeHash(ASCIIEncoding.UTF32.GetBytes(input));
        //byte[] dataAD = md5Hash.ComputeHash(ASCIIEncoding.Default.GetBytes(input));

        // Create a new Stringbuilder to collect the bytes
        // and create a string.
        /*
        StringBuilder sBuilder = new StringBuilder();

        // Loop through each byte of the hashed data 
        // and format each one as a hexadecimal string.
        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }

        // Return the hexadecimal string.
        return sBuilder.ToString();
        */

    }

    // Verify a hash against a string.
    private static bool VerifyMd5Hash(System.Security.Cryptography.MD5 md5Hash, string input, string hash, HxEncodingType encodingType = HxEncodingType.None)
    {
        // Hash the input.
        string hashOfInput = GetMd5Hash(md5Hash, input, encodingType);

        // Create a StringComparer an compare the hashes.
        StringComparer comparer = StringComparer.OrdinalIgnoreCase;

        if (0 == comparer.Compare(hashOfInput, hash))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public static string Sha1(string inputValue, HxEncodingType encodingType = HxEncodingType.None)
    {
        string Result = null;
        using (System.Security.Cryptography.SHA1 sha = new System.Security.Cryptography.SHA1CryptoServiceProvider())
        {
            byte[] data = sha.ComputeHash(GetString2Bytes(inputValue, encodingType));
            Result = GetBytes2String(data);
        }
        return Result;
    }

    #endregion
}

public enum HxEncodingType
{
    None = 0,
    Default,
    ASCII,
    UTF7,
    UTF8,
    UTF32,
    Unicode,
    BigEndianUnicode
}

 

 

HxCrypt_Userpark.cs

 


[PHP / Crypt / MD5Crypt]암호화, 복호화 Class (ADOdb의 crypt.inc.php

http://userpark.net/124


[C# / .NET / Crypt / HxCrypt]암호화, 복호화 Class

http://userpark.net/125


[ORACLE / PL/SQL / Crypt / HxCrypt]암호화, 복호화 PACKAGE(Class)

http://userpark.net/126

 

해당 실행 파일에 본 첨부파일을 풀어 주면 클라이언트 없이도 배포 가능합니다.

별도로  TNS_ADMIN 경로를 환경설정에서 해줘도 되나, 10g Client 버전부터는 TNS를 이용안하고 설정 가능합니다.

실행파일과 같은 경로에 배포하시면 쉽게 사용 가능합니다.

DataGridView를 이용하였습니다.

OracleConnection oraConn = new OracleConnection();
oraConn.ConnectionString = string.Format("USER ID={0};PASSWORD={1};DATA SOURCE={2};PERSIST SECURITY INFO=false", "{오라클UserID}", "{오라클UserPassword}", "{Oracle Host Name(Domain) or Oracle Host IP}:{Oracle Service Port}/{Oracle Service Name(SID)");
//기본포트 1521를 쓸경우 ":{Oracle Service Port}" 생략 가능
oraConn.Open();
string SQL = "SELECT * FROM TAB";
OracleCommand oraCmd = new OracleCommand(SQL, oraConn);
OracleDataAdapter oraAdapter = new OracleDataAdapter(oraCmd);
DataTable dt = new DataTable();
oraAdapter.Fill(dt);
dataGridView1.DataSource = dt;

ODP.NET 버전은 11.2.0.3.0 32bit 버전을 이용하였습니다.

Oracle.DataAccess.dll 파일 버전은 2.112.3.0 입니다.

 .NET 2.0 기준 DLL파일입니다.

.NET 4.0으로 프로젝트 세팅을 하셔도 참조시 Oracle.DataAccess.dll버전을 2.x대를 추가하면 .NET 4.0에서도 사용 가능합니다.

(최대 파일당 10M라서 분할하여 올립니다.)

================================================================================================================

ODP.NET(v2).zip

 

ODP.NET(v2).z01

 

ODP.NET(v2).z02

 

ODP.NET(v2).z03

 

ODP.NET(v2).z04

 

 

추가로 Oracle.DataAccess.dll 4.112.3.0 버전도 올립니다.

 

Oracle.DataAccess(v4).zip

출처 : http://blog.naver.com/lcg2004?Redirect=Log&logNo=60049785458

참고 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=117409&ref=117385

Writing to Oracle CLOB fields
using System.Data.OracleClient

만약 당신이 .NET 코더고 오라클을 갖다가 데이터베이스 작업을 한다면, 이번이 적절하게 사용할 수 있는 기회가 될 것이다.^^ 읽으면서 커멘트도 달아주기 바란다!

우리 현재 프로젝트에서 우리는 ASP.NET 1.1 애플리케이션으로부터 상당한 량의 텍스트를 오라클 CLOB 필드로 쓸 필요가 있다. 우리는 이제껏 표준 MS System.Data.OracleClient 라이브러리를 (더 작은 량의 데이터를 쓰기위해) 사용해왔고, 그것은 우리에게 아주 유용했다. 나는 오라클 ODP.NET과 같은 더 최신버전의 우수한 팩이 있더라도 다른 라이브러리 팩을 소개하고 싶지 않았다.

예전의 자바 프로젝트에서 나는 CLOB를 쓰고 읽는 작업을 해왔고, 또한 나는 당신이 일반 VARCHAR과 같은 필드를 핸들해야 했다는 것을 안다.

따라서 나는 자리잡고 앉아서 .NET 동적Help과 가능하다면 가능한 모든 인터넷을 뒤지기 시작했고, 그 결과 흥미로운 것이 있었고, 나는 세가지 각각 다른 방법을 발견했다. 두가지는 정말로 단순하고 하나는 그리 단순하지 않다. 희안한 것은 내가 두 옵션은 제대로 작동할 것이라고 생각하지 않고-그러나 내가 테스트 했을 때 제대로 작동했다.
나는 3가지 방법을 여기서 공개할 것이다. 그리고 바라건데 .NET과 Oracle로 지가 머하는가를 아는 누군가는 나를 불꽃으로 격추시킬 수 있길 바란다.(청출어람하길 바란다..)

이것을 테스트 하기위해, 나는 오라클에다가 단순한 테이블을 생성하고, 그 테이블은 2개의 필드로 구성되어있다; ID(INT)와 TEXT(CLOB). 바로 그거다. 나는 노트패드로 생성된 단순 텍스트 파일을 읽을 것이며, 그것은 499KB다.

주: 이것은 테스트코드일 뿐, 당신이 실무에서 하고 싶은 것과는 별개이다. 만약 이코드를 사용하고 싶다면, 적절한 에러나 예외, 핸들링 등을 추가하라.

그래서, OracleDataAdapter를 이용하는 첫번째 방법은 안돌아 갈 것이다.(내가 클래스 라이브러리 문서들을 이해한 기준에서는..). 그러나, 맞긴맞다.

public void writeDataWithDA()

{

           FileInfo fi = new FileInfo("c:/temp/testfile.txt");

           StreamReader sr = new StreamReader(fi.FullName);

           String clob = sr.ReadToEnd();

           sr.Close();

 

           OracleDataAdapter da = new OracleDataAdapter(

               "SELECT ID, TEXT FROM CLOBTEST", ConnectionString);

           DataTable dt = new DataTable();

           // get the schema

           da.FillSchema(dt, SchemaType.Source);

 

           OracleCommandBuilder cb = new OracleCommandBuilder(da);

 

           int id = 2;

 

           // create a row containing the data

           DataRow row = dt.NewRow();

           row["ID"] = id;

           row["TEXT"] = clob;

           dt.Rows.Add(row);

 

           // update the table

           da.Update(dt);

}

두번째 방법은 OracleCommand 를 이용하는 것이며, 이것도 안돌아간다(내 생각엔). 근데 원래는 되는 방법이다.

public void writeDataWithCommand()

{

           FileInfo fi = new FileInfo("c:/temp/testfile.txt");

           StreamReader sr = new StreamReader(fi.FullName);

           String tempBuff = sr.ReadToEnd();

           sr.Close();

           

           using(OracleConnection conn = new OracleConnection(ConnectionString))

           {

                      conn.Open();

                      Console.WriteLine("Connected...") ;

                      String strSQL = 

                          "INSERT INTO CLOBTEST (ID,TEXT) VALUES (1,:TEXT_DATA) ";

 

                      OracleParameter parmData = new OracleParameter();

                      parmData.Direction = ParameterDirection.Input;

                      parmData.OracleType = OracleType.Clob;

                      parmData.ParameterName = "TEXT_DATA";

                      parmData.Value = tempBuff;

 

                      OracleCommand cm = new OracleCommand();

                      cm.Connection = conn;

                      cm.Parameters.Add(parmData);

                      cm.CommandText = strSQL;

                      cm.ExecuteNonQuery();

 

                      conn.Close();

           }

 

           Console.WriteLine("Done!") ;

}

이제 세번째 방법이다. 이것은 .NET 클래스 라이브러리 문서가 기술한 C/BLOB 핸들링 방법이며, 임시 LOB 객체를 오라클에 생성한 다음, insert작업을 하기전에, 그 객체를 쓰므로써 핸들링하는 방법이다. 이것은 역시나 잘돌아간다, 근데 이 방법은 트랜젝션과 다른 부분간에 약간 더 많은 혼란을 겪어야 한다.

public void writeWithTempBlob()

{

           FileInfo fi = new FileInfo("c:/temp/testfile.txt");

           StreamReader sr = new StreamReader(fi.FullName);

           String tempBuff = sr.ReadToEnd();

           sr.Close();

 

           using(OracleConnection conn = new OracleConnection(ConnectionString))

           {

                      conn.Open();

                      Console.WriteLine("Connected...") ;

                      OracleTransaction tx = conn.BeginTransaction();

 

                      OracleCommand tempcmd = conn.CreateCommand();

                      tempcmd.Transaction = tx;

                      tempcmd.CommandText = "declare xx clob; begin dbms_lob.createtemporary(xx, false, 0); :tempclob := xx; end;";

                      tempcmd.Parameters.Add(new OracleParameter("tempclob",

                                 OracleType.Clob)).Direction = ParameterDirection.Output;

                      tempcmd.ExecuteNonQuery();

 

                      //get the temp lob object

                      OracleLob tempLob = (OracleLob)tempcmd.Parameters[0].Value;

 

                      //transform into byte array

                      System.Text.Encoding enc = Encoding.Unicode;

                     //MUST be unicode encoded!

 

                      Byte[] b = enc.GetBytes(tempBuff);

 

                      tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);

                      tempLob.Write(b,0,b.Length);

                      tempLob.EndBatch();

 

                      OracleCommand cmd = conn.CreateCommand();

                      cmd.Transaction = tx;

                      cmd.CommandText = 

                          "INSERT INTO CLOBTEST (ID, TEXT) VALUES (:ID, :TEXT)";

                      cmd.Parameters.Add("ID", 3);

                      cmd.Parameters.Add("TEXT", OracleType.Clob).Value = tempLob;

                      //insert the temp lob

 

                      cmd.ExecuteNonQuery();

 

                      tx.Commit(); 

           }

           Console.WriteLine("Done!") ;

}

임시 CLOB에 write할려면 텍스트는 유니코드여야 한다. 안그러면 당신은 완전 많은 문자들이 쓰여진 것을 경험하게 될 것이니 주의하라.^^

다른 참고자료

출처 : http://www.oracleclub.com/article/55741

설명은 안 하겠습니다.

 

WITH t AS
( 
SELECT XMLTYPE('
<ROOT>
<META use="report">
<META-NAME>Type1</META-NAME>
<META-VALUE>REQ1</META-VALUE>
</META>
<META use="report">
<META-NAME>Type2</META-NAME> 
<META-VALUE>REQ3</META-VALUE> 
</META>
<META use="report">
<META-NAME>Type3</META-NAME>
<META-VALUE>REQ4</META-VALUE>
</META>
</ROOT>
') v 
FROM dual 
) 
SELECT ExtractValue(Value(p), '/META/META-VALUE') "META-VALUE"
  FROM t 
     , TABLE(XMLSequence(Extract(v, '/ROOT/META[@use="report"]'))) p 
 WHERE ExtractValue(Value(p), '/META/META-NAME') = 'Type1'
; 
 

  http://www.oracle.com/technology/documentation/spatial.html

영어지만 필요하신 분에게는 유용할 것 같습니다. 

이 글은 스프링노트에서 작성되었습니다.

'GIS' 카테고리의 다른 글

MS-SQL 2008 Spatial Option 지원 업체 리스트  (1) 2009.03.02

Oracle Mapinfo_Mapcatalog 생성

02.03 강좌를 참고하여 User 및 Role권한을 부여하시기 바랍니다.

MapInfo Professional v9.5버전에서는 Tools에 Mapcatalog 생성/관리이 지원 되오니 참고하시기 바랍니다.

본 강좌는 SQLPLUS를 이용하여 Mapcatalog 생성을 SQL Query로 생성하는 법에 대하여 알려드리겠습니다.

 

 ※ DBA권한을 가진 사용자나 MAPINFO User를 이용한 테이블 생성 및 권한 부여

 

  • 테이블 생성
  1. -- 테이블 생성

    CREATE TABLE MAPINFO.MAPINFO_MAPCATALOG
    (
      SPATIALTYPE       FLOAT(126),
      TABLENAME         CHAR(32 BYTE),
      OWNERNAME         CHAR(32 BYTE),
      SPATIALCOLUMN     CHAR(32 BYTE),
      DB_X_LL           FLOAT(126),
      DB_Y_LL           FLOAT(126),
      DB_X_UR           FLOAT(126),
      DB_Y_UR           FLOAT(126),
      COORDINATESYSTEM  CHAR(254 BYTE),
      SYMBOL            CHAR(254 BYTE),
      XCOLUMNNAME       CHAR(32 BYTE),
      YCOLUMNNAME       CHAR(32 BYTE),
      RENDITIONTYPE     INTEGER,
      RENDITIONCOLUMN   CHAR(32 BYTE),
      RENDITIONTABLE    CHAR(32 BYTE),
      NUMBER_ROWS       INTEGER
    );

 

  • 인덱스 생성
  1.  -- 인덱스 생성
    CREATE UNIQUE INDEX MAPINFO.MAPCATALOG_IDX ON MAPINFO.MAPINFO_MAPCATALOG (TABLENAME, OWNERNAME);

 

  • Role 권한 부여(모두 접근 가능하도록)
  1.  -- Role 권한 부여
  2. GRANT DELETE, INSERT, SELECT, UPDATE ON MAPINFO.MAPINFO_MAPCATALOG TO PUBLIC;

 

 Oracle_MI_Role_02.gif

 

이 글은 스프링노트에서 작성되었습니다.

'GIS > MapInfo 강좌' 카테고리의 다른 글

02.03 Oracle User/Role 생성  (0) 2009.02.26
02.02 Oracle Database 설치  (0) 2009.02.26
02.01 Mapinfo Professional 설치  (0) 2009.02.26
01. 시스템 개요  (0) 2009.02.26
MapInfo 강좌  (0) 2009.02.26

Oracle User/Role 생성

 SQLPlus를 이용하겠습니다.(기타 다른 툴들을 이용하여도 무방합니다.)

자세한 옵션 및 설명은 다른 사이트 메뉴얼을 참고하시기 바랍니다.

 

  1. SQLPLUS 접속(DBA 권한을 가진 계정으로)
    SQLPLUS {사용자ID}/{사용자 PASSWORD}@{TNSNAME or SID}
    or
    SQLPLUS {사용자ID}@{TNSNAME or SID}
  2. Tablespace(테이블스페이스) 생성
  3. MAPINFO User 생성(MAPINFO_MAPCATALOG를 만들어 사용하기 위한 사용자)
    ※ 다른 유저로 만들어 본적은 없다. 다른 유저로 만들었을시 오류가 있을련지 모르겠다
        심심하면 한번 만들어서 테스트하고 결과를 알려주기 바란다...(나도 궁금 하긴하다)
        그게 귀찮으면 그냥 본 필자처럼 MAPINFO란 유저로 만들길 바란다.
  4. MAPINFO User 권한(Role) 부여
  5. MAPUSER(가칭) User생성(실제 MAPINFO를 이용할 실 사용자)
  6. MAPUSER(가칭) User 권한(Role) 부여

Oracle_MI_Role_01.gif 

이 글은 스프링노트에서 작성되었습니다.

'GIS > MapInfo 강좌' 카테고리의 다른 글

02.04 Oracle Mapinfo_Mapcatalog 생성  (0) 2009.02.26
02.02 Oracle Database 설치  (0) 2009.02.26
02.01 Mapinfo Professional 설치  (0) 2009.02.26
01. 시스템 개요  (0) 2009.02.26
MapInfo 강좌  (0) 2009.02.26

 Oracle Database 설치

 Oracle Database 설치는 생략하고 MapInfo용 SID생성부터 시작하겠습니다.

본 강좌는 Oracle Database 9i Enterprise로 하겠습니다.(10g/11g Standard는 Loactor를 이용하므로 번외로 취급하겠습니다)

 

Database Configuration Assistant 실행

 기존에 다른 SID가 존재하여도 상관없으며(단지, 라이센스 제약은 있을 수 있습니다.) 기본값으로 설치했을 경우에도 이 과정을 무시해도 되나 한번 읽어보시기 바랍니다 중간에 아주 중요한 내용 나옵니다.(물론, Oracle Spatial 사용에 관한 부분입니다.)

 

  1. [시작]-[실행]을 실행하여 열기 명령에 dbca를 입력한다.
    Oralce_MI_MakeSID_01.GIF
  2. 시작 안내창이 나오는데 [다음] 과정으로 진행
    Oralce_MI_MakeSID_02.GIF
  3. 단계 1/8 : 작업창에서 "데이터베이스 생성"을 선택한 후 [다음] 과정으로 진행
    Oralce_MI_MakeSID_03.GIF
  4.  단계 2/8 : 데이터베이스 템프리트창에서 기본은 "Data Warehouse"일 것이다 기본을 선택해도 상관없으나, 본인은 "New Database"를 선택하고 [다음] 과정으로 진행
    Oralce_MI_MakeSID_04.GIF
  5. 단계 3/8 : 데이터베이스 ID창에서 본인은 "USERPARK"라고 입력후 [다음] 과정으로 진행
    Oralce_MI_MakeSID_05.GIF
  6. 단계 4/8 : 데이터베이스 기능창에서 현재 아래 보이는 화면은 기본값으로 모두 체크 되어져 있으나 필요에 따라서는 기능을 Off해도 상관은 없으나 반드시 Oracle Spatial 체크 되어져 있어야 한다.필수...(지금까지 이 걸 설명하기 위해서 설치과정을 설명한거라 봐도 되겠다, 9i Standard에서는 Oracle Spatial 기능이 없다)
    Oralce_MI_MakeSID_06.GIF
  7. 단계 5/8 : 데이터베이스 접속 옵션창에서 기본인 "전용 서버 모드"를 선택하고 그냥 [다음]과정으로 진행
    Oralce_MI_MakeSID_07.GIF
  8. 단계 6/8 : 초기화 매개변수 창에서 설치자에 맞는 옵션을 선택하면 될것이다. 전문가가 아니라면 그냥 넘어가도 될것이다,
    그러나 문자집합은 꼭 맞는 문자집합을 선택 해야 할 것이다.(KO16MSWIN949나 AL32UTF8 두개를 일반적으로 쓰지 않을까 생각은 든다)
    일단 "기본값 사용"을 체크하고 [다음]과정을 진행
    Oralce_MI_MakeSID_08.GIF

    Oralce_MI_MakeSID_08_02.GIF
  9. 단계 7/8 : 데이터베이스 저장 영역창에서 설정 상황 확인 또는 변경후 [다음]과정을 진행
    Oralce_MI_MakeSID_09.GIF
  10. 단계 8/8 : 생성 옵션 창에서 필요한 옵션 선택후 [완료]를 눌러 설정 작업을 완료한다.
    Oralce_MI_MakeSID_10.GIF
  11. 요약 창에서 필요할경우 [HTML 파일로 저장]을 눌러 파일로 저장해둔다(나중에 간혹 설치 사항 조회 할 때 유용할 때가 있다) [확인]을 누른다.
    Oralce_MI_MakeSID_11.GIF
  12. Database Configuration Assistant 창이 실제 데이타베이스 생성 진행상황을 보여준다 완료 될 때까지 기달린다.
    (이 창 이전에 10번 항목에서 "데이터베이스 생성 스크립트 생성" 옵션을 선택했을 경우 생성완료 창이 뜬다)
    Oralce_MI_MakeSID_12.GIF
  13. 생성이 완료 되면 암호입력창이 뜬다. 적당한 암호를 입력후 [종료]를 눌러 모든 설치 작업을 종료한다.
    Oralce_MI_MakeSID_13.GIF 

※ 기타 리스너 및 TNS생성이 안되어져 있을 경우 다른 사이트 메뉴얼을 참고하기 바랍니다. 

 

이 글은 스프링노트에서 작성되었습니다.

'GIS > MapInfo 강좌' 카테고리의 다른 글

02.04 Oracle Mapinfo_Mapcatalog 생성  (0) 2009.02.26
02.03 Oracle User/Role 생성  (0) 2009.02.26
02.01 Mapinfo Professional 설치  (0) 2009.02.26
01. 시스템 개요  (0) 2009.02.26
MapInfo 강좌  (0) 2009.02.26


ORA-01991 에러 발생시#


발생조건#

 OraData\{SID}폴더만 복사해서 복구할경우


장애내용#

Startup 시 ORA-01991: invalid password file '...PWD{SID}.ora' 이러면서 해당 파일 경로가 나타남.

해결 방법#

>orapwd file={경로}\PWD{SID}.ora password={패스워드}


기타 참고사항#

관리자 모드 접근 방법#

ORACLE_SID 지정#

Windows

>SET ORACLE_SID={SID}

or

UNIX

>export ORACLE_SID={SID}

관리자 모드#

>SQLPLUS "/as sysdba"
or
-----------------------------------------------
>SQLPLUS /nolog
SQL>conn sys/{패스워드} as sysdba
----------------------------------------------
or
-----------------------------------------------
>SQLPLUS /nolog
SQL>conn as sysdba
사용자명 입력 : sys/{패스워드}


이 글은 스프링노트에서 작성되었습니다.

'DBMS > Oracle' 카테고리의 다른 글

ODP.NET 설치 안하고 클라이언트 배포  (0) 2012.07.13
Oracle XML 쿼리  (0) 2012.06.11
정렬 조건 부여  (0) 2008.07.16
오라클 접속 포트 고정시키기  (0) 2008.07.16
로그마이너  (0) 2008.07.16

MAPINFO를 사용하시는 분들이라면 뭘 의미하는지 잘 아시리라 판단되어집니다.

 

 CREATE TABLE MAPINFO.MAPINFO_MAPCATALOG
(
  SPATIALTYPE       FLOAT(126),
  TABLENAME         CHAR(32 BYTE),
  OWNERNAME         CHAR(32 BYTE),
  SPATIALCOLUMN     CHAR(32 BYTE),
  DB_X_LL           FLOAT(126),
  DB_Y_LL           FLOAT(126),
  DB_X_UR           FLOAT(126),
  DB_Y_UR           FLOAT(126),
  COORDINATESYSTEM  CHAR(254 BYTE),
  SYMBOL            CHAR(254 BYTE),
  XCOLUMNNAME       CHAR(32 BYTE),
  YCOLUMNNAME       CHAR(32 BYTE),
  RENDITIONTYPE     INTEGER,
  RENDITIONCOLUMN   CHAR(32 BYTE),
  RENDITIONTABLE    CHAR(32 BYTE),
  NUMBER_ROWS       INTEGER
)
;

 


CREATE UNIQUE INDEX MAPINFO.MAPCATALOG_IDX ON MAPINFO.MAPINFO_MAPCATALOG
(TABLENAME, OWNERNAME)
;

 

 

GRANT DELETE, INSERT, SELECT, UPDATE ON  MAPINFO.MAPINFO_MAPCATALOG TO PUBLIC;

 

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts