DB 15

[MSSQL] MAX KEEP

아래와 같은 데이터가 있을 때, 각 JOB별로 가장 많은 SALARY의 NAME을 알고 싶다면 설계자 ☞ 송차장 750 개발자 ☞ 정사원 160 ORACLE은 아래와 같이.. WITH EMP AS ( SELECT '남이사' AS NAME , '설계자' AS JOB , 700 AS SALARY FROM DUAL UNION ALL SELECT '이부장' AS NAME , '설계자' AS JOB , 680 AS SALARY FROM DUAL UNION ALL SELECT '송차장' AS NAME , '설계자' AS JOB , 750 AS SALARY FROM DUAL UNION ALL SELECT '강대리' AS NAME , '개발자' AS JOB , 80 AS SALARY FROM DUAL UNION ALL..

DB/MSSQL 2022.06.30

[MSSQL] EXISTS 주의사항

아래와 같은 SQL 이 있었다. DELETE FROM TB_D WHERE EXISTS ( SELECT 1 FROM TB_M B WHERE B.NO = @NO AND B.PK = PK ) 의도 자체는 TB_M을 이용하여 TB_D의 특정 데이터만 삭제하길 원했던 것으로 보인다. 그러나 실제론 운영서버 TB_D 테이블의 모든 데이터가 삭제 되고 있었다 ㅜ_ㅜ 확인하여 보니 아래 부분이 문제가 되고 있었다. TB_D와 TB_M간의 PK 컬럼을 비교하는 것이 아닌, TB_M과 TB_M간의 PK 컬럼을 비교하고 있었다. DELETE FROM TB_D WHERE EXISTS ( SELECT 1 FROM TB_M B WHERE B.NO = @NO AND B.PK = PK -- 비교 구문이 무조건 TRUE. ) 오라클이..

DB/MSSQL 2022.06.21

[ORACLE] 구분자로 분리하여 행으로 반환하는 TABLE FUNCTION

1. 우선 RETURN 받을 ROW의 COLUMN TYPE OBJECT를 생성컬럼이 더 필요하다면 추가정의 하면 된다.CREATE OR REPLACE TYPE TY_SPLIT_TO_ROW/*1.*/ AS OBJECT( TEXT VARCHAR2(4000)) 2. 이어서 COLLECTION TYPE 생성CREATE OR REPLACE TYPE TB_SPLIT_TO_ROW/*2.*/ AS TABLE OF TY_SPLIT_TO_ROW/*1.*/; 3. 드디어 TABLE FUNCTION 생성데이터 구분자가 ','로 고정 되어 있지만 필요에 따라 파라미터로 받아서 처리 할 수도 있을 것이다.CREATE OR REPLACE FUNCTION TF_SPLIT_TO_ROW/*3.*/( P_PARAM VARCHA..

DB/ORACLE 2022.02.16

[ORACLE] DB에서 신규, 수정, 삭제 차단

특정 테이블에 데이터가 신규, 수정, 삭제가 되지 않도록 막아야 하는 상황이 생겼다. 수많은 프로그램들을 일일이 수정을 해야하나 했는데, TRIGGER를 통해 아래와 같은 방법으로도 대응이 가능했다. create or replace TRIGGER TRI_TEST BEFORE DELETE OR INSERT OR UPDATE ON TB_TEST BEGIN /* 삭제 또는 신규 또는 업데이트시*/ RAISE_APPLICATION_ERROR(-20001, '데이터 수정이 불가합니다.'); /* 사용자에러발생 */ END; 데이터 수정시 아래와 같은 에러 발생 → ORA-20001 데이터 수정이 불가합니다. ORA-20001: 데이터 수정이 불가합니다. ORA-06512: at "TRI_TEST", line 3 ..

DB/ORACLE 2022.02.14