반응형

프로시저의 기본형태

CREATE DEFINER=`DB아이디`@`%` PROCEDURE `프로시저명`
BEGIN

  SELECT * 
  FROM 테이블명

END

DB에 접속하는 ID명을 적어준다. 

 

 

 

인자값 파라메터 받을때

CREATE DEFINER=`DB아이디`@`%` PROCEDURE `프로시저명`(

    IN 변수명 자료형

)
BEGIN

    SELECT *
    FROM 테이블명
    WHERE 컬럼명 = 변수명

END

받을 변수명과 자료형 (INT, VARCHAR(40) 등)을 입력해준다.

받을때는 IN 을 사용

 

 

 

변수 할당하기

CREATE DEFINER=`DB아이디`@`%` PROCEDURE `프로시저명`(

    IN 변수명 자료형

)
BEGIN
    SET @v_code = '123';
    
    SELECT *
    FROM 테이블명
    WHERE 컬럼 = 변수명 AND
    	  컬럼 = @v_code

END

변수를 할당할때 바로 값을 적어도 되지만 서브쿼리를 사용하여

@v_code = (select 컬럼명 from 테이블 where 조건...)

등으로 할당 할 수 있다.

 

 

 

조건문 사용하기 IF, ELSEIF, OR, AND..

CREATE DEFINER=`DB아이디`@`%` PROCEDURE `프로시저명`(

    IN 변수명 자료형

)
BEGIN
    SET @v_code = '123';
    
    IF @v_code!='' THEN

      SELECT *
      FROM 테이블명
      WHERE 컬럼 = 변수명 AND
    	    컬럼 = @v_code
    
    END IF;

END

if 절은 

IF 조건문 OR 조건문 THEN

    실행문구

ELSE IF 조건문 THEN

    실행문구

END IF;

 

등의 형태로 쓸 수 있으며

NULL체크는 IS NOT NULL / IS NULL 을 쓸 수 있다.

같지 않음은 !=와 <> 둘다 가능

 

프로시저 생성이 안될땐 

프로시저의 상단에 DELIMITER ;; 혹은 DELIMITER $$ 를 붙여주면 된다. 

728x90
반응형

String to map

Map<String, Object> map = 
   new ObjectMapper().readValue(스트링변수, new TypeReference<Map<String, Object>>() { });

String to List map

List<Map<String, Object>> paramMap = 
   new ObjectMapper().readValue(스트링변수, new TypeReference<List<Map<String, Object>>>(){});

 

맨날 하도 헷깔려서 적어놓는다

물론 스프링일 경우 pom.xml에 json이 dependency 로 추가되어있어야 한다

 

 

728x90
반응형

프로시저 호출했는데 디버깅해보니 프로시저에 들어가지도않는 이유가 뭔지 한참고민했는데

프로시저에 써준 변수선언 순서가 중요했다;;;;

변수a   자료형,

변수b   자료형

 

이렇게 써줬었는데 

알고보니 변수b가 앞에 와야했던것.... 너무함 ㅠㅠㅠㅠㅠㅠ 이걸로 30분 헤맸다.

 //controller 로 가기전 js 
 
 var paramString = {
                'title':$('#title').val(),
                'content':$('#content').val()
            };
 var url = '/request/deleteContent.do';
            ajaxRequest(url,{ "paramString" : JSON.stringify(paramString)}, function (result) {
                if (result['isSuccess']) location.replace('/request/contentList.do');
                alert(result['message']);
            });
            
//해당 매퍼
    @Delete("CALL CONTENT_DELETE("+
            "#{title, mode=IN, jdbcType=INTEGER, javaType=String}"+
            ",#{content, mode=IN, jdbcType=INTEGER, javaType=String}"+
            ")")
    @Options(statementType = StatementType.CALLABLE)
    void deleteServiceReqFile(Map<String, Object> paramMap);
    
//해당 프로시저 

create PROCEDURE         "CONTENT_DELETE"
(
    /*IN*/
    TITLE                DB명.TITLE_NO%TYPE,
    CONTENT              DB명.CONTENT_NO%TYPE
)
    IS
BEGIN
        DELETE FROM DB명
        WHERE TITLE_NO=TITLE
          AND CONTENT_NO=CONTENT;

EXCEPTION
    WHEN NO_DATA_FOUND THEN
        NULL;
    WHEN OTHERS THEN
        RAISE;
END CONTENT_DELETE;
/

이런식으로 
컨트롤러 부를때 보내는 파라메터 순서 & 매퍼에 기입하는 변수 순서 & 프로시저에 기입한 변수 순서 세가지가 다 맞아야한다.

매퍼는 틀려도되나? 정확히 어디까지가 맞아야하는지모르겠는데 확실한건 프로시저는 변수 순서를 바꿔쓰면 인식을 못한다는점이다 ㅠㅠ

 

또한 무결성제약조건 에러

 

이런식의 창이 뜨는데 어떤자식이 있는지 모를경우 빨간줄 부분을 보면 그 자식의 key 를 상냥하게 설명해준다.

그것도모르고 자식 찾는법 고민하고있었다 흑흑

728x90
반응형

인텔리제이에서 DB를 사용하기에 앞서 JDBC 설정을 비롯한 여러가지가 있겠지만

그게 다 되어있다고 가정한 다음에 쿼리문작성이나 VIEW, PROCEDURE 를 보는 방법

 

1.DB 종류선택

 

+를 눌러서 db종류를 선택할수있다.

 

 

연결을 하고나면 아래와같이 나오는데, ip정보는 숨기겠음!

 

 

2.테이블 / 뷰 / 프로시저 등 확인하는 방법

 

tables 에서 테이블 확인, views 에서 view 확인, routines 에서 프로시저  확인 가능하다.

이걸몰라가지고 애먹었다..바보임

프로젝트검색과 마찬가지로 프로시저나 테이블명은 오른쪽의 오라클영역을 클릭해주고 키보드를 치면 즉시 검색가능하므로 시간들이지말고 바로바로 찾아갈것!

 

3. 새 쿼리 생성

테이블명 > 우클릭 > NEW > 콘솔 클릭! SQL문 쓸수있다.

 

아니면 그냥 

상단의 아이콘을 누르면 된다 (2019.07.10)

728x90
반응형

웹개발할때 크롬캐시 자꾸 삭제하기 귀찮으니 이거하나 깔아놓고 ON 시키면 자동캐시삭제된다.

 

짱편함

728x90
반응형
$('#id').find("span");

$('#id').find('#id2').val();

첫번째 요소의 하위 요소중 특정 요소 즉 태그값, 아이디 클래스 를 찾는 메서드.

그렇게 찾은 요소는 .val, .css .attr.... 등으로 활용할수있다.

728x90
반응형

인텔리제이를 처음 이용하는데 svn 연동에 애를 먹었기에 나같은 실수를 하지않도록 바라는 마음에 포스팅을 작성한다.

 

 

svn 연동 순서 

VCS > Browse VCS Repository > Brows Subversion Repository > 왼쪽 하단부에 + 마크 클릭 > svn주소 복붙

 

이렇게 간단한 순서인데

Cannot run program "svn" : CreateProcess error=2, 지정된 파일을 찾을 수 없습니다

라는 에러메세지가 뜨는것... 뒤늦게 이클립스처럼 일단 플러그인을 받아볼까 해서 

 

SVN Disconnect 를 받았는데 다른사람은 되는지모르겠지만.. 나는 안됐다.
(2019.07.03 _ 알고보니 인텔리제이 버전차이였다. 2018.3 버전 이후부터는 별도 svn을 다운받아야한다고 한다)

 

그래서

 

https://www.visualsvn.com/downloads/

 

VisualSVN | All Downloads

 

www.visualsvn.com

 

이곳에서 별도 svn을 다운받았다.

 

해당 페이지의 첫번째 다운로드를 클릭.

 

(참고로 나는 java, tomcat 등의 툴을 저장할때 D 드라이브에 developTools 라는 폴더를 만들어서

그곳에서 일괄 관리하고있다. c에 저장하면 user\user\programFiles... 이렇게 더럽게 되기때문.)

 

인텔리제이에 다시 들어가서 svn 링크 적어넣고 새로고침을 누르거나 껏다켜봐도 여전히 안된다.

특히나 2019년판이라 구글링해도 정보가 너무없어서 화가 났지만 승리의 stackoverflow !!

 

https://stackoverflow.com/questions/22572861/error-cant-use-subversion-command-line-client-svn-when-opening-android-proj

 

이곳에서 힌트를 얻어, 아래의 사진과 같이 settings > Version Control > Subversion 의 첫 빈칸에

다운받은 svn.exe 의 경로를 적어넣고 새로고침 혹은 껏다키면 된다 야호!

 

728x90
반응형

프로그래머스 문제 링크 

https://programmers.co.kr/learn/courses/30/lessons/42576

 

내 스스로 푼 코드

import java.util.HashMap;
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<Integer, String> mapParticipant=new HashMap<>();
		for(int i=0; i<participant.length;i++) {
			mapParticipant.put(i, participant[i]);
		}
		
		for(int i=0; i<mapParticipant.size();i++) {
			for(int j=0; j<completion.length;j++) {
				if(mapParticipant.get(i).equals(completion[j])) {
					mapParticipant.put(i, "");
					completion[j]="";
				}
			}
		}

		for(int i=0; i<mapParticipant.size() ;i++) {
			answer+=mapParticipant.get(i);
		}
        
        return answer;
    }
}

 

굳이 mapParticipant에 null값을 넣어줘야하는게 마음에 안들었다.

 

*다른사람의 코드

import java.util.Arrays;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        String temp = "";

        Arrays.sort(participant);	//알파벳 순 정렬
        Arrays.sort(completion);

        int i = 0;

        while(i < completion.length){
            if(!completion[i].equals(participant[i])){	//도중에 다른글자발견한다면
                temp = participant[i];
                break;
            }else{
                i++;
            }
        }

        if(!temp.equals("")){	//도중에 다른글자 발견 했을때
            answer = temp;
        }else{					//끝내 다른글자 발견 못했을때
            answer = participant[participant.length-1];
        }

        return answer;
    }
}

1. Arrays.sort 를 활용하여 우선 알파벳순으로 정렬 

2. completion 만큼 돌되 중간에 다른글자 발견하면 그 글자를 temp 에 저장

3. temp가 null이 아니라면 그것을 return , null이면 participant 의 마지막 인덱스를 return .

 

Arrays.sort를처음 알았다.

먼저 정렬부터 해 주고 다른걸 발견했을때 리턴, 아니면 마지막인덱스 값을 리턴하는 방식이다.

 

 

*다른사람의 코드

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> hm = new HashMap<>();
        for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
        for (String player : completion) hm.put(player, hm.get(player) - 1);

        for (String key : hm.keySet()) {
            if (hm.get(key) != 0){
                answer = key;
            }
        }
        return answer;
    }
}

프로그래머스 정답의 가장 상위에 있는 코드이다.

 

1. map에 key : player, value : 1  이런 형식으로 넣을건데 만약 같은 이름일 경우엔 1이 아닌 다른 숫자로 해줄것인데

  map에 참가자 명단을 하나씩 넣되, value는 map.get ( player ) 를 해준다.

  왜냐하면 동명이인이 있을 수 있기 때문에 palyer를 key로 썼을때 value가 없으면 0으로 셋팅, 0+1로  value는 1

  반대로 player 를 key 로 썼을때 value가 기존에 셋팅된 1로 있을 경우 1+1 =2로 value 는 2로 셋팅된다.(동명이인)

 

2. 같은 key 값으로 put 해주면 그 value는 갱신되는 HashMap의 특성을 이용하여 completion 이름들을 put 해준다.

   value는 기존 hm.get (player)의 value - 1 을 해준다.

   이렇게 되면 동명이인을 제외한 모든 player 들의 value는 0이 된다.

 

사실 동명이인이 있을 수 있다는 조건이 없으면

foreach문으로 participant를 돌릴때 key:player, value : hm.getOrDefault 를 안해주고 value : 1 로 적어넣어도된다.

그러면 모든참가자의 value는 1이 되고  completion의 이름들과 부합하였을때 0이 되며

부합하지않은 사람만 1로 남아있기 때문이다. 

 

 

문제의 특성상 key value 의 두개 중에 이름만 보면되므로 리스트로 해도될텐데 왜 해시맵으로 하라고하는걸까

key를 이름들로 구성하고 value는 어떻게 활용해야할지 잘 몰랐었는데 동명이인을 가리기위한 용도로 활용하는 것을 보고 갈길이 멀다고 생각했다.

728x90
반응형

보통 스트링 문자열을 비교할때 .equals를 쓰는데 

 

.equalsIgnoreCase();

요런 녀석도 있다.

얜 대소문자를 구분하지않는다.

String str1 = "app";
String str2 = "APP";

"app".equalsIgnoreCase(str2) //같음
"APP".equalsIgnoreCase(str1) //같음

"app".equals(str2); //다름
"APP".equals(str1); //다름

 

 

728x90
반응형

timer보다 강력한 시간제어가 가능한것이 Scheduler 라이브러리이다.

일정시간 후 주기적으로 작업을 실행시켜주며 

스프링에선 @Scheduled 로 호출하고 자바에서는 ScheduledExecutorService로 사용할 수 있다.

 

728x90

'과거 게시글' 카테고리의 다른 글

[프로그래머스] 해시 _ 완주하지못한 선수  (0) 2019.05.10
String 문자열 비교 (.equalsIgnoreCase())  (0) 2019.04.12
Mustache  (0) 2019.04.08
Native App? Mobile app? Hybrid App?  (0) 2019.04.08
RequireJS  (0) 2019.04.08

+ Recent posts