알 수없는 DB 쿼리의 유형/이름을 실행하지 않고 얻을 수있는 방법이 있습니까?
문제
사용자가 나중에 배치 처리를 위해 임의의 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에는 열에 대해 알아야 할 모든 것이 포함되어 있습니다.
제휴하지 않습니다 StackOverflow