알 수없는 DB 쿼리의 유형/이름을 실행하지 않고 얻을 수있는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/163389

  •  03-07-2019
  •  | 
  •  

문제

사용자가 나중에 배치 처리를 위해 임의의 SQL 쿼리를 입력하는 웹 응용 프로그램이 있습니다. 쿼리의 구문을 실제로 실행하지 않고 검증하려고합니다. 쿼리 중 일부는 시간이 오래 걸리므로 우리는이를 실행하고 싶지 않습니다. 나는 이것을하기 위해 Oracle의 dbms_sql.parse를 사용하고 있습니다.

그러나 이제 결과 세트 열의 번호와 유형을 알아야하는 상황이 있습니다. 실제로 쿼리를 실행하지 않고이 작업을 수행 할 수있는 방법이 있습니까? 즉, Oracle을 쿼리를 구문 분석하고 쿼리가 실제로 실행될 때 결과 데이터 유형/이름이 반환 될 것인지 알려주려면? Oracle 10G를 사용하고 있으며 Java 1.5/Servlet 2.4 응용 프로그램입니다.

편집 : 쿼리를 입력 한 사용자는 이미 데이터베이스의 사용자입니다. 데이터베이스 자격 증명으로 내 앱에 인증되며 해당 자격 증명을 사용하여 쿼리가 실행됩니다. 따라서 SQLPLUS와 연결하여 실행할 수 없다는 쿼리를 넣을 수 없습니다.

도움이 되었습니까?

해결책

구문을 검증하고 결과 세트 메타 데이터를 얻기 위해 SQL 쿼리를 준비 할 수 있어야합니다. 쿼리를 준비해도 실행되지 않아야합니다.

import java.sql.*;
. . .
Connection conn;
. . .
PreparedStatement ps = conn.prepareStatement("SELECT * FROM foo");
ResultSetMetadata rsmd = ps.getMetaData();
int numberOfColumns = rsmd.getColumnCount();

그런 다음 결과 세트의 각 열에 대한 메타 데이터를 얻을 수 있습니다.

다른 팁

PL/SQL을 통해 엄격 하게이 작업을 수행하려면 다음을 수행 할 수 있습니다.

DECLARE 
  lv_stat varchar2(100) := 'select blah blah blah';
  lv_cur INTEGER;
  lv_col_cnt INTEGER;
  lv_desc DBMS_SQL.desc_tab;
BEGIN
  DBMS_SQL.parse(lv_cur,lv_stat,DBMS_SQL.NATIVE);
  DBMS_SQL.describe_columns(lv_cur,lv_col_cnt,lv_desc);
  FOR ndx in lv_desc.FIRST .. lv_desc.LAST LOOP
    DBMS_OUTPUT.PUT_LINE(lv_desc(ndx).col_name ||' '||lv_desc(ndx).col_type);
  END LOOP;
END;

DBMS_SQL.DESC_TAB에는 열에 대해 알아야 할 모든 것이 포함되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top