database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40895 게시물 읽기
No. 40895
다이나믹 쿼리 바인드 변수
작성자
나그네
작성일
2015-08-17 15:16
조회수
8,658

안녕하세요.

프로시저 안에서 다이나믹 쿼리를 사용하는데 파라미터 바인딩을 하고 싶습니다. 

방법이 있나요?

 

이 글에 대한 댓글이 총 2건 있습니다.

 EXECUTE IMMEDIATE 나  OPEN FOR 를 사용하는 경우와

dbms_sql 패키지를 사용하는 경우가 있습니다.
 
EXECUTE IMMEDIATE의 경우 using  문을 사용하여 바인딩하며 순서 바인딩이 됩니다.
 
ex)
DECLARE
  a_null  CHAR(1);  -- Set to NULL automatically at run time
BEGIN
  EXECUTE IMMEDIATE 'UPDATE employees_temp SET commission_pct = :x'
    USING a_null;
END;
 
OPEN FOR도 마찬가지입니다.
 
ex) --아래는 오라클에서 긁어온 것인데.... 에러 시 커서를 닫는 등의 세부 처리가 안되어 있네요...
DECLARE
  TYPE EmpCurTyp  IS REF CURSOR;
  v_emp_cursor    EmpCurTyp;
  emp_record      employees%ROWTYPE;
  v_stmt_str      VARCHAR2(200);
  v_e_job         employees.job%TYPE;
BEGIN
  -- Dynamic SQL statement with placeholder:
  v_stmt_str := 'SELECT * FROM employees WHERE job_id = :j';
 
  -- Open cursor & specify bind variable in USING clause:
  OPEN v_emp_cursor FOR v_stmt_str USING 'MANAGER';
 
  -- Fetch rows from result set one at a time:
  LOOP
    FETCH v_emp_cursor INTO emp_record;
    EXIT WHEN v_emp_cursor%NOTFOUND;
  END LOOP;
 
  -- Close cursor:
  CLOSE v_emp_cursor;
END;
/
 
dbms_sql은 좀 복잡합니다.
그런데 그 대신 명칭 바인딩이 가능합니다.
DBMS_SQL.BIND_VARIABLE 이라는 것으로 합니다.
 
ex) --아래는 오라클에서 긁어온 것인데.... 에러 시 커서를 닫는 등의 세부 처리가 안되어 있네요...
--그리고 DBMS_SQL.TO_REFCURSOR 를 사용하여 커서 번호를 커서로 변환하여 Native Dynamic SQL과 섞어서 사용하네요
CREATE OR REPLACE TYPE vc_array IS TABLE OF VARCHAR2(200);
/
CREATE OR REPLACE TYPE numlist IS TABLE OF NUMBER;
/
CREATE OR REPLACE PROCEDURE do_query_1 (
  placeholder vc_array,
  bindvars vc_array,
  sql_stmt VARCHAR2
)
IS
  TYPE curtype IS REF CURSOR;
  src_cur     curtype;
  curid       NUMBER;
  bindnames   vc_array;
  empnos      numlist;
  depts       numlist;
  ret         NUMBER;
  isopen      BOOLEAN;
BEGIN
  -- Open SQL cursor number:
  curid := DBMS_SQL.OPEN_CURSOR;
 
  -- Parse SQL cursor number:
  DBMS_SQL.PARSE(curid, sql_stmt, DBMS_SQL.NATIVE);
 
  bindnames := placeholder;
 
  -- Bind variables:
  FOR i IN 1 .. bindnames.COUNT LOOP
    DBMS_SQL.BIND_VARIABLE(curid, bindnames(i), bindvars(i));
  END LOOP;
 
  -- Run SQL cursor number:
  ret := DBMS_SQL.EXECUTE(curid);
 
  -- Switch from DBMS_SQL to native dynamic SQL:
  src_cur := DBMS_SQL.TO_REFCURSOR(curid);
  FETCH src_cur BULK COLLECT INTO empnos, depts;
 
  -- This would cause an error because curid was converted to a REF CURSOR:
  -- isopen := DBMS_SQL.IS_OPEN(curid);
 
  CLOSE src_cur;
END;
/
 
김흥수(protokhs)님이 2015-08-17 16:53에 작성한 댓글입니다.

감사합니다

나그네님이 2015-08-18 09:19에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40898구분자를 통한 데이터 분리관련 질문~! 도와주세요 [2]
천하제일
2015-08-19
7999
40897세로날짜를 가로로하고싶어요 [1]
김영주
2015-08-18
8224
40896이 쿼리 뭐가 문제인 걸루 보이세요? [1]
황춘호
2015-08-17
8316
40895다이나믹 쿼리 바인드 변수 [2]
나그네
2015-08-17
8658
40894IS NULL 관련 문의입니다. [1]
이현정
2015-08-13
7821
40893'트리거에 기본값' 이라고 혹시 아시는분 계시나요?
질문
2015-08-13
7863
40892sql lag 문의드립니다. [3]
뚜뚜
2015-08-07
7977
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다