복붙노트

[SQL] 테이블 및 컬럼 이름을 전달 동적 바인딩 변수를 사용하여

SQL

테이블 및 컬럼 이름을 전달 동적 바인딩 변수를 사용하여

바인드 변수를 사용하여 쿼리를 동적으로 열 및 테이블 이름을 전달할 수있는 방법이 있습니까? 이것은 간단한 연결 연산자를 || 사용하여 수행 할 수 있지만, 나는이 달성 할 수있는 다른 방법을 싶습니다.

편집하다

OPEN abc_cur FOR 'Select :column_name
                  from :table_name' 
                USING column_name,table_name;

이 예에서 나는 EMP로 EMPNO, ENAME 및 TABLE_NAME로 COLUMN_NAME을 통과하고

그러나이 방법은 나를 위해 작동하지 않습니다. 이 연결의 전통적인 접근 다른 다른 접근을 할 수 있습니까?

해결법

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

    1.테이블 및 열 이름은 더, 바인드 변수로 전달되지 수 없습니다. 바인드 변수의 전체 포인트는 오라클이 문에 대해 한 번 쿼리 계획을 생성하고 다른 바인드 변수 값으로 여러 번 실행할 수 있다는 것입니다. 최적화가 열이 선택에 대한 필터링되고 있는지 테이블에 액세스하고 또는 무엇을 알고하지 않는 경우, 쿼리 계획을 생성 할 수 없습니다.

    테이블 및 열 이름은 더, 바인드 변수로 전달되지 수 없습니다. 바인드 변수의 전체 포인트는 오라클이 문에 대해 한 번 쿼리 계획을 생성하고 다른 바인드 변수 값으로 여러 번 실행할 수 있다는 것입니다. 최적화가 열이 선택에 대한 필터링되고 있는지 테이블에 액세스하고 또는 무엇을 알고하지 않는 경우, 쿼리 계획을 생성 할 수 없습니다.

    당신의 관심사는 (대부분의 시간, 동적 SQL에 의존 할 필요가 데이터 모델의 문제를 의미한다) SQL 인젝션 공격에 관한 것으로, 그 동적 SQL을 가정하는 것은 실제로 필요한 경우, 검증하는 DBMS_ASSERT 패키지를 사용할 수있는 테이블 이름 및 열 이름이 포함 된 SQL이 포함되어 있지 않습니다.

  2. ==============================

    2.아니 당신은 할 수 없습니다. 조회 테이블 또는 열 이름을 변경하는 질의의 의미를 변경한다 - 그것은 다른 쿼리 즉된다.

    아니 당신은 할 수 없습니다. 조회 테이블 또는 열 이름을 변경하는 질의의 의미를 변경한다 - 그것은 다른 쿼리 즉된다.

    바인드 변수는 동일한 쿼리에 다른 값을 전달 대해 모두. 옵티마이 않고도 다른 값 조회를 다시 사용할 수를 재 해석하고 최적화한다.

  3. from https://stackoverflow.com/questions/9723931/passing-table-and-column-name-dynamically-using-bind-variables by cc-by-sa and MIT license