//구글광고

 

외부접속이 가능한 유저를 생성한다.


create user 'admin'@'%' identified by 'arduino';

 

유저는 admin , 암호는 arduino로 만들었다. 이는 외부 mysql에서 접속할때 접속자로 사용된다.

 

외부에서 접속해서 사용할 데이터베이스를 생성한다.

create database sensor;

 

생성된 sensor 데이터베이스의 모든 권한을 admin 유저에게 준다. 여기서 admin유저는 외부접속이 가능한 유저이다.
grant all privileges on sensor.* to 'admin'@'%';
flush privileges;
show grants for 'admin'@'%';

이제 운영체제 에서 아래의 내용을 수정한다.
cd /etc
sudo vi my.cnf

bind-address를  127.0.0.1 -> 0.0.0.0 으로 변경

 

 

mysql 서비스를 재시작 하면 이제 외부에서 접속이 가능해진다

접속할때는 SSH모드로 접속하거나(root유저 사용시)

admin유저 사용시는 tcp/ip로 해서 3306으로 접속하면 된다.

(참고문헌 : 백견불여일타 머신러닝 데이터 전처리 입문 - 로드북)

 

데이터 읽어오기

 

  1) CSV 열기   

import pandas as pd

df1 = pd.read_csv('bank.csv', sep=',')
df1.head()

head로 조회 하면 엑셀처럼 깔끔하게 나옴.

 

 

일반적인 파일오픈과 비교해 보면 차이가 좀 있다.

import csv

f=open('bank.csv','r',encoding='cp949')

rdr = csv.reader(f)

for col in rdr :
    print(col)

f.close()     

 

- 데이터의 행수와 열수 확인

print(df1.shape)

 

- 데이터 타입 확인

print(df1.dtypes)

shape (데이터의 행과 열의 수 ), 데이터타입 확인한 결과

- 데이터 결손치 확인

 

 데이터에 null 값이 있는지를 조회하는방법

 

   isnull 을 이용하여  결손치가 있는지 여부(유무) 확인하기 - 결손치가 있으면 True 를 반환 아니면 False를 반환

   axis가 1 이면 행방향으로 결손치유무를 검색함

   axis가 0 이면 열방향으로 결손치유무를 검색함

print(df1.isnull().any(axis=1))

axis =1 로 행방향으로 결손치 유무 검색 결과

print(df1.isnull().any(axis=0))

axis =0 으로 열방향 결손치 유무 검색결과

 

- 결손치의 개수 파악 

  위의 방법으로 하면 데이터가 클수록 찾기가 힘들다 그래서 결손값의 개수를 파악해보기 위해 sum을 사용해서 카운트

print(df1.isnull().sum(axis=1))

행방향(axis=1)의 결손치 합을 계산한다

행방향 결손치 합의 결과

결손치합이 많은 순서대로 정렬하기

print(df1.isnull().sum(axis=1).sort_values(ascending=False))

ascending=False 로 내림차순 정렬

내림차순 정렬된 결과

print(df1.isnull().sum(axis=0))

열방향(axis=0)의 결손치 합을 계산한다.

 

열방향 결손치 합의 결과

 

- 통계량 계산

 

데이터 프래임의 describe() 를 사용하여 통계량을 계산할 수 있다. 기본적으로 수치(int64) 항목에 대한 통계량이 계산되어 나온다

 

count : 건수(데이터건수의 총합)

mean : 평균값 , std : 표준편차

min : 최솟값 , 25% : 제 1사분위값, 50% : 제2사분위값(중앙치), 75%: 제3사분위값, max:  최댓값

 

df1.describe()

 

데이터프레임의 통계치가 나옴(수치항목컬럼만 계산되어 나옴)

df1.describe(include=[object])

오브젝트 타입에 대한 통계치를 보려면 include=[object] 옵션을 넣어주면 볼 수 있다.

 

오브젝트 컬럼의 통계정보

 

 

 

 

 

opencv 에서 웹캠을 열어서 frame을 read 해보면 해상도가 640*480 으로만 나오는 문제가 발생했다.

 

웹캠 스팩에는 full - hd 지원이라 이상하게 여겨서 자료를 찾아보니 다음과 같은 방법으로 해결할 수 있었다.

 

1. frame을 처음 한번 read 한다.

 capture.Read(frame);

 

2. 처음 read 한 프래임에서 해상도값을 구해본다.

 if (!frame.Empty())
                {
                    

                    capture.Read(frame);

                    cameraCount = cameraCount + 1;
                    textBox2.Text = textBox2.Text + "\n카메라(" + i + ") 발견됨 (" + capture.FrameWidth+ "*" + capture.FrameHeight + ")";
                    
                }
                else
                {
                    textBox2.Text = textBox2.Text + "\n카메라(" + i + ") 발견실패";
                }

frame이 정상적으로 읽혀졌는지(empty 가 아닌지 ) 판단한 후,

해상도를 구해보자

 

1번 카메라는 720p 이고 2번 카메라는 full-hd 지원이라고 스팩에 적혀있었으나 640*480 해상도만 나오는 문제가 발견된다.

 

3. 프레임을 읽고 난 후, 해상도를 강제로 5000*5000으로 큰값을 지정해준다.

if (!frame.Empty())
                {
                    capture.FrameWidth = 5000;
                    capture.FrameHeight = 5000;

                    capture.Read(frame);

                    cameraCount = cameraCount + 1;
                    textBox2.Text = textBox2.Text + "\n카메라(" + i + ") 발견됨 (" + capture.FrameWidth+ "*" + capture.FrameHeight + ")";
                    
                }
                else
                {
                    textBox2.Text = textBox2.Text + "\n카메라(" + i + ") 발견실패";
                }

해상도를 강제로 엄청 높게 지정해준 뒤에, 카메라의 값을 다시 read 해주자.

 

이제 카메라가 지원하는 최대 해상도 값을 찾을 수 있다.

 

ps. 로지텍 full -hd 웹캠은 스팩오버로 3k 해상도를 max 로 출력하였다.

'openCV' 카테고리의 다른 글

openCV 4 를 닷넷(C#) 에서 사용하기  (0) 2019.05.14

간단한 cctv 프로그램이 필요해져서 관련기술을 찾아보니

웹 카메라를 제어하는 기술은 크게

 

openCV 와 directshow 등이 사용되고 있었다.

 

openCV는 오픈소스기반의 프로젝트로 자바, 파이썬 등등의 여러 언어에서 사용할 수 있으며,

directshow는 MS에서 제공하는 윈도우에서 사용하는 라이브러리 이다.

 

openCV는 관련책들이 c++ 과 python 에서 사용하는 방식으로 설명되어 있는데

닷넷(C#) 으로 개발된 프로젝트에 카메라 제어 기능을 넣기 위해서 다양한 방법을 알아보던 중, 

최신버전(CV 4.0) 에서 실행되는 예제가 정리 되어 있는게 없어서 정리해 본다.

 

1. 준비물

 

MS Visual Studio Community 버전 ( 개인 및 교육용 무료 ) 

https://visualstudio.microsoft.com/ko/thank-you-downloading-visual-studio/?sku=Community&rel=15&rr=https%3A%2F%2Fdocs.microsoft.com%2Fko-kr%2Fvisualstudio%2Freleasenotes%2Fvs2017-relnotes

 

Visual Studio를 다운로드해 주셔서 감사합니다. - Visual Studio

다운로드가 시작되지 않은 경우에는 여기를 클릭하여 다시 시도하세요. 자습서, 샘플, 문서를 찾아 코딩을 시작하십시오. 자세히 보기 첫 번째 “Hello World!” 만들기 Visual Studio 2019를 사용하는 C++ 콘솔 앱. 시작 Azure 체험

visualstudio.microsoft.com

 

 

2. 개발환경

 

1) Visual Studio C# community 버전을 설치한 후 프로젝트를 하나 생성한다.

2) 프로젝트 메뉴 -> NuGet 패키지 관리로 들어간다.

 

3) 찾아보기 에서 opencv 를 검색하면 작성자 shimat 로 된 OpenCvSharp3 - AnyCPU 가 나올 것이다.

제일 최신버전인 v4.0 대로 설치 한다.

4) 폼 디자인 창에서 폼 디자인을 해주자

 

4.0 에서는 구버전에서 쓰던 pictureboxlpl 대신에 picture box 를 쓸수 있다.

폼에 picture box 와 command 버튼, text box 하나를 놓아주자

 

picturebox 의 size 속성을 680,480 으로 지정한다.

 

Button의 Text 속성을 Start로 지정한다.

 

textbox 의 multiline 속성을 True로 설정해준다.

 

폼 디자인을 대충 보면 이렇게 된다.

 

3. 코딩 시작

 

using 란에 

 

using OpenCvSharp;
using OpenCvSharp.Extensions;

using System.Threading;

 

을 추가해준다.

 

다음의 변수들을 추가한다.

        VideoCapture capture;
        Mat frame;
        Bitmap image;
        private Thread camera;
        int isCameraRunning = 0;

 

openCV 4 에서는 VideoCapture 를 사용한다.

camera는 별도의 쓰레드를 이용하여 캡춰하여 pictureBox 에 그림을 뽑아내도록 하였다.

인터넷의 다른예제에서는 Timer 를 사용하여 Tick 마다 갱신하는 방법도 있으니

어느쪽이든 선택하면 되겠다.

 

 

별도의 쓰레드로 카메라를 캡춰하기 위해 콜백함수를 생성한다.

 


        private void CaptureCamera()
        {
            
            camera = new Thread(new ThreadStart(CaptureCameraCallback));
            camera.Start();
        }

        private void CaptureCameraCallback()
        {
            frame = new Mat();
            capture = new VideoCapture();
            capture.Open(1);

            while (isCameraRunning == 1)
            {
                capture.Read(frame);
                if (!frame.Empty())
                {
                    image = BitmapConverter.ToBitmap(frame);
                    pictureBox1.Image = image;
                }
                image = null;
            }

        }

capture.Open(1) << 이 부분이 카메라 1번을 여는 부분이다.

내장된 usb 카메라가 1번이 될것이고, 새 카메라를 연결하면 2 , 3 이런식으로 증가한다.

 

 

 

Start 버튼을 누르면 캡처 하는 기능을 넣어주자

버튼의 클릭 이벤트에 아래의 코드를 넣어준다.

   private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text.Equals("Start"))
            {
                CaptureCamera();
                button1.Text = "Stop";
                isCameraRunning = 1;
            }
            else
            {
                if (capture.IsOpened())
                {
                    capture.Release();
                }

                button1.Text = "Start";
                isCameraRunning = 0;
            }
        }

 

Start 상태일때 버튼을 누르면 카메라 화면이 나타난다

Stop 일때 버튼을 누르면 카메라 화면이 중단된다.

 

 

실행하면 이렇게 나타난다.

 

 

전체소스

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;
using System.Threading;


namespace Simple_Web_Cam
{
    public partial class Form1 : Form
    {

        VideoCapture capture;
        Mat frame;
        Bitmap image;
        private Thread camera;
        int isCameraRunning = 0;


        private void CaptureCamera()
        {

            camera = new Thread(new ThreadStart(CaptureCameraCallback));
            camera.Start();
        }

        private void CaptureCameraCallback()
        {
            frame = new Mat();
            capture = new VideoCapture();
            capture.Open(1);

            while (isCameraRunning == 1)
            {
                capture.Read(frame);
                if (!frame.Empty())
                {
                    image = BitmapConverter.ToBitmap(frame);
                    pictureBox1.Image = image;
                }
                image = null;
            }

        }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text.Equals("Start"))
            {
                CaptureCamera();
                button1.Text = "Stop";
                isCameraRunning = 1;
            }
            else
            {
                if (capture.IsOpened())
                {
                    capture.Release();
                }

                button1.Text = "Start";
                isCameraRunning = 0;
            }
        }

    }
}

 

 

 

 

'openCV' 카테고리의 다른 글

openCV webcam(웹캠) 화질 640*480 로만 나올때 해결방법  (0) 2019.05.15

공돌이인 내가 심심해서 각종 페이지를 만들다 보면

css 스타일을 만들기가 정말 힘들다 ㅠ_ㅠ

 

제일 많이 쓰는것이 Bootstrap 인데 <DIV> <DIV> 천국인데 너무 어렵다..

(쉽게 나온 것인데 왜이렇게 어려운지)

 

그래서 이것 저것 알아보다가 

METRO UI 4.0 이란걸 찾아보았는데 open source 에 몇가지 '깰끔' 하면서 

편해보여 한번 정리해보고자 한다.

 

 

https://metroui.org.ua/index.html 로 접속하면 이런 그림이 보인다.

 

메트로 ui 초기 화면

 

적용방법은 2가지가 있는데 매우 간단하다.

표로 정리해보면

 

 

적용방식 특징 적용방법
CDN

페이지를 여는 사용자가 페이지 열때마다 CDN 페이지에서 css, js를 다운로드 하는 방식

 

버전관리 불필요

웹페이지 트래픽 감소

1) <head> 테그에 아래의 줄을 붙여넣는다 

<link rel="stylesheet" href="https://cdn.metroui.org.ua/v4/css/metro-all.min.css">

 

2)  옵션으로  몇몇 항목만 제한적으로 사용하고 싶다면 아래중에 필요한것만 <head> 테그에 붙여넣어 쓴다.

 

<link rel="stylesheet" href="https://cdn.metroui.org.ua/v4/css/metro.min.css"> <link rel="stylesheet" href="https://cdn.metroui.org.ua/v4/css/metro-colors.min.css"> <link rel="stylesheet" href="https://cdn.metroui.org.ua/v4/css/metro-rtl.min.css"> <link rel="stylesheet" href="https://cdn.metroui.org.ua/v4/css/metro-icons.min.css">

 

3) 바디 테그를 닫는 </body> 바로 앞에 아래의 줄을 복사해서 붙여넣는다

 

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script src="https://cdn.metroui.org.ua/v4/js/metro.min.js"></script>

 

이때 주의점은 순서대로 해야한다.

다운로드

다운로드 링크에서

css, js 파일을 다운받아 페이지에

기술해줌

 

버전을 일관적으로 관리할 수 있는 장점이 있음

다운로드에서

관련 파일 다운로드 후 

페이지에 넣어줌

 

https://metroui.org.ua/download.html

 

 

기본페이지

 

헬로우 월드 페이지 테스트

 

test.jsp 

 

<!DOCTYPE html>

  <head>
    <!-- 필수 meta 테그 -->
    <meta charset="utf-8">
    <!-- 반응형 웹을 위한 meta 테그 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

    <!-- Metro 4 용 css -->
    <link rel="stylesheet" href="https://cdn.metroui.org.ua/v4/css/metro-all.min.css">
  </head>
  <body>
  
    <h1>헬로우 월드!</h1>

    <!-- jQuery 를 먼저 적어줘야 한다. -->
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <script src="https://cdn.metroui.org.ua/v4/js/metro.min.js"></script>
  </body>
</html>

 

 

시놀로지(Synology NAS) DS 718+ , 918+ RAM 용량 16GB 확장하기


시놀로지 NAS 구입하실 때 램이 16기가 까지 확장이 가능한지 매우 궁금하실 겁니다.

저도 많이 받았던 질문인데, 오늘 제가 램업글을 해보았습니다.


DS 718+ , DS918+ 모델은 16GB 확장이 가능합니다.

기존슬롯에 있던 4GB 모듈을 빼고 삼성 DDR3L- 노트북용 저전력 메모리 8GB * 2 개를 설치하여 16GB로 업그레이드 하였고
정상동작이 가능합니다.


이렇게 16GB로 나오는 것을 볼 수 있습니다.

이제 더 많은 가상머신을 올릴 수 있게 되었습니다.


기본 4GB 상태에선 리눅스 가상머신 하나돌리기도 힘든 상황이었습니다.

램확장하시고 편하게 사용하시기 바랍니다.


이때 주의하실점은 반드시 

"노트북용 DDR3 PC3L 저전력 8G 12800S" 를 사셔야 합니다."






이렇게 생겼습니다. 



이클립스 jsp 개발중 tomcat 서버에서 Multiple Contexts have a path of 오류 발생



원인 : project 이름의 중복


상황별 해결 방법
1. 기존에 잘 개발하던 중에 tomcat 서버를 새로 설정한 뒤 발생한 경우

  최초 실행을 하면, server.xml 에 Context 값이 생성된다.
  그 후에 기존 설정 값을 추가 하여야 한다.

  <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">


        <!-- SingleSignOn valve, share authentication between web applications

             Documentation at: /docs/config/valve.html -->

        <!--

        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

        -->


        <!-- Access log processes all example.

             Documentation at: /docs/config/valve.html

             Note: The pattern used is equivalent to using pattern="common" -->

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log." suffix=".txt"/>


     !!! 여기에 Context 값들이 적혀있으면 지우고 한번 run 해주자 !!!

      

   </Host> 



그러면 server.xml 에 context 값이 추가 될 것이다.
이제 백업해준 설정값을 추가해서 변경해주면 해결 된다.

 



오라클 DB - JSP vo(beans), DAO, DTO 생성 스크립트 v3


이전포스트에서 사용하던 스크립트를 조금 다듬었다.

(이전포스트 : http://kimazfactory.tistory.com/40 )

사용방법
1 ) sqlplus 에서 해당 유저로 로그인 하여 mktbltovo3.sql 을 실행한다.


2) ENTER TABLE_NAME > 라는 프롬프트가 뜨면 테이블 명을 입력한다.

이전버전에는 대문자로만 입력했어야 하는데 이제 대소문자 가리지 않게 수정했다.



테이블 이름을 입력하면 해당 테이블에 제일처음

VO를 만들기 위한 선언문이 나오고


2번째 화면에 DAO 에 insert 문을 생성하기 위한 SQL구문과

set 구문을 생성해준다.


이번 버전에서 물음표와 컬럼이름 뒤에 컴마를 수정했다.



3번째 화면에서 셀렉트 구문을 생성하기 위해서 사용하는

Vo에 값을 set 하는 구문을 생성해준다.



버그 제보 및 기능개선을 비밀 댓글로

출처는 표기해서 가져가시고 비밀 댓글로 퍼간다는 멘트정도 남겨주시고

드래그해서 컨트롤 C  안되는 곳에는 절대 배포 금지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
REM ********************************************************
REM * 명    칭 : mkTblToVo
REM * 목    적 : 테이블 컬럼을 jsp용 VO 로 변경해주는 스크립트
REM *
REM *
REM * 파라미터 :  p1, p2, p3 ..
REM *
REM * 작 성 자 :  2018/06/01  김과장 (kimazfactory@gmail.com)
REM * 수정이력 :   v3 컴마수 맞추기
REM * 메    모 :   12/04 Select DAO 용 구문 추가
REM *                12/06 컴마수 맞추기
REM ********************************************************
SET SERVEROUTPUT ON size 1000000
SET PAGESIZE 10000
SET FEEDBACK OFF
SET ECHO OFF
SET VERIFY OFF
SET LINESIZE 300
SET HEADING OFF
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI';
ACCEPT TABLE_NAME PROMPT 'ENTER TABLE_NAME >'
declare
 lvar_col_name   varchar2(512) := '';
 lvar_data_type  varchar2(512) := '';
 lvar_index1 number:=0;
 lvar_index2 number:=0;
 CURSOR cur_column IS
        select column_name, data_type from user_tab_cols where table_name=upper('&TABLE_NAME'order by COLUMN_ID;
 begin
 OPEN cur_column;
dbms_output.put_line('');
dbms_output.put_line('VO information of table : &TABLE_NAME');
dbms_output.put_line('');
dbms_output.put_line('----------------------------------------------');
dbms_output.put_line('');
 LOOP
      FETCH cur_column INTO lvar_col_name, lvar_data_type;
      EXIT WHEN cur_column%NOTFOUND;
          IF    lvar_data_type = 'VARCHAR2'  then dbms_output.put_line('private String '||lvar_col_name||';');
          ELSIF lvar_data_type = 'NUMBER'  then dbms_output.put_line('private int '||lvar_col_name||';');
          ELSIF lvar_data_type = 'DATE'  then dbms_output.put_line('private Timestamp '||lvar_col_name||';');
          ELSE dbms_output.put_line('--Check it!!!-- '||lvar_col_name||';');
          END IF;
 END LOOP;
  CLOSE cur_column;
  OPEN cur_column;
  dbms_output.put_line('');
  dbms_output.put_line('----------------------------------------------');
  dbms_output.put_line('');
dbms_output.put_line('Insert DAO Query for : &TABLE_NAME');
  dbms_output.put_line('');
  dbms_output.put('String sql="insert into &TABLE_NAME (');
 lvar_index1 :=0;
 LOOP
      FETCH cur_column INTO lvar_col_name, lvar_data_type;
      IF cur_column%NOTFOUND THEN
      EXIT;
      ELSE
           IF  lvar_index1 > 0 THEN
            dbms_output.put(',');
           END IF;
      END IF;
      dbms_output.put(lvar_col_name);
      lvar_index1 :=  lvar_index1+1;
END LOOP;
  dbms_output.put(') values (');
  CLOSE cur_column;
    OPEN cur_column;
 lvar_index1 :=0;
 LOOP
      FETCH cur_column INTO lvar_col_name, lvar_data_type;
      IF cur_column%NOTFOUND THEN
      EXIT;
      ELSE
           IF  lvar_index1 > 0 THEN
            dbms_output.put(',');
           END IF;
      END IF;
      dbms_output.put('?');
      lvar_index1 :=  lvar_index1+1;
 END LOOP;
  dbms_output.put(')";');
  CLOSE cur_column;
  dbms_output.put_line('');
  OPEN cur_column;
lvar_index2:=1;
  LOOP
      FETCH cur_column INTO lvar_col_name, lvar_data_type;
      EXIT WHEN cur_column%NOTFOUND;
          IF    lvar_data_type = 'VARCHAR2'  then dbms_output.put_line('pstmt.setString('||lvar_index2||', dVo.get'||lvar_col_name||'());');
          ELSIF lvar_data_type = 'NUMBER'  then dbms_output.put_line('pstmt.setInt('||lvar_index2||', dVo.get'||lvar_col_name||'());');
          ELSIF lvar_data_type = 'DATE'  then dbms_output.put_line('pstmt.setTimestamp('||lvar_index2||', dVo.get'||lvar_col_name||'());');
          ELSE dbms_output.put_line('--Check it!!!-- '||lvar_col_name||';');
          END IF;
  lvar_index2:=lvar_index2+1;
 END LOOP;
  CLOSE cur_column;
  dbms_output.put_line('');
  dbms_output.put_line('----------------------------------------------');
  dbms_output.put_line('');
dbms_output.put_line('SELECT DAO Query for : &TABLE_NAME');
  dbms_output.put_line('');
  OPEN cur_column;
  lvar_index2:=1;
  LOOP
      FETCH cur_column INTO lvar_col_name, lvar_data_type;
      EXIT WHEN cur_column%NOTFOUND;
          IF    lvar_data_type = 'VARCHAR2'  then dbms_output.put_line('Vo.set'||lvar_col_name||'(rs.getString('||lvar_index2||'));');
          ELSIF lvar_data_type = 'NUMBER'  then dbms_output.put_line('Vo.set'||lvar_col_name||'(rs.getInt('||lvar_index2||'));');
          ELSIF lvar_data_type = 'DATE'  then dbms_output.put_line('Vo.set'||lvar_col_name||'(rs.getTimestamp('||lvar_index2||'));');
          ELSE dbms_output.put_line('--Check it!!!-- '||lvar_col_name||';');
          END IF;
  lvar_index2:=lvar_index2+1;
 END LOOP;
  CLOSE cur_column;
  end;
/
cs




여기서  다운로드 하세요 >>>   

mkTblToVo3.sql




'oracle > sql' 카테고리의 다른 글

[오라클 내장함수1] oracle 문자열 함수  (0) 2018.11.21



ORACLE 내장함수 1. 문자열함수

ORACLE 문자열 함수


아래는 모두 단일행(Single row return) 함수다.



문자열 내장함수 표


 함수명

인자(입력값)

 리턴값 

LOWER

문자열

입력값을 소문자로 반환 

UPPER 

문자열

입력값을 대문자로 반환 

INITCAP 

문자열 

입력값의 첫문자를 대문자로, 나머지는 소문자로 반환 

 LPAD

문자열1, n[문자열 2] 

문자열1의 좌측에 문자열2의 문자를 채워 n자리로 만들어서 리턴 

RPAD 

문자열1, n[문자열 2] 

문자열 1의 우측에 문자열2의 문자를 채워 n 자리를 만들어서 리턴 

 SUBSTR

문자열, n[,m] 

 문자열의 n번째 문자부터 m개의 문자를 리턴

INSTR 

문자열1, 문자2 

문자열1 에서 문자2가 나오는 최초의 위치를 리턴 

 LTRIM

문자열 [.SET] 

문자열의 좌측부터 시작해서 SET문자열이 안나올때까지 문자를 삭제

  RTRIM

문자열 [.SET] 

문자열의 우측부터 시작해서 SET문자열이 안나올때까지 문자를 삭제 

 SOUNDEX

문자열 

지정한 단어와 발음이 동일한 문자열을 리턴 

 TRANSLATE

문자열, S1, S2 

모든 S1을 S2로 치환 한 후 리턴 

 CHR

문자열 

지정된수치와 일치하는 ASCII 코드를 리턴 

 ASCII

문자열 

지정된 문자의 ASCII 코드값을 리턴 

 REPLACE

문자열, STR1, STR2 

문자열에서 STR1을 모두 STR2로 치환후 리턴, STR2를 입력하지 않으면 문자열에서 STR1을 모두 삭제 

 CONCAT

 문자열1, 문자열2

문자열1과 문자열 2를 합쳐서 리턴한다.  

 TRIM

LEADING / TRAILING/ BOTH 혹은 트림할 문자열 + FROM 원문자열 

trim(LEADING 트림할문자열 FROM 원본문자열 ) : 문장의 앞에서 트림할 문자열 제거

trim(TRAILING 트림할문자열 FROM 원본문자열 ) : 문장의 위에서 트림

trim(BOTH 트림할문자열 FROM 원본문자열) : 양쪽에서 다 트림

TRIM(원본문자열) : 앞 뒤 공백을 제거

TRIM() : null 을 반환

LENGTH

 문자열

입력한 캐릭터셋으로 계산한 문자열의 길이를 반환

바이트를 반환 하고 싶으면 LENGTHB를 사용



1. lower 함수


 SQL> select lower('HELLO WORLD') from dual;


LOWER('HELL

-----------

hello world


SQL>




2. upper 함수


SQL> select upper('hello world') from dual;


UPPER('HELL

-----------

HELLO WORLD


SQL>

 


3. initcap 함수


SQL> select initcap('hello WORLD') from dual;


INITCAP('HE

-----------

Hello World


SQL>

 


4. LPAD 함수


SQL> select lpad('hello world',3) from dual;


LPA

---

hel


SQL>




SQL>  select lpad('hello world',166,'o') from dual;


LPAD('HELLOWORLD',166,'O')

--------------------------------------------------------------------------------

oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooohello

 world




만약 숫자 1, 2 나오는 컬럼이 있는데 이를 6자리로 000001 이렇게 채워야 할때 사용


SQL>  select lpad('1',6,'0') from dual;


LPAD('

------

000001


SQL>



SQL>  select lpad('133',6,'0') from dual;

LPAD('
------
000133

SQL>

이런식으로 6자리로 채워준다.


5. RPAD 함수


 LPAD와는 반대로 우측에 자릿수 채우기 위해서 사용


SQL> select rpad('1',6,'*') from dual;


RPAD('

------

1*****


SQL>


전체 출력하는 개수는 가운데 6의 숫자로 결정 나머지는 기존문자가 자릿수보다 크면
자릿수만큼만 기존문자를 출력
기존문자가 자릿수보다 작으면 작은 부분만큼 변형문자로 채워줌


6. substr 함수


SQL> select substr('Hello World',3) from dual;


SUBSTR('H

---------

llo World


SQL>


문자를 특정 인덱스 부터 시작해서 출력해줌

시작인덱스만 지정하면 시작부터 끝까지

종료인덱스를 지정하면 시작부터 종료까지


SQL> select substr('Hello World',3,5) from dual;


SUBST

-----

llo W


SQL>


 


7.instr 함수

SQL> select INSTR('Hello World','h') from dual;


INSTR('HELLOWORLD','H')

-----------------------

                      0


SQL> select INSTR('Hello World','Hello') from dual;


INSTR('HELLOWORLD','HELLO')

---------------------------

                          1


SQL> select INSTR('Hello World','llo') from dual;


INSTR('HELLOWORLD','LLO')

-------------------------

                        3


SQL>

 



'oracle > sql' 카테고리의 다른 글

oracle vo, DAO, DTO 생성 스크립트 v3  (0) 2018.12.06




jsp 오라클 vo 쉽게 만드는 스크립트


jsp 개발시 테이블명을 입력하면 오라클 vo를 쉽게 만들어주는 스크립트.


mkTblToVo.sql




컬럼 열개씩 되는 테이블을 vo 생성하다가 빡쳐서 만들어본 스크립트다.

퍼가기 없기, 계속 패치할꺼니까 여기 URL 만 적어서 가져가기, 요청사항은 댓글에 달아놓기

특히 드래그, 복사 안되는 블로그에 퍼가면 매우 화낼꺼임


사용법


1) 오라클 sqlplus 로 테이블 소유자 유저로 접속한다.


2) @mktbltovo 명령어로 스크립트를 실행한다.



3) 실행하면 ENTER TABLE_NAME UPPERCASE -> 라는 프롬프트가 나온다

이때 대문자로 vo를 만들 테이블 명을 입력하면 된다.


그럼 상단에 이 부분을 복제한다


 private int ACT_ID;

private String SESSION_ID;

private String SESSION_CREATETIME;

private String CLIENT_IP;

private String POSTURL;

private String ACTION;

private String LOGIN_ID;




그럼 이렇게 vo class 에 붙여넣고 getter, setter 만들어 주면 아주 쉽다.



우클릭해서 source -> Generate Getters and Setters... 선택해주고,




메소드 만들 컬럼 선택해서 ok 버튼누르면




이렇게 깔끔하게 vo를 생성할 수 있다.





그리고 보너스로 DAO 만들때 insert 구문 하면 물음표 갯수 때문에 매우 귀찮타

아래의 값은 그걸 위해 나오는 내용이다.



그 내용중에 위에 빨간색 사각형에 마지막 컴마 지우고,


아래의 set구문에 숫자를 원하는걸로 편집해서 쓰면 깔끔하다.



추가적으로 요청할 내용이 있으면 댓글로 문의주면 추가 패치할 예정이다.



+ Recent posts