728x90

친구가 요청한 코딩 풀이

 

문제

#include <stdio.h>

int recursive(int n)
{
	int i;
    if (n < 1)
    	return 2;
    else 
    {
    	i = (2*recursive(n-1)) + 1;
        printf("%d\n", i);
        return i;
    }
}

int main()
{
	int i;
    printf("숫자를 입력하시오 : ");
    scanf("%d", &i);
    recursive(i);
}

/* Q. 위 값에 5를 입력한 경우 출력 되는 값을 확인 하시오 */

 

 

풀이

int recursive(5)
{
    int i;
    if (5 < 1)
    {
        return 2;
    }
    else
    {
        i = (2 * recursive(5-1)) + 1;

        /* 위의 recursive(4)로 호출 START */
        int recursive(4)
        {
            int i;
            if (4 < 1)
            {
                return 2;
            }
            else
            {
                i = (2 * recursive(4-1)) + 1;

                /* 위의 recursive(3)로 호출 START */
                int recursive(3)
                {
                    int i;
                    if (3 < 1)
                    {
                        return 2;
                    }
                    else
                    {
                        i = (2 * recursive(3-1)) + 1;

                        /* 위의 recursive(2)로 호출 START */
                        int recursive(2)
                        {
                            int i;
                            if (2 < 1)
                            {
                                return 2;
                            }
                            else
                            {
                                i = (2 * recursive(2-1)) + 1;

                                /* 위의 recursive(1)로 호출 START */
                                nt recursive(1)
                                {
                                    int i;
                                    if (1 < 1)
                                    {
                                        return 2;
                                    }
                                    else
                                    {
                                        i = (2 * recursive(1-1)) + 1;

                                        /* 위의 recursive(0)로 호출 START */
                                        int recursive(0)
                                        {
                                            int i;
                                            if (0 < 1)
                                            {
                                                /* 이 로직을 타고 recursive(0)의 리턴 값 2 */
                                                return 2;
                                            }
                                            else
                                            {
                                                /* 타지 않는 로직 */
                                                i = (2 * recursive(0-1)) + 1;
                                                printf("%dwn", i);	
                                                return i;
                                            }
                                        }
                                        /* 위의 recursive(0)로 호출 END */

                                        /*
                                            recursive(0) 의 리턴값 2이므로 
                                            i = (2 * 2) + 1
                                            i = 5
                                        */
                                        printf("%dwn", i);	// i 값 5출력
                                        return i;           // recursive(1)의 리턴 값은 5
                                    }
                                }
                                /* 위의 recursive(1)로 호출 END */

                                /*
                                    recursive(1) 의 리턴값 5이므로 
                                    i = (2 * 5) + 1
                                    i = 11
                                */
                                printf("%dwn", i);	// i 값 11출력
                                return i;           // recursive(2)의 리턴 값은 11
                            }
                        }
                        /* 위의 recursive(2)로 호출 END */

                        /*
                            recursive(2) 의 리턴값 11이므로 
                            i = (2 * 11) + 1
                            i = 23
                        */
                        printf("%dwn", i);  // i 값 23출력
                        return i;           // recursive(3)의 리턴 값은 23
                    }
                }
                /* 위의 recursive(3)로 호출 END */

                /*
                    recursive(3) 의 리턴값 23이므로 
                    i = (2 * 23) + 1
                    i = 47
                */
                printf("%dwn", i);  // i 값 47출력	
                return i;           // recursive(4)의 리턴 값은 47
            }
        }
        /* 위의 recursive(4)로 호출 END */

        /*
            recursive(4) 의 리턴값 47이므로 
            i = (2 * 47) + 1
            i = 95
        */
        printf("%dwn", i);  // i 값 95출력	
        return i;           // recursive(5)의 리턴 값은 95
    }
}
728x90

'개발및업무 > 기타용어정리' 카테고리의 다른 글

Document Object Model(DOM)  (0) 2012.06.29
윈폼과 웹폼의 차이  (0) 2011.11.01
익스트림 프로그래밍(XP) 규칙  (0) 2011.06.28
인자 매개변수 차이  (0) 2011.06.28
728x90

MS-SQL과 ORACLE 함수 조회 방법

 

MS-SQL 함수 조회 방법

SELECT 함수명(변수1, 변수2)

 

ORACLE 함수 조회 방법

SELECT 함수명(변수1, 변수2)
FROM DUAL	-- FROM DUAL 구문 반드시 붙여줘야 함

 

MS-SQL은 SELECT 절에 컬럼 추가로 끝나고,

ORACLE의 경우에는 SELECT 절에 컬럼 추가 후 "FROM DUAL"이 반드시 붙어야 한다. 

 

ORACLE에서 MS-SQL 처럼 함수 호출하는 경우 

"SQL Error [923] [42000]: ORA-00923: FROM 키워드가 필요한 위치에 없습니다." 과 같이 오류가 나온다. 

 

반대로 MS-SQL에서 ORACLE 처럼 함수 호출하는 경우

"메시지 208, 수준 16, 상태 1, 줄 2
개체 이름 'DUAL'이(가) 잘못되었습니다."

라는 오류 메세지가 나온다.

 

728x90
728x90

오라클과 MS-SQL에서 백업 테이블을 생성하기 위한 간단한 구문

 

1. 오라클

CREATE TABLE 생성할백업테이블명 AS 
SELECT *
FROM 원데이트테이블명

 

2. MS-SQL

SELECT *
INTO 생성할백업테이블명
FROM 원데이트테이블명

 

MS-SQL에서 생성하던 백업테이블 생성구문이 오라클에서는 적용되지 않았다.

복잡한 구문은 아니지만 쓰지 않다보면 잊어버릴 수 있기 때문에 기록해 놓는다. 

MS-SQL의 경우 임시테이블 생성해서 프로시져 내에서 계산 하는 경우에 사용해도 편하게 사용할 수 있다. 

 

2-1. MS-SQL 임시테이블 생성

SELECT *
INTO #임시테이블
FROM 원테이블
WHERE 1=1

 

 

728x90
728x90

 

10년 넘게 MS-SQL만 사용하다가 최근에 Oracle을 사용해야하는 상황이 됐다. 

간단한 구문 차이부터 MS-SQL에 길들여진 나는 Oracle 사용에 어려움이 많은 상태인데 그 중에 제일 어려운게 JOIN해서 UPDATE, DELETE 하는 방법이다. 

 

MS-SQL 경우 JOIN 을 응용하여 UPDATE 를 간편하게 사용할 수 있다. 

UPDATE A
SET A.UPDATEDATE = 'Change Value'
FROM A 
INNER JOIN B 
	ON (A.PK = B.PK)

 

Oracle은 아래와 같이 사용해야한다. 

UPDATE (SELECT UPDATEDATE
		FROM A
        INNER JOIN B
        	ON (A.PK = B.PK)
SET A.UPDATEDATE = 'Change Value'

워낙 간단한 구문이라 별 차이 없어보이지만 JOIN이 많아지면 생각보다 아직 적응이 안돼서 그런지 복잡하게 느껴진다.

MS-SQL의 경우 SELECT 구문을 가지고 편하게 작업할 수 있었는데 Oracle은 별도로 작업을 해야하는게 ㅠㅠ

그리고 Oracle의 경우 UPDATE 안의 SELECT 구문의 반드시 키가 연결 되어야 했다. (찾아본 정보는 아니고 작업 중에 키 없이 임시테이블 만들어서 업데이트 하려고 했더니 안 됐다. )

 

MS-SQL의 경우 DELETE도 같은 방식으로 하면 된다. 

DELETE A
FROM A
INNER JOIN B
	ON (B.PK = A.PK)
WHERE B.DELETEDATE = 'DELETE VALUE'

위와 같이 구문을 사용하면 B테이블과 조인 된 A 테이블 데이터만 지워진다. 

 

728x90
728x90

DB LOCK이 걸려 KILL 을 한 이후에 실제 프로세스가 죽지 않고 상태가 "KILLED/ROLLBACK"으로 남아 있는 경우에 대한 포스트 중 괜찮은 내용이 존재해서 가져왔다.

 

참고 URL : https://blog.sqlauthority.com/2015/08/31/sql-server-spid-is-killedrollback-state-what-to-do-next/

 

SQL SERVER – SPID is KILLED/ROLLBACK state. What to Do Next? - SQL Authority with Pinal Dave

I always recall my fun days after talking to my friends and blog readers. Recently killed/rollback discussion came back when my close DBA friend called me for help. Our discussion was worth blogging.

blog.sqlauthority.com

 

 

 

프로세스가 죽지 않고 계속 위의 상태로 남아 있는 경우

 

1. 롤백이 완료 될 때까지 기다린다. 단, SPID는 CPU, 메모리, IO 열의 크기변화를 보여야 함. (대규모 작업은 시간이 오래 걸릴 수 있다.) 

 

2. SPID가 CPU, 메모리 및 IO 열에 변경 사항을 표시하지 않는 다면 아무 작업도 수행하지 않는 것이다. 프로세스가 다른 컴퓨터에서 시작된 경우 작업 관리자를 사용하여 관련 프로세스를 종료하는 경우 도움이 될 수 있음.

 

아래 쿼리로 CPU, 메모리 및 IO 변경 사항 확인 가능.

SELECT spid
	,kpid
	,login_time
	,last_batch
	,status
	,hostname
	,nt_username
	,loginame
	,hostprocess
	,cpu
	,memusage
	,physical_io
FROM sys.sysprocesses
WHERE cmd = 'KILLED/ROLLBACK'

3. SQL 재시작.

 

 

문제는 1번의 경우는 기다린다고 쳐도 내용을 많이 찾아보니 보통의 경우 아무리 대용량의 작업도 하루 이상의 시간이 걸리기는 힘들다는 것이 공통 된 의견이며, 대부분의 문제 발생이 Linked Server 사용 시 발생하는 것 같았다. 해결한 분의 글을 보니 특정 엑셀 파일을 붙잡고 있어서 종료가 되지 않았다는 글도 봤다. 

 

좀비 프로세스가 됐다면 답은 SQL 서버를 재시작 하거나, 관련 프로세스도 같이 종료 되도록 해야한다.

 

 

 

728x90

+ Recent posts