[SQL] PL / SQL에서 동적 SELECT INTO 절에 바인드 변수 사용
SQLPL / 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 문을 사용하고 INTO 절에 바인드 변수를 사용합니다.
저는 현재 지금 여행을하고 몇 일 동안 집에서 내 컴퓨터 후면에 액세스 할 수 없습니다, 그러나 이것은 조금 잔소리되었습니다. 는 PL / SQL 참조를 읽는 시도하지만이 같은 선택의 예를 가지고 있지 않습니다.
감사
해결법
-
==============================
1.아니 당신은 방법으로 그 변수를 바인드 할 수 없습니다. 두 번째 예에서 : v_query_str의 into_bind 변수 v_num_of_employees의 값에 대한 단지 자리 표시 자입니다. 귀하의 선택에 문이 같은 변신합니다 :
아니 당신은 방법으로 그 변수를 바인드 할 수 없습니다. 두 번째 예에서 : v_query_str의 into_bind 변수 v_num_of_employees의 값에 대한 단지 자리 표시 자입니다. 귀하의 선택에 문이 같은 변신합니다 :
SELECT COUNT(*) INTO FROM emp_...
v_num_of_employees의 값이 null이에 있기 때문에 IMMEDIATE를 실행합니다.
첫 번째 예는 변수에 반환 값을 결합하는 올바른 방법을 제시한다.
편집하다
원래 포스터 내가 대신 모드에서 기본의 v_num_of_employees을 위해 사용 OUT 매개 변수 모드로 내 대답에 말하는 겁니다 그 두 번째 코드 블록을 편집했다. 이 수정 예제 모두 기능적으로 동일합니다.
-
==============================
2.제 생각에는, 동적 PL / SQL 블록은 다소 모호하게됩니다. 매우 유연하지만, 무슨 일이야 알아낼 또한, 조정 하드 디버그 딱딱하고 어렵다. 내 투표, 당신의 첫 번째 옵션으로 이동
제 생각에는, 동적 PL / SQL 블록은 다소 모호하게됩니다. 매우 유연하지만, 무슨 일이야 알아낼 또한, 조정 하드 디버그 딱딱하고 어렵다. 내 투표, 당신의 첫 번째 옵션으로 이동
EXECUTE IMMEDIATE v_query_str INTO v_num_of_employees USING p_job;
용도 바인드 변수지만, 둘 다 첫째, 나를 위해, 더 redeable 및 @jonearles 옵션에 비해 조정 가능한 것입니다.
-
==============================
3.동적 PL / SQL 블록에서 select 문을 넣습니다.
동적 PL / SQL 블록에서 select 문을 넣습니다.
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; /
-
==============================
4.바인드 변수는 절 "의"오라클 SQL 쿼리에 사용할 수 있습니다.
바인드 변수는 절 "의"오라클 SQL 쿼리에 사용할 수 있습니다.
10g에서 작동; 나는 다른 버전에 대해 알고하지 않습니다.
바인드 변수는 4000 자 VARCHAR의 최대이다.
예 : 쉼표로 구분 된 값리스트를 포함 바인드 변수, 예를 들어
: Bindvar = 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 );
(동일 정보는 여기 게시 된 : 당신이 변수를 사용하여 동적 쿼리 절에 지정하는 방법은?)
-
==============================
5.단지 당신이 즉시 실행 사용할 때 .will 키워드 가져 오기없는 예외로 사용할 수 있도록, 오라클 해석은 SQL 쿼리 문자열로 v_query_str, PL / SQL 블록 작동 기능 속으로 선택합니다. 예 2에서, 우리는 말을 시작 사용하는; 그래서 PL / SQL 블록 및 법적되었다.
단지 당신이 즉시 실행 사용할 때 .will 키워드 가져 오기없는 예외로 사용할 수 있도록, 오라클 해석은 SQL 쿼리 문자열로 v_query_str, PL / SQL 블록 작동 기능 속으로 선택합니다. 예 2에서, 우리는 말을 시작 사용하는; 그래서 PL / SQL 블록 및 법적되었다.
from https://stackoverflow.com/questions/7816402/using-bind-variables-with-dynamic-select-into-clause-in-pl-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 매우 큰 테이블의 성능을 계산 MYSQL (0) | 2020.05.20 |
---|---|
[SQL] 성능과 같은 '% 검색어 %'전체 텍스트 검색을 CONTAINS 쿼리 대 (0) | 2020.05.20 |
[SQL] 어떻게 SQL에서 그룹 당 증분 그룹 번호를 반환 (0) | 2020.05.20 |
[SQL] MySQL은 - 하나 개의 컬럼은 DISTINCT되는 경우 모든 열을 SELECT (0) | 2020.05.20 |
[SQL] C # 데이터 연결 모범 사례? (0) | 2020.05.20 |