바인드 변수를 사용하는 이유와 종류
바인드 변수는 오라클에서 데이터 값을 변수로 두어서 일일이 작성하지 않고 한 번 저장해 두면 저장한 데이터 값을 불러와서 쿼리를 실행하기 때문에 자주 사용하고 있다.
오라클에서 바인드 변수는 다음 방법들로 선언할 수 있다.
- var(iable) 을 사용해서 선언
- SQL Developer 툴 선언
- declare 내부에서 선언
- 프로그램 파라미터에서 선언
var(iable) 을 사용해서 선언
var a number;
exec :a := 1;
select :a from dual;
a를 선언할 때 콜론을 사용하지 않지만 참조할 때는 콜론이 사용된다. 이처럼 var로 선언된 변수는 다음과 같은 특징이 있다.
- 선언시에는 이름만 사용, 참조시에는 콜론(:) 함께 사용
- 세션에서 전역적으로 선언되었기 때문에 블럭내부에서 var를 사용해서 선언할 수 없음
- 함수 호출처럼 값 할당시 exec를 사용
SQL Developer 툴 선언
콜론이 붙은 변수명을 툴에서 인식하여 SQL 실행시 변수 값을 입력하는 방법이다. 이 방법은 var 선언과는 다르게 쿼리 실행이 끝나면 세션에서 값을 찾을 수 없다.
select :id from dual;
Declare 내부에서 선언
declare
a number;
b number;
begin
a := 1;
select a into b from dual;
end;
팁
select * from &al;
select * from dual;
//오라클은 아래 문장을 파싱할 수 없다.
select * from :a;
PL/SQL(Procedure, Package) - 동적 SQL
EXECUTE IMMEDIATE : Inset, Update, Delete 구문을 실행하거나 Select 구문을 실행 시 INTO를 사용하여 단일 값을 리턴 받을 때 사용
OPEN-FOR : Select 구문을 실행 시 Cursor를 리턴 받을 때 사용
팁
바인드 변수(:) 사용 시 쿼리 내부에서 변수명은 의미가 없고 변수 순서, 개수가 USING의 변수 순서, 개수와 일치해야 한다. 바인드 변수가 없다면 USING는 생략가능.
EXECYTE IMMEDIATE
CREATE OR REPLACE PROCEDURE
PC_SET_HOLIDAY ( in_hldy_dte in date
, in_hldy_nm in varchar2
, in_use_yn in varchar2)
IS
v_query varchar(1000);
d_sysdate date;
BEGIN
BEGIN
-- 단일 값을 리턴받을때
EXECUTE IMMEDIATE 'SELECT SYSDATE FROM DUAL' INTO d_sysdate;
END;
v_query := v_query || 'INSERT INTO HOLIDAY';
v_query := v_query || 'VALUES(:1,:2,:3,:4)';
BEGIN
-- INSERT, UPDATE, DELETE 구문 실행
EXECUTE IMMEDIATE v_query
USING in_hldy_dte, in_hldy_nm, in_use_yn, d_sysdate;
END;
END;
OPEN-FOR (CURSOR 리턴 받을 때)
CREATE OR REPLACE PROCEDURE
PC_GET_HOLIDAY ( in_fromdate in varchar2
, in_todate in varchar2
, out_cursor out SYS_REFCURSOR)
IS
v_query varchar(1000);
BEGIN
v_query := v_query || 'SELECT HLDY_DTE, HLDY_NM';
v_query := v_query || ' FROM HOLIDAY';
v_query := v_query || ' WHERE HLDY_DTE BETWEEN :in_fromdate';
v_query := v_query || ' AND :in_todate';
BEGIN
-- CURSOR를 리턴 받을때
OPEN out_cursor FOR v_query
USING in_fromdate, in_todate;
END;
END;
Reference
[Oracle|오라클] 동적쿼리(Dynamic SQL) 사용법 (텍스트 쿼리) : gent.tistory.com/39
ORACLE 바인딩 변수, 치환 기능: jangjongmin.blogspot.com/2012/12/oracle.html
[Oracle|오라클] 동적쿼리(Dynamic SQL) 사용법 (텍스트 쿼리)
PL/SQL(Procedure, Package)을 사용하다 보면 동적으로 쿼리(Query)를 생성하거나 텍스트(text) 쿼리를 입력 받아서 실행해야하는 경우가 있다. 다음 두가지 방법을 적절히 사용하면 좋은 결과를 얻을수 있
gent.tistory.com
'DB' 카테고리의 다른 글
Hint로 쿼리 튜닝하기 (0) | 2021.03.30 |
---|---|
MongoDB (0) | 2020.10.06 |