한동안 자료구조와 알고리즘 공부에 손을 놔서 6월달부터 향후 1년간 빠짐없이 공부하려고 한다...

이를 위해 mac 노트북에 C++ 작업 환경을 구축할 필요가 있었으며,

VS Code 상에서 C++ 빌드하는 방법을 기록해둔다.

 

 

task.json 생성 후 task를 아래와 같이 변경한다.

"tasks": [
        {
            "label": "build file",
            "type": "shell",
            "command": "g++",
            "args": [
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "${file}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": [
                "$gcc"
            ]
        },
        {
            "label": "run file",
            "type": "shell",
            "command": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": []
        },
    ]

 

이후 cmd + shift + B 를 누르고 Build -> run 순으로 진행한다.

 

출처 : https://younghk.github.io/VS-Code-C++-Configuration-For-Mac/

 

 

 

1. MySQL 설치

https://dev.mysql.com/downloads/mysql/

 

MySQL :: Download MySQL Community Server

Select Operating System: Select Operating System… Microsoft Windows Ubuntu Linux Debian Linux SUSE Linux Enterprise Server Red Hat Enterprise Linux / Oracle Linux Fedora Linux - Generic Oracle Solaris macOS FreeBSD Source Code Select OS Version: All Window

dev.mysql.com

위 링크에 접속 한 뒤 mysql dmg파일을 다운로드한다.

 

설치 중 데이터베이스 비밀번호 설정하는 부분이 나오는데,

나중에 필요하니 잘 기억을 해둔다.

 

설치 후 시스템 환경설정에서 mysql 의 설치를 확인 한 뒤,

Server를 구동시켜준다.

 

터미널을 켜고 mysql에 접속한다.

cd /user/local/mysql/bin

./mysql -uroot -p

위에서 설정했던 비밀번호를 입력하면

sql로 접속할 수 있다.

 

루트 계정의 비밀번호 변경은 다음과 같다.

set password = password('변경할 비밀번호');

 

 

데이터베이스 생성

create database 데이터베이스명 default charater set utf8 collate utf_general_ci;

show databases;

 

 

사용자 계정 생성 후 전체 권한

create user '유저명'@'localhost' identified by '사용할 비밀번호';

grant all privileges on 데이터베이스명.* to 유저명@localhost;

 

 

2. Workbench 설치

https://dev.mysql.com/downloads/workbench/

 

MySQL :: Download MySQL Workbench

Select Operating System: Select Operating System… Microsoft Windows Ubuntu Linux Red Hat Enterprise Linux / Oracle Linux Fedora macOS Source Code Select OS Version: All Windows (x86, 64-bit) Recommended Download: Other Downloads: Windows (x86, 64-bit), MSI

dev.mysql.com

설치 후 위에서 생성한 사용자 계정으로 접속하면 된다.

크게 어려울 것이 없어서 더 설명이 없다...

 

 

 

3. JDBC 연결

이클립스와 연결하기 위해서는 MySQL Connector 가 설치되어 있어야 한다.

https://dev.mysql.com/downloads/file/?id=476197

 

MySQL :: Begin Your Download

The world's most popular open source database

dev.mysql.com

 

mysql-connector-java-5.1.46.tar.gz를 받은 뒤, 압축을 풀어준다.

 

압축을 푼 mysql-connector-java-5.1.46-bin.jar 파일을

/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/ext

 

위치에 옮긴다.

 

이후, 이클립스에서 이동시켰던 JAR 파일을 등록해준다.

 

1) eclipse로 돌아가서 환경설정을 킨다.

2) 킨 후 Java / Installed JREs 를 누른다.

3) 사용하는 jdk 를 선택하고 edit... 을 누른다.

4) add External JARs... 를 누르고 아까 ext 폴더에서 넣은 mysql jar 파일을 찾아 지정해준다.

 

 

 

 

sidongmen

어플을 개발하다보면 작은 양의 데이터를 임시적으로 기기 내부에 저장해둘 때가 있다.

내부에 저장하려는 데이터의 양이 많거나 빠른 속도를 요구할 때는 SQLite를 사용하지만

작고 간단한 String 값 몇 개 정도는 SQLite 를 사용하는 것은 무거울 수도 있다....

이럴 경우 SharedPreference라는 클래스를 사용하여 이를 처리하는 방법이 있다.

 

나의 경우에는 앱에서 로그인을 하면 서버로 부터 JWT(JSON Web Tokens)을 받아와

이를 저장하고, 이후 추가적인 로그인 없이도 exp 타임 안에 계속해서 로그인 상태가

유지되어야 했다.

 

flutter 에서도 다행히 SharedPreference를 지원하는 패키지가 있으며

이 클래스를 Flutter에서도 사용하는 방법을 기록해두려고 한다.

 

 

 

 

우선 안드로이드에서는 아래와 같이 사용한다.

 

1. 저장

SharedPreferences pref = getSharedPreferences(PREFERENCE, MODE_PRIVATE);

// SharedPreferences 의 데이터를 저장/편집을 위해 Editor 변수를 선언
SharedPreferences.Editor editor = pref.edit();

// key값에 value값을 저장.
// String, boolean, int, float, long 값 등 저장 가능
editor.putString(key, value);

// 메모리에 있는 데이터를 저장장치에 저장함. commit
editor.commit();

 

2. 불러오기

// SharedPreference 를 선언.
// 저장했을때와 같은 key로 xml에 접근.
SharedPreferences pref = getSharedPreferences(PREFERENCE, MODE_PRIVATE);

// key에 해당한 value를 불러온다.
// 두번째 매개변수는 , key에 해당하는 value값이 없을 때에는 이 값으로 대체한다.
String result = pref.getString(key, "");

 

한눈에 봐도 코드가 직관적이다.

 

SharedPreference 의 경우 Key/Value 형태로 데이터를 저장할 수 있는 데이터 구조로

내부적으로는 XML 파일로 저장이 된다.

 

flutter에서 이를 어떻게 사용해야 하는지 알아보자.

플러터의 경우 아래에 패키지를 통해 SharedPreference를 사용할 수 있다.

 

https://pub.dev/packages/shared_preferences

 

shared_preferences | Flutter Package

Flutter plugin for reading and writing simple key-value pairs. Wraps NSUserDefaults on iOS and SharedPreferences on Android.

pub.dev

 

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Shared preferences demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHomePage(title: 'Shared preferences demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  _MyHomePageState createState() {
    return _MyHomePageState();
  }
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  SharedPreferences _prefs;

  @override
  void initState() {
    super.initState();
    _loadCounter();
  }

  _loadCounter() async {
    // SharedPreferences의 인스턴스를 필드에 저장
    _prefs = await SharedPreferences.getInstance();
    setState(() {
      // SharedPreferences에 counter로 저장된 값을 읽어 필드에 저장. 없을 경우 0으로 대입
      _counter = (_prefs.getInt('counter') ?? 0);
    });
  }

  _incrementCounter() async {
    setState(() {
      // 카운터 값을 1 증가
      _counter = (_prefs.getInt('counter') ?? 0) + 1;
      // 카운터 최신 값을 SharedPreferences에 counter라는 이름으로 저장
      _prefs.setInt('counter', _counter);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('You have pushed the button this many times:'),
            Text(
              // 카운터 값을 설정
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        // 버튼을 누를 때 마다 _incrementCounter 메소드 호출
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

 

intState()를 통해 앱이 실행 될 시 asynchronous 로 _loadCounter() 를 실행한다.

해당 매소드는 기기 내부 장치에 데이터가 있는지 확인한 뒤, 있으면 불러오고 없으면

변수 _counter에 0을 넣어준다.

 

이후 버튼을 누르면 실행되는 _incrementCounter() 메소드 또한 이를 비동기적으로

sharedPreferece를 통해 기기에 저장한다.

 

간단하쥬~?

 

 

 

 

'프로그래밍 > Flutter' 카테고리의 다른 글

Flutter 안드로이드에서 scrollview 반짝임(glow) 제거  (0) 2020.11.04
Flutter SNS Login Package  (0) 2020.08.24
Cupertino ActionSheet  (0) 2020.04.05
image shake animation  (0) 2020.04.04
flutter_staggered_grid_view  (0) 2020.03.15

 

SQL 기본 명령 1

사용자의 모든 테이블 보기 SELECT * FROM tab;

-scott 사용자 대표 테이블 : DEPT, EMP, SALGRADE, BONUS

 

테이블 구조 보기 DESC 테이블명

 

NULL 데이터

  • 0(zero)도 아니고, 빈 공백도 아니

  • 미확정(해당 사항 없음), 알 수 없는(unknown) 값을 의미

  • 연산, 할당, 비교가 불가능 (연산을 할 경우 결과는 null값)

 

별칭(alias)

-쿼리문의 결과가 출력될 때, 컬럼의 이름이 지정한 컬럼명의 대문자로 출력됨

 (연산 후의 결과 컬럼명이 보기에 좋지는 않음)

 ① 컬럼명 as 별칭

 ② 컬럼명 별칭

 ③ 컬럼명 “별칭” //별칭에 공백이나 특수문자, 대소문자 구별을 사용

 

연산식 별칭 처리 시

SELECT empno “사 번”, ename “사 원 명” , sal*12 “연봉” FROM emp;

 

|| 연결 연산자(concatenate)

  • 기존 컬럼값에 문자열을 추가하여 연결하기 위한 연산자

 

중복되는 컬럼을 한 번씩만 보여주기 위한 DISTINCT 키워드

  • 중복된 값은 제외하고 한 개 값만 출력

SELECT DISTINCT deptno FROM emp;



SQL 기본 명령 2 - (1)

where 조건절 : 조건을 이용하여 특정 레코드를 조회하기 위한 절

  • 실무에서 테이블의 모든 테이터를 검색하는 일은 거의 없음.

  • 많은 데이터 중에서 필요한 데이터만 검색하는 경우가 대부분임.

 

비교연산자

-where 절에는 하나 또는 그 이상의 조건을 설정할 수 있음

-조건에 사용하는 비교연산자

=(같다), >(크다), <(작다), >=크거나 같다, <=작거나 같다, <>(같지않다)

 

특정 데이터 추출 : 숫자 비교

-부서번호가 10번인 사원만 출력 SLECT *FROM emp WHERE deptno = 10;

 

-급여가 2000이상인 사원의 사번, 이름, 급여를 출력

 SELECT empno, ename, sal FROM emp WHERE sal >= 2000;

특정 데이터 추출 : 문자열 비교

-문자열은 단일 따옴표 안에 표시함 : ‘문자열’

 

-FORD 사원의 사번, 이름, 급여 출력

 SELECT empno, ename, sal FROM emp WHERE ename = ‘FORD’;

 SELECT empno, ename, sal FROM emp WHERE ename = ‘Ford’; 

 

፠비교값은 대소문자를 구별한다는 것에 주의!

 

특정 데이터 추출 : 날짜 데이터 비교

-날짜 데이터는 단일 따옴표 안에 표시함 : ‘yyyy/mm/dd’

 

-1982년 1월 1일 이후에 입사한 사원의 이름, 입사일자 출력

SELECT ename, hiredate FROM emp WHERE hiredate >= ‘1982/01/01’;

 

LIKE 연산자

-WHERE ename = ‘홍길동’

 : 정확히 사원이름이 홍길동인 사원만 검색

 

(Q) 성이 홍씨인 사원만 출력

  • WHERE ename = ‘홍’

  : 정확히 사원이름이 홍인 사원을 검색

 

-와일드 문자

% : 0개 이상의 문자열 대체

밑줄문자(_) : 단 1개 문자 대체

 

예시) 사원이름이 J로 시작 : ‘J%’

         사원이름에 A를 포함 : ‘%A%’

         사원이름 두 번째 문제가 A : ‘_A%’

 

-와일드 문자 비교 : LIKE 연산자

컬럼명 LIKE 와일드문자열(pattern)

 

-이름이 J로 시작하는 사원의 사번, 이름 출력

SELECT empno, ename, FROM emp WHERE ename LIKE ‘J%’;

 

-이름에 A를 포함하는 사원의 사번, 이름 출력

SELECT empno, ename FROM emp WHERE ename LIKE ‘%A%’;

 

-이름이 N으로 끝나는 사원의 사번, 이름 출력

SELECT empno, ename FROM emp WHERE ename LIKE ‘%N’;

 

-이름의 두 번째 문자가 A인 사원의 사번, 이름 출력

SELECT empno, ename FROM emp WHERE ename LIKE ‘_A%’;



SQL 기본 명령 2 - (2), (3)

 

 IN 연산자

  • 여러 개의 값 중에서 일치하는 것이 있으면 조건에 맞는 것으로 함

  • 논리연산자 OR 대신 사용 가능, 날짜와 문자열 비교도 가능

 

부서번호가 10, 20인 사원의 사번, 이름, 부서번호 출력

SELECT empno, ename, deptno FROM emp WHERE deptno IN (10, 20);

 

BETWEEN A AND B 연산자

  • A에서 B까지의 특정 범위 값을 조회하는 연산

  • 논리연산자 AND 대신 사용 가능

 

급여가 2000에서 4000 사이인 사원의 사번, 이름, 급여 출력

SELECT empno, ename, sal FROM emp WHERE sal BETWEEN 2000 AND 4000;

 

논리 연산자 : AND, OR, NOT

  • WHERE 절에 조건이 두 개 이상일 경우 : AND, OR

  AND : 두 조건을 모두 만족해야 검색 (조건1 AND 조건2)

  OR : 두 조건 중에서 한 가지만 만족하면 검색 (조건1 OR 조건2)

 

  • WHERE 절의 조건에 해당하지 않을 경우 검색 : NOT

  NOT 조건

 

AND

급여가 2000에서 4000 사이인 사원의 사번, 이름, 급여 출력

SELECT empno, ename, sal FROM emp WHERE sal >=2000 AND sal <= 4000;

 

OR

직급이 CLERK(사무원)이거나, 부서번호가 10번인 사원의 사번, 이름, 직급, 부서번호 출력

SELECT empno, ename, job, deptno FROM emp WHERE job = ‘CLERK’ OR deptno = 10;

 

፠OR과 IN은 경우에 따라 대체하여 사용 가능.

 

NOT

부서번호가 20번이 아닌 사원의 사번, 이름, 부서번호 출력

SELECT empno, ename, deptno FROM emp WHERE NOT depno = 20;

 

NOT IN 연산

부서번호가 10, 20번이 아닌 사원의 사번, 이름, 부서번호 출력

SELECT empno, ename, deptno FROM emp WHERE deptno NOT IN (10,20);



NOT LIKE 연산

이름에 A를 포함하지 않는 사원의 사번, 이름, 부서번호 출력

SELECT empno, ename, deptno FROM emp WHERE ename NOT LIKE ‘%A%’;

 

NOT BETWEEN A AND B 연산

급여가 1000에서 3500 사이에 포함되지 않는 사원의 사번, 이름, 급여 출력

SELECT empno, ename, sal FROM emp WHERE sal NOT BETWEEN 1000 AND 3500;

 

IS NULL, IS NOT NULL

  • 컬럼값이 NULL인지, 아닌지를 비교하는 연산자

  • 관리자(mgr)가 없는(NULL) 사원의 사번, 이름, 관리자 출력

SELECT empno, ename, mgr FROM emp WHERE mgr IS NULL;

 

፠NULL 값은 = 연산자가 아니라 IS NULL 연산자를 사용해야만 비교가 가능.

 

수당을 받는 모든 사원 출력

SELECT empno, ename, comm FROM emp WHERE comm IS NOT NULL;



ORDER BY 절

  • 쿼리 결과의 순서를 다시 정렬하기 위해 사용하는 절

 

SELECT *|컬럼명 FROM 테이블명 WHERE 조건절 ORDER BY 기준컬럼명 [ASC | DESC];

 

기준 컬럼명 : 정렬하기 위한 기준 컬러명

(동일 값을 처리하기 위하여 여러 컬럼을 작성할 수 있음)
ASC : 오름차순(생략가능, default값)

DESC : 내림차순

 

ORDER BY 절 : 숫자 정렬

  • 사원의 사번, 이름, 급여를 출력(급여기준 오름차순)

SELECT empno, ename, sal FROM emp ORDER BY sal; #default 값으로 오름차순

            SELECT empno, ename, sal FROM emp ORDER BY sal DESC; #내림차수

 

ORDER BY 절 : 문자열 정렬

  • 사원의 사번, 이름, 급여를 출력(이름기준 오름차순)

SELECT empno, ename, sal FROM emp ORDER BY ename;

 

ORDER BY 절 : 날짜 정렬

  • 사원의 사번, 이름, 입사일을 출력(입사일이 가장 최근인 사원 순)

SELECT empno, ename, hiredate FROM emp ORDER BY hiredate DESC;

 

ORDER BY 절 : 여러 컬럼값 정렬

  • 사원의 사번, 급여, 이름 출력

(급여기준 내림차순, 급여가 같으면 이름기준 오름차순)

SELECT empno, sla, ename FROM emp ORDER BY sal DESC, ename ASC;

SQL 주요함수 1 - 숫자함수

DUAL 테이블

: SELECT 절에 기술할 테이블이 없을 경우 사용하는 Dummy Table

 

언제 사용할까?

-(Q) 간혹, 상황에 따라 쿼리 작업에서 연산식만 사용하는 경우가 있다.

예를 들어, 10+30 결과를 구하기 위하여 쿼리를 작성한다면?

-SQL > SELECT 10+30 FROM ??????;

 

(?) 10 + 30 연산은 테이블 없다.

-> 실행되려면 테이블이 있어야 한다.

 

ROUND(반올림) 함수

: 지정한 자리 수 이하에서 반올림한 결과를 구해주는 함수

형식 : ROUND(숫자, n) n : 반올림 자릿수

반올림자리

반올림 방법

  • 반올림자리(n)가 0 또는 양수이면, n+1 위치에서 반올림

  • 반올림자리(n)가 음수이면, n위치에서 반올림

 

소수점 이하 두번째 자리에서 반올림

SELECT ROUND(46.593, 2) FROM DUAL; 결과 46.59

 

-1은 일의 자리에서 반올림

SELECT ROUND(46.593, -1) FROM DUAL; 결과 50

 

TRUNC(버림) 함수

: 지정한 자리 수 이하에서 버린 결과를 구해주는 함수

형식 : TRUNC(숫자, n) n : 버림 자릿수

버림자리

버림 방법

  • 버림자리(n)가 0 또는 양수이면, n+1 위치에서 버림

  • 버림자리(n)가 음수이면, n 위치에서 버림

 

소수점 이하 두 번째 자리에서 버림

SELECT TRUNC(46.593, 2) FROM DUAL; 결과 46.59

 

-1은 일의 자리에서 버림

SELECT TRUNC(46.593, -1) FROM DUAL; 결과 40



MOD(나머지) 함수

: 나누기 연산을 한 후에 구한 나머지를 결과로 돌려주는 함수

형식 : MOD(컬럼| 숫자, 나누기값)

 

10번 부서 사원의 급여를 100으로 나눈 나머지 출력

SELECT MOD(sal, 100) FROM emp WHERE deptno = 10;



SQL 주요함수 2 - 문자함수

UPPER(대문자), LOWER(소문자) 함수

: 소문자는 대문자로, 대문자는 소문자로 변환하여 출력하는 함수

 

20번 부서 사원의 모든 이름을 모두 소문자로 변경하여 출력하는 쿼리를 작성하시오.

SELECT LOWER(ename) FROM emp WHERE deptno = 20;

 

INITCAP 함수

: 단어의 첫글자를 대문자로 변환하여 출력하는 함수

 

사원 이름의 첫 글자를 대문자로 출력하는 쿼리를 작성하시오

SELECT INITCAP(ename) FROM emp;

 

LENGTH 함수

: 문자열의 길이를 구하여 출력하는 함수

 

사원 이름이 몇 글자인지 출력하는 쿼리를 작성하시오.

SELECT ename, LENGTH(ename) FROM emp;

 

INSTR 함수

: 특정 컬럼 또는 문자열에서 지정 문자의 위치를 반환하는 함수

형식 : INSTR(컬럼|문자열, [검색할 시작위치], [검색문자 순서])

 

-SQL>SELECT INSTR(‘welcome to oracle’, ‘o’) FROM DUAL; 결과 5

           SELECT INSTR(‘welcome to oracle’, ‘o’, 6) FROM DUAL; 결과 10

           SELECT INSTR(‘welcome to oracle’, ‘o’, 3, 3) FROM DUAL; 결과 12

 

SUBSTR 함수

: 특정 컬럼 또는 문자열에서 지정한 일부분을 추출하여 반환하는 함수

형식 : SUBSTR(컬럼|문자열,m,[n]) //m : 시작워치, n : 추출문자개수

*n이 생략되면 m 위치에서 문자열 끝까지 추출

 

SQL>SELECT SUBSTR(‘welcome to oracle’, 4, 3) FROM DUAL; 결과 com

          SELECT SUBSTR(‘welcome to oracle’, 10) FROM DUAL; 결과  oracle




LPAD, RPAD 함수

: 오른쪽(왼쪽) 정렬 후, 지정 문자를 왼쪽(오른쪽)에 채우는 함수

형식 : LPAD(컬럼|문자열, m, ‘c’), RPAD(컬럼|문자열,m, ‘c’)

       m: 자리수, c: 채울문자

 

SELECT LPAD(‘oracle’,10,’*’), RPAD(‘oracle’,10,’*’) FROM DUAL:

                         ****oracle                 oracle****

 

LTRIM, RTRIM 함수

: 왼쪽(오른쪽) 지정 문자가 연속이면 지정 문자를 삭제하는 함수

형식 : LTRIM(컬럼|문자열, ‘c’), RTRIM(컬럼|문자열, ‘c’) c: 삭제문자

 

SELECT LTRIM(‘****oracle’, ‘*’), RTRIM(‘oracle****’,’*’) FROM DUAL;

                            oracle                             oracle

 

TRIM 함수

: 양쪽에 지정 문자가 연속이면 지정 문자를 삭제하는 함수

형식 : TRIM(‘c’ from 컬럼|문자열)

 

SELECT TRIM(‘*’ from ‘***oracle****’) FROM DUAL;

결과 : oracle




SQL 주요함수 3 - 날짜함수

날짜 함수
: 날짜 데이터형에 사용, 대부분 일 단위로 계산(기본표현 : 년/월/일)

 

SYSDATE 함수

: 시스템에 저장된 현재 날짜와 시간을 반환하는 함수

 

SELECT SYSDATE FROM DUAL; 기본적으로 날짜만 출력하고 시간은 표시되지 않음.

 

날짜 연산

: 날짜 형 데이터에도 더하기나 빼기와 같은 연산이 가능함

 

SYSDATE+1(내일 날짜), SYSDATE-1(어제 날짜)

SELECT SYSDATE+1, SYSDATE -1 FROM DUAL;

 

날짜 연산

  • 20번 부서 사원들의 현재까지 근무 일수를 출력하는 쿼리를 작성하시오.

SELECT ename, hiredate, SYSDATE-hiredate FROM emp WHERE deptno = 20;

 

፠ 날짜타입에는 연월일뿐만 아니라, 시분초까지도 저장되어 있음. 소수점 이하의 숫자는 하루가 되지 못한 시간을 의미.

MONTHS_BETWEEN 함수

: 날짜와 날짜 사이의 개월 수를 구하는 함수

형식 : MONTHS_BETWEEN(최근날짜, 이전 날짜)

 

  • 20번 부서 사원들의 현재까지 근무 개월수를 출력하는 쿼리를 작성하시오.

  • SELECT ename, hiredate, MONTHS_BETWEEN(SYSDATE, hiredate) FROM emp WHERE deptno = 20;

 

ADD_MONTHS 함수

: 지정한 개월 수를 더한 날짜를 구하는 함수

형식 : ADD_MONTHS(날짜, 더할 개월수)

 

  • 20번 부원 사원들의 입사일자에서 6개월 후 일자를 구하는 쿼리를 작성하시오.

  • SELECT hiredate, ADD_MONTHS(hiredate, 6) FROM emp WHERE deptno = 20;

 

LAST_DAY 함수

: 해달 날짜가 속한 달의 마지막 날짜를 반환하는 함수

형식 : LAST_DAY(날짜)

 

  • 20번 부서 사원들의 입사한 달의 마지막 날을 구하는 쿼리를 작성하시오

SELECT hiredate, LAST_DAY(hiredate) FROM emp WHERE deptno = 20;

 

NEXT_DAY 함수

: 해당 날짜를 기준으로 명시된 요일에 해당되는 날짜를 반환하는 함수

형식 : NEXT_DAY(날짜, 요일)

  • 현재 날짜를 기준으로 최초로 돌아오는 월요일 날짜를 구하는 쿼리를 작성하시오.

SELECT NEXT_DAY(SYSDATE, ‘월’) FROM DUAL;

 

SQL 주요함수 4 - 형변환함수

형 변환 함수

: 숫자, 문자, 날짜의 데이터 형을 변환해야 하는 경우에 사용하는 함수

 

TO_NUMBER : 문자 데이터 -> 숫자 데이터

TO_CHAR : 숫자 데이터 -> 문자 데이터

TO_DATE : 문자 데이터 -> 날짜 데이터

 

TO_DATE 함수 : 문자 -> 날짜

  • 날짜형은 날짜(년월일)와 시간(시분초)에 대한 정보를 저장

  • 오라클 기본 날짜 형식 : YY/MM/DD

형식 : TO_DATE(‘날짜표현문자열’, 날짜_시간포맷)

 

 

TO_DATE 함수 : 문자 -> 날짜

  • ‘2020-01-20’ 날짜형식으로 표현된 문자 데이터를, 날짜 데이터(20/01/20)로 출력하는 쿼리를 작성하시오

SELECT TO_DATE(‘2020-01-20’, ‘YYYY/MM/DD’) FROM DUAL;

 

TO_CHAR 함수

형식 : TO_CHAR(숫자|날짜, 형별포맷)

 

 

  • 현재 날짜와 시간을 출력하는 쿼리를 작성하시오.

SELECT TO_CHAR(SYSDATE, ‘YYYY/MM/DD, HH24:MI:SS’), FROM DUAL;

 

TO_CHAR 함수 : 숫자 -> 문자

  • 20번 부서의 사원 급여를 6자리로 바꾸고, 앞에 $ 또는 지역통화를 붙여 출력하느 쿼리를 작성하시오.(예 : $2,200, \2,200)

SELECT ename, TO_CHAR(sal,’$999,999’), TO_CHAR(sal,’L999,999’) FROM emp WHERE deptno = 20;

TO_NUMBER 함수 : 문자 -> 숫자

  • 숫자형식으로 표현된 문자열을 숫자로 변환

형식 : TO_NUMBER(‘문자숫자’)

SELECT TO_NUMBER(‘123’), TO_NUMBER(‘12.3’) FROM DUAL;

 

 

 

벡엔드 담당자와 협업중 자바에서 php서버로 Multipart post를 필요로 하였다.

아래의 클래스를 사용하였으며, 라이브러리는

com.google.guava_1.6.0.jar
0.91MB

구아바?

구아바!

 

 

 

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


import com.google.common.base.Strings;
import com.google.common.io.CharStreams;

public class MultipartUploader {

    private static final String CHARSET = "UTF-8";

    private static final String CRLF = "\r\n";

    public String httpUpload(String url, String filename, byte[] byteStream)
        throws MalformedURLException, IOException {

        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        final String boundary = Strings.repeat("-", 15) + Long.toHexString(System.currentTimeMillis());

        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("Cache-Control", "no-cache");
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

        OutputStream directOutput = connection.getOutputStream();
        PrintWriter body = new PrintWriter(new OutputStreamWriter(directOutput, CHARSET), true);

        body.append(CRLF);
        addSimpleFormData("가나다라", "atㅋㅋㅋㅇㅇtach1", body, boundary); //텍스트 파라미터
        addSimpleFormData("마바사", "6ㄴㅇㅁ", body, boundary); //텍스트 파라미터
        addFileData("attach", filename, byteStream, body, directOutput, boundary);
        addCloseDelimiter(body, boundary);

        int responseCode = connection.getResponseCode();
        String responseMessage = connection.getResponseMessage();
       
        String payload = CharStreams.toString(new InputStreamReader(connection.getInputStream()));
        return payload;
    }
    
    private static void addSimpleFormData(String paramName, String wert, PrintWriter body,
            final String boundary) {

body.append("--").append(boundary).append(CRLF);
body.append("Content-Disposition: form-data; name=\"" + paramName + "\"").append(CRLF);
body.append("Content-Type: text/plain; charset=" + CHARSET).append(CRLF);
body.append(CRLF);
body.append(wert).append(CRLF);
body.flush();
}

private static void addFileData(String paramName, String filename, byte[] byteStream, PrintWriter body,
      OutputStream directOutput, final String boundary) throws IOException {

body.append("--").append(boundary).append(CRLF);
body.append("Content-Disposition: form-data; name=\"" + paramName + "\"; filename=\"" + filename + "\"")
.append(CRLF);
body.append("Content-Type: application/octed-stream").append(CRLF);
body.append("Content-Transfer-Encoding: binary").append(CRLF);
body.append(CRLF);
body.flush();

directOutput.write(byteStream);
directOutput.flush();

body.append(CRLF);
body.flush();
}

private static void addCloseDelimiter(PrintWriter body, final String boundary) {
body.append("--").append(boundary).append("--").append(CRLF);
body.flush();
}
    
}

 

위의 파라미터 중 byteStream은 

 

  public static byte[] fileToBinary(File file) {
	    String out = new String();
	    byte[] fileArray = null;
	    FileInputStream fis = null;
	    ByteArrayOutputStream baos = new ByteArrayOutputStream();
	 
	    try {
	        fis = new FileInputStream(file);
	    } catch (FileNotFoundException e) {
	        System.out.println("Exception position : FileUtil - fileToString(File file)");
	    }
	 
	    int len = 0;
	    byte[] buf = new byte[1024];
	    try {
	        while ((len = fis.read(buf)) != -1) {
	            baos.write(buf, 0, len);
	        }
	 
	          fileArray = baos.toByteArray();
	       // out = new String(base64Enc(fileArray));
	 
	        fis.close();
	        baos.close();
	    } catch (IOException e) {
	        System.out.println("Exception position : FileUtil - fileToString(File file)");
	    }
	 
	    return fileArray;
	}
	 
	public static byte[] base64Enc(byte[] buffer) {
	    return Base64.encodeBase64(buffer);
	}

}

를 사용한다.

fileArray를 리턴하는데 내가 급하게 만든다고 필요없는 메서드가 있긴하다...

 

'프로그래밍 > Java & JSP' 카테고리의 다른 글

Dependency Injection 이란?  (0) 2020.09.12

+ Recent posts