2017-11-21 2 views
1

문제 설명나는 테이블에 저장해야 할 동적 SQL이 전체 쿼리를

을 실행하지 않고 동적 쿼리에 사용되는 열을 찾을 수 있지만, 는 SQL을 저장하기 전에 내가 필요하는 방법 다른 테이블에 저장된 열 목록을 사용하여 SQL의 유효성을 검사하십시오. 쿼리를 실행하지 않고 선택 영역에서 열의 이름을 찾을 수 있습니까?

Approach1 내가이며, 데이터 사전 테이블에 메타 데이터를 쿼리의 계획을 설명하는 사용 읽으려고 나누었다 불행하게도 나는 이러한 데이터와 모든 테이블을 찾을 수 없습니다라고 생각 할 수 전용 옵션 당신이 그러한 견해를 안다면 저에게 알려주십시오.

하여 추정 사용 DBMS_SQL.DESCRIBE_COLUMNS 패키지는 열 이름을 찾을 수 있습니다,하지만 난이 전체 쿼리를 실행 것으로 판단된다.

답변

3

열 이름을 얻기 위해 쿼리를 실행할 필요가 없습니다. 구문 분석 만하면됩니다. 예 :

set serveroutput on 

declare 
    l_statement varchar2(4000) := 'select * from employees'; 
    l_c pls_integer; 
    l_col_cnt pls_integer; 
    l_desc_t dbms_sql.desc_tab; 
begin 
    l_c := dbms_sql.open_cursor; 
    dbms_sql.parse(c=>l_c, statement=>l_statement, language_flag=>dbms_sql.native); 
    dbms_sql.describe_columns(c=>l_c, col_cnt=>l_col_cnt, desc_t=>l_desc_t); 

    for i in 1..l_col_cnt loop 
    dbms_output.put_line(l_desc_t(i).col_name); 
    end loop; 

    dbms_sql.close_cursor(l_c); 
exception 
    when others then 
    if (dbms_sql.is_open(l_c)) then 
     dbms_sql.close_cursor(l_c); 
    end if; 
    raise; 
end; 
/

출력 : 간단한 예로서

EMPLOYEE_ID 
FIRST_NAME 
LAST_NAME 
EMAIL 
PHONE_NUMBER 
HIRE_DATE 
JOB_ID 
SALARY 
COMMISSION_PCT 
MANAGER_ID 
DEPARTMENT_ID 

PL/SQL procedure successfully completed. 

당신은 루프 내부의 열 이름에 무엇을해야 확인 할 수 있습니다.

열 수식의 열 이름이나 별칭 만 표시되며 실제로 검색되는 데이터는 반영되지 않습니다. 액세스 권한이있는 곳이면 어디에서나 데이터를 가져 오지만 유효하다고 간주되는 열/표현 별칭을 제공하는 쿼리를 만들 수 있습니다.

특정 데이터에 대한 액세스를 제한하려는 경우 등 뷰와 같은 다른 메커니즘, 가상 개인 데이터베이스, 조사

2

DBMS_SQL.PARSE는 SELECT 문을 실행하지 않습니다하지만 DDL 실행됩니다 성명서. 'select * from employees' 문자열이 'drop table employees'으로 바뀌면 코드는 실패하지만 테이블은 여전히 ​​삭제됩니다.

메타 데이터 검색의 성능에 대해서만 걱정하는 경우 Alex Poole의 대답이 정상적으로 작동합니다.

잘못된 문장 유형을 실행하는 것에 대해 걱정이된다면 Alex Poole의 답변에 약간의 조정을 원할 것입니다.

진술이 다른 것 대신에 SELECT인지 여부를 확인하는 것은 놀랍게 어렵습니다. 문자열이 select으로 시작하는지 확인하는 간단한 조건은 99 %의 시간 동안 작동하지만 99 %에서 100 %로 증가하는 것은 엄청난 양의 작업입니다. 당신은 내가 당신이 내 오픈 소스 PLSQL_LEXER를 사용하는 것이 좋습니다 100 %의 정확성이 필요하면 간단한 정규 표현식 등

/*comment in front -- */ select * from dual 
    select * from dual 
with asdf as (select * from dual) select * from asdf; 
((((((select * from dual)))))); 

모든 다른 키워드, 주석, 대체 인용 형식, 공간, 따라갈 수 없습니다.설치가 완료되면 다음과 같은 명령 유형을 안정적으로 테스트 할 수 있습니다.

+0

질문과 관련하여 질문을 읽었지만 'parse'는 DDL을 실행하므로 잊지 마세요. –

관련 문제