반응형
PL/SQL 작성에 대해 문의가 온 내용이 있어서 정리하였습니다.
PL/SQL로 프로시저를 수정하는데, SQL의 대부분은 수정하지 않고, 조건에 따라 컬럼하나만 변경되어서 조회가 될 수있게 수정하는 가이드를 줄 수 있냐는 문의였습니다.
문의주신 분의 의도는 정적 SQL로 SQL의 변경을 최소화하여 기존과 같은 정적 SQL 형식으로의 가이드를 부탁했지만, 저는 처음에 동적 SQL로 답을 드렸었는데요, 덕분에 동적,정적 SQL 둘다 가이드를 줄 수 있었습니다.
동적 SQL과 정적 SQL에 따라 어떠한 방법으로 작성을 했는지 예시로 만든 프로시저를 통해서 작성해보겠습니다.
두개의 프로시저의 성격은 약간 차이가 있습니다. 1.동적 SQL을 사용해서 만든 프로시저는 EMP_COL_TEST의 ENAME,JOB 각각 컬럼에 EMP에서 조회한 값과 현재 시간(sysdate)를 insert하는 프로시저입니다.
반면에 2.정적 SQL은 EMP_COL_TEST의 ENAME 컬럼하나에 emp의 ENAME,JOB 값을 넣는 프로시저입니다.
둘다 emp 라는 테이블과 emp의 메타데이터만 복사해온 emp_col_test 두개의 테이블을 사용할 예정입니다.
create table emp_col_test
as select * from emp where 1=2;
-- 기본이 not null이기 때문에 null로 변경
alter table emp_col_test modify (empno null);
1. 동적 SQL
CREATE OR REPLACE PROCEDURE PROCESS_COLUMN
IS
column_names SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST('ENAME','JOB');
BEGIN
for i in 1.. column_names.count LOOP
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO EMP_COL_TEST('||column_names(i)||'),hiredate) select '||column_names(i)||',sysdate as hiredate from emp';
commit;
END;
END LOOP;
END;
2.정적 SQL
CREATE OR REPLACE PROCEDURE PROCESS_COLUMN2
IS
column_index PLS_INTEGER := 1;
BEGIN
while column_index <= 2 LOOP
BEGIN
INSERT INTO EMP_COL_TEST(ENAME,hiredate) select case when column_index =1 then ename when column_index=2 then job end as ename,sysdate as hiredate from emp;
commit;
END;
column_index := column_index + 1;
END LOOP;
END;
PL/SQL 틀을 짤때 참고하면 좋을것 같습니다.
반응형
'Oracle > 운영' 카테고리의 다른 글
[SGA] library cache lock&pin 발생원인과 재현하기 (2) | 2024.12.13 |
---|---|
Lob Partition 의 partition과 lob partition의 default attributes 설정 변경하여 자동으로 추가되는 파티션 압축되게 하기 (2) | 2024.11.22 |
[23ai] ai벡터검색 - ChatGPT를 이용하여 실시간 응답을 받기(RAG) (2) | 2024.11.15 |
[23ai] ai벡터검색 - vector_distance (0) | 2024.11.13 |
[23ai] new feature 벡터 타입과 ai벡터검색 - pdf파일을 백터검색하기 (2) (0) | 2024.11.12 |
댓글