2016. 11. 9. 23:18

윈도우 에서 삽질하다 포기하고 리눅스로 넘어왔다.


첨부터 리눅스로 할껄...;;


필요한 프로그램 설치

apt install gcc-avr avr-libc avrdude 


다른 곳에서는 binutils 와 uisp 까지 설치 하라고 되있는 곳도 있던데...

일단 테스트 결과 네모 안에 있는 3개만 설치해도 빌드 및 프로그램이 가능함을 확인 하였다.

avr-gcc, avrdude 만 있음 되는 거 같다... 일단은 -_-


음영으로 표시된 부분이 명령창에서 입력하는 부분이다.



1. 소스 작성 (cpp)

2. Makefile 작성

3. 컴파일 -> hex 파일 생성

4. 프로그램 -> hex 파일 을 ATMega328p 에 전송 (USBASP 2.0 사용)

5. 퓨즈비트 세팅 -> 내장클릭 1Mhz 를 사용하지 않고 외부의 16 MHz 크리스탈을 사용하여 동작하도록 설정



잊어먹기 전에 정리.... -_-;;


안되서 맨날 시방시방 하다가 되니까... 이 기분을 어찌 표현해야 할지... ㅎㅎㅎ


펌웨어 버젼 어쩌고 경고 뜨는데, 현재로서는 모르겠다능 -_-;;

펍업 하다 USBASP 해먹으면... 진행을 못하니까... 열댓개 사서 시도를 해보던가 해야겠다.



ledblink.cpp

#define F_CPU 16000000UL

#include <avr/io.h>

#include <util/delay.h>

int main(void)

{

DDRB |= (1<<DDB5); //Set the 6th bit on PORTB (i.e. PB5) to 1 => output

while(1)

{

PORTB |= (1<<PORTB5);    //Turn 6th bit on PORTB (i.e. PB5) to 1 => on

_delay_ms(1000);        //Delay for 1000ms => 1 sec

PORTB &= ~(1<<PORTB5);    //Turn 6th bit on PORTB (i.e. PB5) to 0 => off

_delay_ms(1000);        //Delay for 1000ms => 1 sec

}



Makefile

ledblink.o: dummy

avr-gcc -mmcu=atmega328p -Os ledblink.cpp -o ledblink.o


ledblink: ledblink.o

avr-objcopy -j .text -j .data -O ihex ledblink.o ledblink.hex


dummy: 



compile

$ make ledblink

avr-gcc -mmcu=atmega328p -Os ledblink.cpp -o ledblink.o

avr-objcopy -j .text -j .data -O ihex ledblink.o ledblink.hex 



program

$ avrdude -c usbasp -p m328p -e -U flash:w:ledblink.hex


avrdude: warning: cannot set sck period. please check for usbasp firmware update.

avrdude: AVR device initialized and ready to accept instructions


Reading | ################################################## | 100% 0.00s


avrdude: Device signature = 0x1e950f (probably m328p)

avrdude: erasing chip

avrdude: warning: cannot set sck period. please check for usbasp firmware update.

avrdude: reading input file "ledblink.hex"

avrdude: input file ledblink.hex auto detected as Intel Hex

avrdude: writing flash (176 bytes):


Writing | ################################################## | 100% 0.15s


avrdude: 176 bytes of flash written

avrdude: verifying flash memory against ledblink.hex:

avrdude: load data flash data from input file ledblink.hex:

avrdude: input file ledblink.hex auto detected as Intel Hex

avrdude: input file ledblink.hex contains 176 bytes

avrdude: reading on-chip flash data:


Reading | ################################################## | 100% 0.13s


avrdude: verifying ...

avrdude: 176 bytes of flash verified


avrdude: safemode: Fuses OK (E:FF, H:DE, L:FF)


avrdude done.  Thank you. 



fuse-bit setting

$ avrdude -c usbasp -p m328p -C /etc/avrdude.conf -U lfuse:w:0xFF:m -U hfuse:w:0xDE:m -U efuse:w:0x05:m


avrdude: warning: cannot set sck period. please check for usbasp firmware update.

avrdude: AVR device initialized and ready to accept instructions


Reading | ################################################## | 100% 0.00s


avrdude: Device signature = 0x1e950f (probably m328p)

avrdude: reading input file "0xFF"

avrdude: writing lfuse (1 bytes):


Writing | ################################################## | 100% 0.00s


avrdude: 1 bytes of lfuse written

avrdude: verifying lfuse memory against 0xFF:

avrdude: load data lfuse data from input file 0xFF:

avrdude: input file 0xFF contains 1 bytes

avrdude: reading on-chip lfuse data:


Reading | ################################################## | 100% 0.00s


avrdude: verifying ...

avrdude: 1 bytes of lfuse verified

avrdude: reading input file "0xDE"

avrdude: writing hfuse (1 bytes):


Writing |                                                    | 0% 0.00s ***failed;  

Writing | ################################################## | 100% 0.03s


avrdude: 1 bytes of hfuse written

avrdude: verifying hfuse memory against 0xDE:

avrdude: load data hfuse data from input file 0xDE:

avrdude: input file 0xDE contains 1 bytes

avrdude: reading on-chip hfuse data:


Reading | ################################################## | 100% 0.00s


avrdude: verifying ...

avrdude: verification error, first mismatch at byte 0x0000

         0xd9 != 0xde

avrdude: verification error; content mismatch


avrdude: safemode: hfuse changed! Was de, and is now d9

Would you like this fuse to be changed back? [y/n] y

avrdude: safemode: and is now rescued

avrdude: safemode: Fuses OK (E:FF, H:DE, L:FF)


avrdude done.  Thank you. 








Posted by 해비
2016. 10. 30. 23:40

ATMega328P 를 브레드보드에 직접 구성하여 동작시켜 보았다.


인터넷 찾아가며 구성해서 일단 동작은 되긴 되는데...

1초에 한번씩 깜빡거리도록 작성된 코드인데 엄청 느리게 깜빡인다.


외부 클럭 설정문제 또는 크리스탈 불량으로 의심된다.



브레드 보드를 제외한 모든 부품은 알리에서 구매한 것들이다.


USBASP 드라이버는 구글 검색으로 쉽게 찾을 수 있다.


USBASP 핀 구조



카즈마? AVR 프로그래머는 오류... 메시지가 뜨는데.. 걍 무시하고 진행하면 OK 메시지 나온다.


아트멜 스튜디오 에서 컴파일 하고, hex 파일을 카즈마? AVR 프로그래머로 AVR에 집어 넣었다.



사용한 툴

Atmel Studio 7.0

http://www.atmel.com/Microsite/atmel-studio/


Khazama AVR Programmer

http://khazama.com/project/programmer/



소스코드 (인터넷에서 검색한 샘플 소스코드)

#define F_CPU 16000000UL

#include <avr/io.h>

#include <util/delay.h>

int main(void)

{

DDRB |= (1<<DDB5); //Set the 6th bit on PORTB (i.e. PB5) to 1 => output

while(1)

{

PORTB |= (1<<PORTB5);    //Turn 6th bit on PORTB (i.e. PB5) to 1 => on

_delay_ms(1000);        //Delay for 1000ms => 1 sec

PORTB &= ~(1<<PORTB5);    //Turn 6th bit on PORTB (i.e. PB5) to 0 => off

_delay_ms(1000);        //Delay for 1000ms => 1 sec

}



hex 파일

blinkled.zip




결과



정면 샷





Posted by 해비
2016. 10. 19. 07:07

.Net 3.5 이상부터 지원되는 Func<T, T Result> 를 사용하면 함수를 인자로 넘길 수 있습니다.


무슨 말인고 하니 함수를 콜 하였는데 그 함수 내부에서 다른 쪽의 함수를 실행해야 하는 경우가 있습니다.


이해를 돕기 위해 예문을 추가합니다.


using System;

namespace test1019
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassA ca = new ClassA();

            ca.AA(BB); // 함수 BB 를 AA의 인자로 넘깁니다

            Console.WriteLine("Press any key to continue.");
            Console.ReadKey();
        }

        public static bool BB()
        {
            // do something...
            Console.WriteLine("BB");

            return true; // T Result 때문에 임의의 리턴값을 설정. 특별한 의미는 없다.
        }

        class ClassA
        {
            public void AA(Func<bool> func)
            {
                // do something
                Console.WriteLine("AA");

                func(); // AA 수행 중 클래스 바깥에 있는 BB()를 실행
            }
        }

    }

}

리턴타입이 void 형인 함수는 넘길수 없다는 것에 유의해 주세요.

Func<T, T Result> 가 인자 T는 생략이 가능하지만 T Result 인자는 생략이 안됩니다.




MSDN 링크 입니다.

https://msdn.microsoft.com/ko-kr/library/bb549151(v=vs.110).aspx



Posted by 해비
2016. 9. 25. 17:25

프린터로 내용 출력하는 방법에 대해 다룹니다.


예시는 visualstudio 2015 Community edition 을 사용 합니다.

설치 시 SQL Server Data Tools 항목이 체크되어 있어야 합니다. 컨트롤이 보이지 않으면 프로그램 추가/제거 에서 변경을 누른다음 체크 하여 추가하도록 합니다.



도구상자 에서 ReportViewer 컨트롤을 폼에 추가 합니다.



새 항목 추가 - 데이터 집합 추가



데이터 집합 -> 추가 - DataTable



테이블 생성

테이블 명을 지정하고, Ctrl+L 을 눌러 컬럼을 하나씩 추가합니다. (Ctrl+L 누를때마다 컬럼이 하나씩 늘어납니다)



레포트 생성

새 항목 추가 - 보고서



보고서에 테이블 추가

이름은 적당히 알아서 지정하고, 데이터 원본과 데이터 집합은 위에서 생성한 데이터 집합의 내용을 선택합니다.



데이터 집합으로 부터 하나씩 끌어다 각 컬럼에 올립니다.

제목 출력을 위한 매개변수도 하나 추가, 배치 합니다.



작업한 보고서를 컨트롤에 연결

Report Viewer 선택 - 우상단 작은 삼각형 클릭 - 팝업에서 보고서 선택



소스코드

데이터 테이블 넘길때 이름을 위에서 지정한 데이터 집합에 설정한 이름으로 넘깁니다.

제목 파라메터 역시 레포트에서 생성한 파라메터 명칭으로 넘깁니다.

            DataTable dt = new DataTable();
            dt.Columns.Add("Name");
            dt.Columns.Add("Tel");
            dt.Columns.Add("Addr");

            dt.Rows.Add(new object[] { "AAA1", "BBB1", "CCC1" });
            dt.Rows.Add(new object[] { "AAA2", "BBB2", "CCC2" });
            dt.Rows.Add(new object[] { "AAA3", "BBB3", "CCC3" });

            for (int i = 10; i < 100; i++)
            {
                dt.Rows.Add(new object[] {
                    string.Format("AAA{0}", i.ToString())
                    , string.Format("BBB{0}", i.ToString())
                    , string.Format("CCC{0}", i.ToString()) });
            }

            ReportParameter[] rp = new ReportParameter[1];
            rp[0] = new ReportParameter("title", "샘플 보고서 제목");

            reportViewer1.PageCountMode = PageCountMode.Actual;

            ReportDataSource rDS = new ReportDataSource("reportdata", dt);
            this.reportViewer1.LocalReport.DataSources.Clear();
            this.reportViewer1.LocalReport.DataSources.Add(rDS);
            this.reportViewer1.LocalReport.SetParameters(rp);
            this.reportViewer1.LocalReport.Refresh();

            this.reportViewer1.RefreshReport();


빌드 및 실행




테이블이 2페이로 넘어가는 경우, 제목이 보여지지 않습니다.

페이지 마다 테이블 제목을 출력하도록 수정 하도록 하겠습니다.


레포트를 열고 테이블을 선택 합니다.

하단의 고급모드를 선택합니다.



행 그룹 항목의 정적을 클릭 -> 우측 속성에서 RepeatOnNewPage 값을 True 로 설정 합니다.



다시 빌드, 실행 하고 페이지를 넘겨보면 제목이 출력됨을 확인 할 수 있습니다.




본 레포트를 적용하여 개발한 프로그램 소스코드 입니다.

https://github.com/haebi/APTManager






Posted by 해비
2016. 5. 24. 01:03

최근에 libzdb 를 사용하는 프로젝트를 진행하면서 언젠가 써먹을 데가 또 생길 것 같아 정리 한다.


DB는 oracle 지원에 관한 내용을 추가한다.


기본적으로 libzdb 컴파일 하는데 필요한 명령어는 단 3줄이면 끝난다.


[설치]

 # ./configure

 # make

 # make install

- 이대로 하면 일단 컴파일은 된다.



오라클DB를 사용할 경우, ./configure 목록에 ORACLE 이 ENABLE 되어 있어야 한다.


오라클 활성화를 위해 필요한 옵션 및 프로그램.

 # rpm -ivh oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
 # rpm -ivh oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm


1번째 줄이 instant client 이고, 2번째 줄이 include 항목들이다.

모두 설치 하자.



configure 설정 시 필요한 옵션설정

 --with-oci=no
 --with-oci-include=/usr/include/oracle/12.1/client64
 --with-oci-lib=/usr/lib/oracle/12.1/client64/lib


단 3줄 인데, 간단한 설명을 첨부 하자면...

1번째 줄의 옵션을 yes 로 주면 하단의 2줄은 무효가 되는 듯 하다. 즉 ORACLE_HOME 의 환경변수를 따라간다는 뭐 그런 내용인것 같은데...;;


1번째 울의 옵션을 no 로 주면 2, 3번째 줄에서 지정한 include 경로와 lib 경로를 따라 간다.

여기서는 직접 찾아서 정의해 주고 가는 것으로 한다.


저 경로는 직접 찾은 것이므로 사용하는 운영체제의 버젼에 따라 다를 수도 있다.

RedHat Linux에 rpm 설치 한 결과 이다.


컴파일 결과물 설치 경로는 --prefix=/home/user/compile 과 같이 설정 에 추가하면 된다.


전부 종합하면 아래와 같이 된다.

 # rpm -ivh oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
 # rpm -ivh oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm


 # ./configure --with-oci=no --with-oci-include=/usr/include/oracle/12.1/client64 --with-oci-lib=/usr/lib/oracle/12.1/client64/lib --prefix=/home/user/compile


 # make


 # make install

이렇게 정상적으로 모두 완료 되면 컴파일된 결과물이 /home/user/compile 로 들어가게 된다.




[참고]

README
./configure --help

http://docs.oracle.com/cd/B19306_01/server.102/b14357/ape.htm#CHDJCDFA




Posted by 해비
2016. 1. 28. 21:58

엑셀 파일을 열고 데이터를 가져오는 것 까지 정리합니다.



절차는 크게 보면 아래 와 같습니다.

1. 파일열기

2. 시트목록 추출

3. 해당시트로 부터 데이터 추출




1. 파일열기

            openDlg1.FileName = "";

            // 변수선언

            string sFileName = "";

            OleDbConnection oleConn = new OleDbConnection();



            // 파일 읽기 다이얼로그 호출. 결과가 취소인 경우 여기서 실행을 멈춘다.

            if (this.openDlg1.ShowDialog() == DialogResult.Cancel)

            {

                return;

            }



            // 파일 읽기 다이얼로그로 부터 파일경로 획득

            if (!this.openDlg1.FileName.Equals(""))

            {

                sFileName = openDlg1.FileName;

            }

            else

            {

                return;

            }



            // xlsx와 xls의 연결 방법이 다르므로 구분하여 적용.

            if (sFileName.IndexOf("xlsx") >= 0)

            {

                // 여기서 오류 날 경우, 오피스 2007 시스템 드라이버를 설치한다.

                // https://www.microsoft.com/ko-kr/download/details.aspx?id=23734


                oleConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + sFileName + @";Extended Properties=Excel 12.0";

            }

            else

            {

                oleConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + sFileName + "; Extended Properties=Excel 8.0;";

            }



            // 오픈~

            oleConn.Open(); 

- openfiledialog 를 사용하여 파일을 선택한다.

- 코드 내 주석에도 있지만, Open() 시 컨넥션 스트링 어쩌고 오류나는 경우가 있다. https://www.microsoft.com/ko-kr/download/details.aspx?id=23734 주소로 부터 시스템 드라이버를 다운받아 설치한다.




2. 시트목록 추출

            // 시트가 여러개 존재할 경우 모든 시트 목록을 만든다.

            DataTable sheetListDT = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

            string sheetName = "";


            // 시트 목록 돌면서 처리할 내용이 있다면 추가한다. (예: 특정 단어가 포함된 시트 제외 한다던가 뭐 그런 것들...)

            for (int i = 0; i < sheetListDT.Rows.Count; i++)

            {

                // 시트명 표시

                //sheetName = sheetListDT.Rows[i]["TABLE_NAME"].ToString();

                //MessageBox.Show(sheetName);


                // sheetListDT.Rows[i].Delete(); // 예: 시트 제거


            }


            // 변경 내용 반영

            sheetListDT.AcceptChanges(); 

- 시트 목록을 구한다. 일부 필요없는 시트가 있다면 여기서 걸러낸다.




3. 시트로 부터 데이터를 조회

            // 시트로 부터 데이터 조회

            //DataSet tmpDS = new DataSet();

            string sqlStr = "";

            for (int i = 0; i < sheetListDT.Rows.Count; i++)

            {

                sheetName = sheetListDT.Rows[i]["TABLE_NAME"].ToString();

                sqlStr = "SELECT * FROM [" + sheetName + "]";


                OleDbCommand oleCom = new OleDbCommand();

                oleCom.CommandType = CommandType.Text;

                oleCom.CommandText = sqlStr;

                oleCom.Connection = oleConn;


                OleDbDataAdapter oleAdt = new OleDbDataAdapter();


                oleAdt.SelectCommand = oleCom;


                DataTable tmpDT = new DataTable();


                oleAdt.Fill(tmpDT);


                tmpDT.TableName = sheetName;


                //tmpDS = StringMerge(tmpDS, tmpDT, 10);

                dataGridView1.DataSource = tmpDT;

            } 

- 테이터를 DataTable 에 채워 넣는다.

- dataGridView 컨트롤에 뿌리는 것으로 샘플코드는 종료~!!






결과 샘플


실행 예



사용된 엑셀 데이터







Posted by 해비
2015. 7. 2. 16:53

yyMMdd 형식(6자리)에서 yyyyMMdd 형식(8자리)으로 변환



string OrdYMD_RAW = "150702";
           
DateTime dtOrdYmd = DateTime.ParseExact(OrdYMD_RAW, "yyMMdd", null);
           
string strDate = dtOrdYmd.ToString("yyyyMMdd");
                       
// String --> DateTime   6자리 에서 DateTime 형식으로 변환.
// DateTime --> String   DateTime 형식에서 8자리 날짜 포맷으로 변환.



1. 1915 년에 컴퓨터가 없었다.

2. 2115년 까지 현재의 프로그램을 이용할 확률은 거의 없다.


위 2가지 생각에 비추어 편법으로 앞에 "20" + 6자리 날짜데이터(스트링) 으로 처리 할 수도 있었으나, 왠지 모르게 이건 아니다 싶어 변환 하고 다시 변환하는 방법으로 처리 했는데...


해놓고 보니 그게 그건가... 싶기도 -_-;;



Posted by 해비
2015. 5. 21. 22:04


텍스트 문장을 char 배열, 또는 byte 배열로 분해하면...? 문득 떠오른 것을 그냥 한번 만들어 보았다.


어디 써먹을 데 있으려나...





C# 에서 char는 문자 1개당 하나씩 대응(2바이트 인듯 하다) 하고, byte는 알고 있던대로... 한글 2바이트 기타 아스키 코드 1바이트 대응 하고 있다.




char 배열로 분해하기

char[] charArr = msgStr.ToCharArray(); 

- msgStr 은 문자열이 들어있는 string 변수이다.




byte 배열로 분해하기

System.Text.Encoding AscEnc = System.Text.ASCIIEncoding.GetEncoding("ks_c_5601-1987");

byte[] byteArr = AscEnc.GetBytes(msgStr);

- msgStr 은 문자열이 들어있는 string 변수이다.

- 문자열 인코딩을 설정한 다음 바이트 배열로 분해하여 담는다.





풀 소스코드는 Github 에서 다운로드 가능~

https://github.com/haebi/textsplitter




[실행파일]

textsplitter.zip


그냥 실행파일만 필요하면 이것을 받으면 된다. 

닷넷 4.5가 설치되어있지 않다면 실행되지 않고 불평을 늘어놓을 것이다. (아마도...)





Posted by 해비
2015. 5. 21. 13:37



VS 2013 에서의 github 사용 방법 간단정리



1. git 다운로드

http://msysgit.github.io/



2. 회원가입, 로그인 후 리포지터리 생성

https://github.com/

- 리포지터리 생성할 때, Initialize this repository with a README 에 체크가 되지 않도록 주의한다.



3. 그대로 vs2013 실행 후, 아무거나 프로젝트 하나 만들자 (윈폼 하나 떠 있어도 일단은 OK 다)

[파일] - [소스 제어에 추가] - [Git 선택] - [확인]



4. [보기] - [팀 탐색기] 열어서, [홈(집)] - [프로젝트-변경내용] - [커밋 메시지 입력] - [커밋]

- 여기서 로컬에 커밋이 완료 되었습니다.



5. 다시 [팀 탐색기] 열어서, [홈(집)] - [동기화 되지 않은 커밋] - [github에서 생성한 리포지터리의 URL 주소 입력] - [게시] - [github ID, PW 입력]

-여기서 github에 푸쉬가 완료 되었습니다.





이제 github 으로 부터 소스 내려받아서 작업 진행을 예로 들겟습니다.

1. vs2013실행 - [파일] - [소스제어에서 열기] - [팀 탐색기] - [연결(플러그)] - [복제본] - [github 리포지터리 URL 입력] - [복제]

- 원격지의 소스를 로컬에 내려받았다.



2. [복제] 버튼 아랫부분에 로컬에 내려진 프로젝트가 보인다. - [더블클릭] 하면 해당 [프로젝트의 홈으로 이동]한다.

   - 솔루션파일(.sln)을 다시 더블클릭하면 해당 솔루션이 열린다.

   - 솔루션 탐색기로 가면 프로젝트는 이미 열려있다. 직접 소스를 열도록 한다.



3. [소스 수정] 알아서 임의로 수정한다. 그냥 버튼 하나 추가로 끝내도 좋다.



4. [팀 탐색기] - [홈] - [변경내용] - [커밋 메시지 입력] - [커밋 후 푸시] - [github ID/PW 입력] - [로컬커밋 & github 푸시 완료]

- 이번엔 로컬 커밋과 github의 푸시를 한번에 완료 하였다.






Posted by 해비
2015. 4. 21. 17:07



[SQL]

SELECT *
  FROM
      (
       SELECT A.OWNER
            , A.TABLE_NAME
            , B.COMMENTS AS TABLE_NAME_CO
            , C.COLUMN_ID
            , C.COLUMN_NAME
            , D.COMMENTS AS COLUMN_NAME_CO
            , C.DATA_TYPE || CASE WHEN C.DATA_TYPE IN ('VARCHAR2','CHAR')          THEN ' (' || C.CHAR_LENGTH || ' Byte)'
                                  WHEN C.DATA_TYPE = 'NUMBER' AND C.DATA_SCALE > 0 THEN ' (' || C.DATA_PRECISION ||','|| C.DATA_SCALE ||')'
                                  WHEN C.DATA_TYPE = 'NUMBER' AND C.DATA_SCALE = 0 THEN ' (' || C.DATA_PRECISION ||')'
                                  ELSE C.DATA_TYPE END AS DATA_TYPE
            , C.NULLABLE
            , (SELECT POSITION
                 FROM ALL_CONS_COLUMNS Y
                    , ALL_CONSTRAINTS Z
                WHERE Y.OWNER           = Z.OWNER
                  AND Y.TABLE_NAME      = Z.TABLE_NAME
                  AND Y.CONSTRAINT_NAME = Z.CONSTRAINT_NAME
                  AND Z.CONSTRAINT_TYPE = 'P'
                  AND Y.OWNER           = A.OWNER
                  AND Y.TABLE_NAME      = A.TABLE_NAME
                  AND Y.COLUMN_NAME     = C.COLUMN_NAME) AS COL_PK
            , C.DATA_DEFAULT AS COL_DEFAULT
         FROM ALL_TABLES       A
            , ALL_TAB_COMMENTS B
            , ALL_TAB_COLUMNS  C
            , ALL_COL_COMMENTS D
        WHERE A.OWNER       = B.OWNER
          AND A.TABLE_NAME  = B.TABLE_NAME
            AND C.OWNER       = A.OWNER
          AND C.TABLE_NAME  = A.TABLE_NAME
          AND D.OWNER       = A.OWNER
          AND D.TABLE_NAME  = A.TABLE_NAME
          AND D.COLUMN_NAME = C.COLUMN_NAME
      )
 WHERE OWNER LIKE '%'
   AND TABLE_NAME LIKE '%'
 ORDER BY TABLE_NAME, COLUMN_ID



엑셀 문서작업 한다고 필요해서 작업했던 것인데 나중에 또 써먹을 것 같아서 보관...



Posted by 해비