Integer는 null 입력이 가능하다.

 

Integer 변수에 null이 입력되었을 경우

if문으로 숫자와 비교했을 때 바른 문법이라고 생각했다.

그러나, Integer에 null이 입력했을 경우 숫자와 비교했을 때 아래와 같은 에러가 발생하였다.

습관적으로

NullPointerException이 발생하여 num1에 null이 입력되어 발생하는 줄로만 인식하였다.

그렇다면, 처음 변수 선언하는곳에서 에러가 발생해야 하는게 아닌가?

Integer 변수에 null이 입력되어 발생하는게 아니라,

null과 정수(int 자료형)를 비교하려고 하기 때문에 발생하는 에러였다.

 

아래를 살펴보자.

정수와 null을 비교해보자. 아예 int와 null 타입자체를 비교할 수 없다고 에러가 발생한다.

 

 

 

습관은 무서운 것이다.

항상, 한 발 물러서서 접근하는 자세가 필요하다.

 

WITH TT AS (
    SELECT 10000 AS DEPTCD, '회사' AS DEPTNAME, NULL AS PARENTDEPTCD, 1 AS DEPTH
    UNION ALL
    SELECT 11000 AS DEPTCD, '경영지원실' AS DEPTNAME, 10000 AS PARENTDEPTCD, 2 AS DEPTH
    UNION ALL
    SELECT 12000 AS DEPTCD, '영업지원실' AS DEPTNAME, 10000 AS PARENTDEPTCD, 2 AS DEPTH
    UNION ALL
    SELECT 12100 AS DEPTCD, '영업팀' AS DEPTNAME, 12000 AS PARENTDEPTCD, 3 AS DEPTH
    UNION ALL
    SELECT 12200 AS DEPTCD, '영업팀' AS DEPTNAME, 12000 AS PARENTDEPTCD, 3 AS DEPTH
    UNION ALL
    SELECT 11100 AS DEPTCD, '경제팀' AS DEPTNAME, 11000 AS PARENTDEPTCD, 3 AS DEPTH
    UNION ALL
    SELECT 11200 AS DEPTCD, '경영팀' AS DEPTNAME, 11000 AS PARENTDEPTCD, 3 AS DEPTH
    UNION ALL
    SELECT 11210 AS DEPTCD, '총무파트' AS DEPTNAME, 11200 AS PARENTDEPTCD, 4 AS DEPTH
    UNION ALL
    SELECT 11220 AS DEPTCD, '인사파트' AS DEPTNAME, 11200 AS PARENTDEPTCD, 4 AS DEPTH
    UNION ALL
    SELECT 11110 AS DEPTCD, '경제전략1팀' AS DEPTNAME, 11100 AS PARENTDEPTCD, 4 AS DEPTH
    UNION ALL
    SELECT 11120 AS DEPTCD, '경제전략2팀' AS DEPTNAME, 11100 AS PARENTDEPTCD, 4 AS DEPTH
), CTE AS (
    SELECT DEPTCD
        ,  DEPTNAME
        ,  PARENTDEPTCD
        ,  CONVERT(NVARCHAR(300), DEPTNAME) AS FULLPATH
        ,  CONVERT(NVARCHAR(300), DEPTNAME) AS REVERSEFULLPATH
    FROM TT
    WHERE PARENTDEPTCD IS NULL
    UNION ALL
    SELECT B.DEPTCD
        ,  B.DEPTNAME
        ,  B.PARENTDEPTCD
        ,  CONVERT(NVARCHAR(300), CONCAT(C.FULLPATH, ' > ', B.DEPTNAME)) AS FULLPATH
        ,  CONVERT(NVARCHAR(300), CONCAT(B.DEPTNAME, ' > ', C.REVERSEFULLPATH)) AS REVERSEFULLPATH
    FROM TT B, CTE C
    WHERE B.PARENTDEPTCD = C.DEPTCD
)
SELECT * 
FROM CTE

오라클 DB에서 MSSQL로 옮기는 작업을 하는 중인데

 

차이점을 기록해둘 필요가 있어, 하나씩 작성해보려 한다.

 

※ 변수선언 및 값 대입

ORACLE
	abc VARCHAR2(10);
	abc VARCHAR2(10) := 1;
	abc := 5;
    

MSSQL
	DECLARE @abc VARCHAR(10);
	DECLARE @abc VARCHAR(10) = 1;
	SET @abc = 5;

 

※ SELECT 변수 대입

ORACLE
	V_A VARCHAR2(100);
	V_B NUMBER(5);
	NUM_A NUMBER(10);
    
	SELECT COLUMN_A, COLUMN_B
	  INTO V_A, V_B
	  FROM TABLE_NAME
	 WHERE COLUMN_A = 1
	   AND COLUMN_B = NUM_A;
       

MSSQL
	DECLARE @V_A 	VARCHAR(100);
	DECLARE @V_B 	INT;
	DECLARE @NUM_A 	BIGINT;
    
	SELECT @V_A = COLUMN_A
	    ,  @V_B = COLUMN_B
	  FROM TABLE_NAME
	 WHERE COLUMN_A = 1
	   AND COLUMN_B = @NUM_A;

 

※ 예외 선언

ORACLE
    BEGIN
        -- SQL
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            -- SQL
        WHEN OTHERS THEN
            -- SQL
        
        
MSSQL
    BEGIN TRY
        -- SQL
        
        -- ORACLE: NO_DATA_FOUND
        IF @@ROWCOUNT = 0 BEGIN
            -- SQL
        END
    END TRY
    BEGIN CATCH
        -- SQL
        -- WHEN OTHERS THEN
    END CATCH

 

※ 카탈로그 통계 정보 갱신

ORACLE
	DBMS_STATS.GATHER_TABLE_STATS('SCHEMA','TABLE_NAME');
    
MSSQL
	UPDATE STATISTICS TABLE_NAME;

Window Application 설치 유무를 확인하는 방법이다.

 

레지스트리를 읽어서 하는 방법인데..

programName은 "프로그램 추가/제거"에 나와있는 명칭으로 진행하면 된다.

public static bool CheckInstalledApplications(string programName) {
    bool isInstalled = false;

    foreach
    (string item in Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall").GetSubKeyNames())
    {
        object itemProgramName
        = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" + item).GetValue("DisplayName");

        Console.WriteLine(itemProgramName);

        if (string.Equals(itemProgramName, programName)) {
            Console.WriteLine("Install status: INSTALLED");
            isInstalled = true;
            break;
        }
    }
    return isInstalled;
 }

 

 

출처: https://ucnn.tistory.com/119

+ Recent posts