PL/SQL에서 동적 SELECT INTO 절과 함께 바인드 변수 사용
PL/SQL의 동적 SQL 문에서 바인드 변수를 사용할 수 있는 위치에 대한 질문이 있습니다.
예를 들어, 이것이 유효한 것을 알고 있습니다.
CREATE OR REPLACE FUNCTION get_num_of_employees (p_loc VARCHAR2, p_job VARCHAR2)
RETURN NUMBER
IS
v_query_str VARCHAR2(1000);
v_num_of_employees NUMBER;
BEGIN
v_query_str := 'SELECT COUNT(*) FROM emp_'
|| p_loc
|| ' WHERE job = :bind_job';
EXECUTE IMMEDIATE v_query_str
INTO v_num_of_employees
USING p_job;
RETURN v_num_of_employees;
END;
/
이런 선택 문장에서 바인드 변수를 사용할 수 있는지 궁금합니다.
CREATE OR REPLACE FUNCTION get_num_of_employees (p_loc VARCHAR2, p_job VARCHAR2)
RETURN NUMBER
IS
v_query_str VARCHAR2(1000);
v_num_of_employees NUMBER;
BEGIN
v_query_str := 'SELECT COUNT(*) INTO :into_bind FROM emp_'
|| p_loc
|| ' WHERE job = :bind_job';
EXECUTE IMMEDIATE v_query_str
USING out v_num_of_employees, p_job;
RETURN v_num_of_employees;
END;
/
주의: SELECT INTO 문을 dyamic 문자열로 사용하고 INTO 절에 바인드 변수를 사용했습니다.
저는 지금 여행 중이라 며칠간 집에 있는 컴퓨터에 접속할 수 없습니다만, 이 때문에 조금 신경이 쓰입니다.PL/SQL 참조를 읽어보려고 했지만 이와 같은 선택 예는 없습니다.
감사해요.
다이나믹 PL/SQL 블록은 다소 애매하다고 생각합니다.는 매우 유연하지만 조정하기 어렵고 디버깅도 어려우며 무슨 일이 일어나고 있는지 파악하기도 어렵습니다.제 표는 당신의 첫 번째 선택입니다
EXECUTE IMMEDIATE v_query_str INTO v_num_of_employees USING p_job;
둘 다 바인드 변수를 사용하지만 우선 @jonearles 옵션보다 재배치 및 조정이 용이합니다.
아니요, 바인드 변수를 그런 식으로 사용할 수 없습니다.두 번째 예에서는:into_bind
에v_query_str
변수 값의 자리 표시자일 뿐입니다.v_num_of_employees
선택한 스테이트먼트는 다음과 같이 바뀝니다.
SELECT COUNT(*) INTO FROM emp_...
가치가 있기 때문에v_num_of_employees
이null
에EXECUTE IMMEDIATE
.
첫 번째 예에서는 반환값을 변수에 바인드하는 올바른 방법을 보여 줍니다.
편집
원본 포스터는 내가 사용하려는 답변에 언급하고 있는 두 번째 코드 블록을 편집했습니다.OUT
파라미터 모드v_num_of_employees
디폴트 대신IN
이 수정으로 두 예가 기능적으로 동등해집니다.
select 문을 동적 PL/SQL 블록에 넣습니다.
CREATE OR REPLACE FUNCTION get_num_of_employees (p_loc VARCHAR2, p_job VARCHAR2)
RETURN NUMBER
IS
v_query_str VARCHAR2(1000);
v_num_of_employees NUMBER;
BEGIN
v_query_str := 'begin SELECT COUNT(*) INTO :into_bind FROM emp_'
|| p_loc
|| ' WHERE job = :bind_job; end;';
EXECUTE IMMEDIATE v_query_str
USING out v_num_of_employees, p_job;
RETURN v_num_of_employees;
END;
/
바인딩 변수는 Oracle SQL 쿼리에서 "in" 절과 함께 사용할 수 있습니다.
10g으로 동작합니다.다른 버전은 모릅니다.
바인드 변수는 최대 4000자의 varchar입니다.
예: 쉼표로 구분된 값 목록을 포함하는 바인딩 변수.
: paramesvar = 1, 2, 3, 4, 5
select * from mytable
where myfield in
(
SELECT regexp_substr(:bindvar,'[^,]+', 1, level) items
FROM dual
CONNECT BY regexp_substr(:bindvar, '[^,]+', 1, level) is not null
);
(여기에 게재한 것과 같은 정보:변수를 사용하여 동적 쿼리에서 IN 절을 지정하려면 어떻게 해야 합니까?)
[Into functional works for PL/SQL Block]를 선택합니다.Execute immediate를 사용하면 Oracle은 v_query_str을 SQL Query 문자열로 해석하므로 .will get 키워드 missing exception을 사용할 수 없습니다.예 2에서는 begin end를 사용하고 있기 때문에 pl/sql block과 그 legal이 되었습니다.
언급URL : https://stackoverflow.com/questions/7816402/using-bind-variables-with-dynamic-select-into-clause-in-pl-sql
'programing' 카테고리의 다른 글
reactjs 컴포넌트에서 "key" 속성에 액세스하는 방법 (0) | 2023.03.19 |
---|---|
Wordpress의 부하가 높을 때 MySQL이 정기적으로 행업합니다. (0) | 2023.03.19 |
테이블 내의 행에서 ng-repeat 및 ng-class 사용 (0) | 2023.03.19 |
도커 VHost의 리버스 프록시로서의 Nginx (0) | 2023.03.14 |
int에 주조 플라스크 양식 값 (0) | 2023.03.14 |