Есть ли способ получить типы / имена неизвестного запроса БД, не выполняя его? -- sql поле с участием database поле с участием oracle поле с участием plsql пол Связанный проблема

Is there a way to get types/names of an unknown db query without executing it?


4
vote

проблема

русский

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

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

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

Английский оригинал

I have a web application where users enter arbitrary sql queries for later batch processing. We want to validate the syntax of the query without actually executing it. Some of the queries will take a long time, which is why we don't want to execute them. I'm using Oracle's dbms_sql.parse to do this.

However, I now have a situation where I need to know the number and type of the result set columns. Is there a way to do this without actually executing the query? That is, to have Oracle parse the query and tell me what the result datatypes/names will be returned when the query is actually executed? I'm using Oracle 10g and and it's a Java 1.5/Servlet 2.4 application.

Edit: The users who enter the queries are already users on the database. They authenticate to my app with their database credentials and the queries are executed using those credentials. Therefore they can't put in any query that they couldn't run by just connecting with sqlplus.

</div
           
       
       

Список ответов

7
 
vote
vote
Лучший ответ
 
<Р> Вы должны быть в состоянии подготовить запрос SQL для проверки синтаксиса и получить результирующий набор метаданных. Подготовка запроса не должен выполнить его.
 <код> import java.sql.*; . . . Connection conn; . . . PreparedStatement ps = conn.prepareStatement("SELECT * FROM foo"); ResultSetMetadata rsmd = ps.getMetaData(); int numberOfColumns = rsmd.getColumnCount();   
<Р> Тогда вы можете получить метаданные о каждом столбце результирующего набора.
 

You should be able to prepare a SQL query to validate the syntax and get result set metadata. Preparing a query should not execute it.

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

Then you can get metadata about each column of the result set.

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

 

If you want to do this strictly through pl/sql then you could do the following:

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; 

the DBMS_SQL.desc_tab contains pretty much all that you would need to know about the columns.

</div
 
 

Связанный проблема

141  Получение только месяц и год от даты SQL  ( Getting only month and year from sql date ) 
Мне нужно добраться только к месяцу. Возникновение из поля даты в SQL Server. ...

2  Функция SQL MAX получил другие таблицы  ( Sql max function get other tables ) 
У меня есть простое отношение «море» с только двумя колоннами, как называется «имя», а другая «глубина». Со следующей командой я могу выводить номер максималь...

0  Как использовать запрос LINQ для обновления базовой таблицы базы данных  ( How do i use a linq query to update the underlying database table ) 
Я использую сильно напечатанный набор данных, и я покажу свой псевдо-код ниже. То, что я пытаюсь сделать, это только выбрать только одно значение столбца из б...

0  Сложный случай утверждения о случаях - Oracle SQL  ( Complex case statement issue oracle sql ) 
написал запрос ниже, но получаю умноженные суммы, потому что агрегация должна произойти перед операторами дела. Полюбил бы несколько советов лучшим способом с...

0  Сумма дебета на базе месяца в SQL  ( Sum of debit on the base of month in sql ) 
У меня есть квитанция об имени таблицы Скретко, как следует, <код> account_no date transaction_type amount s1 2012-7-7 opening ...

0  Java - проблемы с присоединением  ( Java trouble joining tables ) 
Я работаю с базой данных SQL, которая имеет 3 таблицы. Страна, город и деревенскому языку. Строка запросов, которую я создаю, содержит данные, которые наход...

2890  Добавьте столбец с значением по умолчанию на существующую таблицу в SQL Server  ( Add a column with a default value to an existing table in sql server ) 
Как я могу добавить столбец с значением по умолчанию на существующую таблицу в SQL Server 2000 / SQL Server 2005 ? ...

1  Как сопоставить две поля электронной почты, где один содержит дружественный адрес электронной почты  ( How to match two email fields where one contains friendly email address ) 
Одна таблица имеет «<код> s1 --1--1--1--| s2 ---2---2---2| r --12-1-21--2| 3 », а другой имеет «код> s1 --1--1--1--| s2 ---2---2---2| r --12-1-21--2| 4 ». С...

13  Отправьте данные FORM HTML в базу данных SQL через PHP (используя mysqli)  ( Send html form data to sql database via php using mysqli ) 
Я хочу отправить данные, введенные в HTML-форму в мою базу данных SQL, то есть создайте новую строку, приписываю определенные значения в определенные столбцы....

2  Microsoft Access - SQL - внутренний внешний ключ  ( Microsoft access sql internal foreign key ) 
MS Access 2007 поддерживает внутренние зарубежные ключевые ключи в одной таблице? ...

0  SQL Select Query - удаление дубликатов / с ошибками с ошибкой  ( Sql select query removing duplicates misspelled data ) 
Потягивание данных из CMDB в другой репозиторий. Проблема заключается в том, что данные CMDB имеют ошибки с ошибками / дублирующимися записями (например, неко...

0  SQL Server - сохраненная процедура  ( Sql server stored procedure ) 
Я пытаюсь создать сохраненную процедуру в SQL Server 2008. Согласно парсеру, синтаксис в порядке. Однако, когда я пытаюсь выполнить сохраненную процедуру и пр...

8  MySQL Заказ с использованием строки даты данных  ( Mysql order by using date data row ) 
У меня есть запрос что-то подобное: <код> public class AlarmReciever extends BroadcastReceiver { AlarmClock alarmClock=new AlarmClock(); @Override public v...

6  Как решить «Неверное имя объекта» на SQL Server?  ( How to solve invalid object name in sql server ) 
Это сообщение об ошибке возвращено: MSG 208, Уровень 16, Состояние 1, Линия 1 Неверное имя объекта 'eng_prep'. Это происходит после того, как я попроб...

-1  Используйте SELECT Под действие  ( Use select under case statement ) 
Я хочу использовать запрос, который позволяет мне получить два различия в зависимости от фильтра. Я попробовал это, но не работает. <код> CASE WHEN filtre =...

Связанный проблема

141  Получение только месяц и год от даты SQL 
2  Функция SQL MAX получил другие таблицы 
0  Как использовать запрос LINQ для обновления базовой таблицы базы данных 
0  Сложный случай утверждения о случаях - Oracle SQL 
0  Сумма дебета на базе месяца в SQL 
0  Java - проблемы с присоединением 
2890  Добавьте столбец с значением по умолчанию на существующую таблицу в SQL Server 
1  Как сопоставить две поля электронной почты, где один содержит дружественный адрес электронной почты 
13  Отправьте данные FORM HTML в базу данных SQL через PHP (используя mysqli) 
2  Microsoft Access - SQL - внутренний внешний ключ 
0  SQL Select Query - удаление дубликатов / с ошибками с ошибкой 
0  SQL Server - сохраненная процедура 
8  MySQL Заказ с использованием строки даты данных 
6  Как решить «Неверное имя объекта» на SQL Server? 
-1  Используйте SELECT Под действие 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.