복붙노트

[SQL] PL / SQL에서 동적 SELECT INTO 절에 바인드 변수 사용

SQL

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 문을 사용하고 INTO 절에 바인드 변수를 사용합니다.

저는 현재 지금 여행을하고 몇 일 동안 집에서 내 컴퓨터 후면에 액세스 할 수 없습니다, 그러나 이것은 조금 잔소리되었습니다. 는 PL / SQL 참조를 읽는 시도하지만이 같은 선택의 예를 가지고 있지 않습니다.

감사

해결법

  1. ==============================

    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. ==============================

    2.제 생각에는, 동적 PL / SQL 블록은 다소 모호하게됩니다. 매우 유연하지만, 무슨 일이야 알아낼 또한, 조정 하드 디버그 딱딱하고 어렵다. 내 투표, 당신의 첫 번째 옵션으로 이동

    제 생각에는, 동적 PL / SQL 블록은 다소 모호하게됩니다. 매우 유연하지만, 무슨 일이야 알아낼 또한, 조정 하드 디버그 딱딱하고 어렵다. 내 투표, 당신의 첫 번째 옵션으로 이동

    EXECUTE IMMEDIATE v_query_str INTO v_num_of_employees USING p_job;
    

    용도 바인드 변수지만, 둘 다 첫째, 나를 위해, 더 redeable 및 @jonearles 옵션에 비해 조정 가능한 것입니다.

  3. ==============================

    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. ==============================

    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. ==============================

    5.단지 당신이 즉시 실행 사용할 때 .will 키워드 가져 오기없는 예외로 사용할 수 있도록, 오라클 해석은 SQL 쿼리 문자열로 v_query_str, PL / SQL 블록 작동 기능 속으로 선택합니다. 예 2에서, 우리는 말을 시작 사용하는; 그래서 PL / SQL 블록 및 법적되었다.

    단지 당신이 즉시 실행 사용할 때 .will 키워드 가져 오기없는 예외로 사용할 수 있도록, 오라클 해석은 SQL 쿼리 문자열로 v_query_str, PL / SQL 블록 작동 기능 속으로 선택합니다. 예 2에서, 우리는 말을 시작 사용하는; 그래서 PL / SQL 블록 및 법적되었다.

  6. from https://stackoverflow.com/questions/7816402/using-bind-variables-with-dynamic-select-into-clause-in-pl-sql by cc-by-sa and MIT license