Есть ли способ получить типы / имена неизвестного запроса БД без его выполнения? - PullRequest
4 голосов
/ 02 октября 2008

У меня есть веб-приложение, в котором пользователи вводят произвольные SQL-запросы для последующей пакетной обработки. Мы хотим проверить синтаксис запроса, фактически не выполняя его. Некоторые запросы будут занимать много времени, поэтому мы не хотим их выполнять. Я использую Oracle dbms_sql.parse для этого.

Однако теперь у меня есть ситуация, когда мне нужно знать количество и тип столбцов набора результатов. Есть ли способ сделать это без фактического выполнения запроса? То есть, чтобы Oracle проанализировал запрос и сказал мне, какие итоговые типы данных / имена будут возвращены при фактическом выполнении запроса? Я использую Oracle 10g и это приложение Java 1.5 / Servlet 2.4.

Изменить: пользователи, которые вводят запросы, уже являются пользователями в базе данных. Они аутентифицируются в моем приложении, используя свои учетные данные базы данных, и запросы выполняются с использованием этих учетных данных. Поэтому они не могут вставить ни один запрос, который они не могли бы выполнить, просто подключившись к sqlplus.

Ответы [ 2 ]

7 голосов
/ 02 октября 2008

Вы должны быть в состоянии подготовить запрос SQL для проверки синтаксиса и получения метаданных набора результатов. Подготовка запроса не должна его выполнять.

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

Затем вы можете получить метаданные о каждом столбце набора результатов.

4 голосов
/ 16 января 2009

Если вы хотите сделать это строго через 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 содержит почти все, что вам нужно знать о столбцах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...