programing

PL/SQL에서 동적 SELECT INTO 절과 함께 바인드 변수 사용

minimums 2023. 3. 19. 18:00
반응형

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_bindv_query_str변수 값의 자리 표시자일 뿐입니다.v_num_of_employees선택한 스테이트먼트는 다음과 같이 바뀝니다.

SELECT COUNT(*) INTO  FROM emp_...

가치가 있기 때문에v_num_of_employeesnullEXECUTE 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

반응형