Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как проверить на синтаксис sql запрос без его исполнения  [new]
niargnus
Guest
Добрый день.

Хотелось бы понять следующее:
Можно или нет проверить синтаксис (правильно ли проставлены запятые, написано ли select или например опечатка и написано seletc) sql запроса без его исполнения. Исполнять запрос крайне не желательно, т.к. его выполнение может быть долгим.
Если можно, то как? Нужна функция/ключевое слово Oracle 9i, либо java метод jdbc.

Спасибо.
16 авг 07, 16:28    [4536162]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
план запросите
16 авг 07, 16:31    [4536182]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
Elic
Member

Откуда:
Сообщений: 29976
dbms_sql.parse
16 авг 07, 16:59    [4536443]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
OraDen
Member

Откуда:
Сообщений: 828
Jannny
план запросите
+1

explain plan for select aaa from dual;

Заодно и план посмотрите
16 авг 07, 17:16    [4536605]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
Timm
Member

Откуда: Moscow, Ё-burg
Сообщений: 3696
OraDen
Jannny
план запросите
+1

explain plan for select aaa from dual;

Заодно и план посмотрите

-1.
explain plan = постоянный хард парс.
TIM@test>explain plan for
  2  select 1
  3  from
  4     t t1,
  5     t t2,
  6     t t3,
  7     t t4,
  8     t t5,
  9     t t6,
 10     t t7,
 11     t t8,
 12     t t9,
 13     t t10
 14  where
 15     t1.owner=t2.owner and
 16     t2.owner=t3.owner and
 17     t3.owner=t4.owner and
 18     t4.owner=t5.owner and
 19     t5.owner=t6.owner and
 20     t6.owner=t7.owner and
 21     t7.owner=t8.owner and
 22     t8.owner=t9.owner and
 23     t9.owner='asdf'
 24  /

Explained.

TIM@test>/

Explained.

TIM@test>/

Explained.
explain plan for
select 1
from
   t t1,
   t t2,
   t t3,
   t t4,
   t t5,
   t t6,
   t t7,
   t t8,
   t t9,
   t t10
where
   t1.owner=t2.owner and
   t2.owner=t3.owner and
   t3.owner=t4.owner and
   t4.owner=t5.owner and
   t5.owner=t6.owner and
   t6.owner=t7.owner and
   t7.owner=t8.owner and
   t8.owner=t9.owner and
   t9.owner='asdf'

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        3      0.98       0.97          0          0          0           0
Execute      3      0.04       0.04          2          0         32           0
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        6      1.03       1.02          2          0         32           0

Misses in library cache during parse: 3
Optimizer mode: ALL_ROWS
Parsing user id: 65  
16 авг 07, 17:37    [4536803]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
niargnus
Guest
dbms_sql.parse - по-моему только в PL/SQL -е используеться, а мне нужно без него обойтись.

explain plan for ...
думаю подойдет.

Большое спасибо, выручили! :)
16 авг 07, 17:51    [4536953]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
niargnus
dbms_sql.parse - по-моему только в PL/SQL -е используеться, а мне нужно без него обойтись.
Это отчего может быть такое ограничение? Какая Вам, пардон, разница?
16 авг 07, 18:03    [4537068]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
если пользуетесь sql plus
то можно

SQL>set autotrace traceonly explain
SQL>--ваш запрос
16 авг 07, 18:04    [4537078]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
Timm
Member

Откуда: Moscow, Ё-burg
Сообщений: 3696
niargnus
dbms_sql.parse - по-моему только в PL/SQL -е используеться, а мне нужно без него обойтись.

explain plan for ...
думаю подойдет.

Большое спасибо, выручили! :)

не делай explain plan.
делай так:
  1  create or replace procedure do_parse(p_sql varchar2)
  2  is
  3     l_cursor number;
  4  begin
  5     l_cursor := dbms_sql.open_cursor;
  6     dbms_sql.parse(l_cursor, p_sql, dbms_sql.native);
  7     dbms_sql.close_cursor(l_cursor);
  8  exception when others then
  9     if dbms_sql.is_open(l_cursor) then
 10         dbms_sql.close_cursor(l_cursor);
 11     end if;
 12     raise;
 13* end;
TIM@test>/

Procedure created.
public static final String SQL = "select 1\n"
                                 + "from\n"
//...
                                 + "   t9.owner=?";
public static final void main(String[] args) throws SQLException, ClassNotFoundException
{
    Connection conn = getConnection();
    for (int i = 0; i < 5; i++)
    {
        try
        {
            doParse(conn, SQL);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
}
private static void doParse(Connection conn, String sql) throws SQLException
{
    CallableStatement cstmt = conn.prepareCall("begin do_parse(?); end;");
    //replaceAll - по вкусу
    cstmt.setString(1, sql.replaceAll("\\?", ":1"));
    cstmt.execute();
}
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        5      0.28       0.28          0          0          0           0
Execute      0      0.00       0.00          0          0          0           0
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        5      0.28       0.28          0          0          0           0
16 авг 07, 18:17    [4537172]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
Elic
Member

Откуда:
Сообщений: 29976
Timm
делай так:
Всё-таки с точки зрения bind-переменных dbms_sql неудобен :)
16 авг 07, 18:23    [4537219]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Timm
не делай explain plan.
то есть Вы считаете, что тут все очень критично по производительности?
16 авг 07, 18:24    [4537225]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
Timm

-1.
explain plan = постоянный хард парс.


скорее всего человек сидит на test-ой или дома.....ему, скорее всего, производительность не критична....предпочтение отдается удобству....
зы: все это имхо и я могу ошибаться
16 авг 07, 18:27    [4537246]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
Timm
Member

Откуда: Moscow, Ё-burg
Сообщений: 3696
Люди, вы меня удивляете.
Я фсё сказал.
:)
16 авг 07, 18:44    [4537312]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить на синтаксис sql запрос без его исполнения  [new]
Elic
Member

Откуда:
Сообщений: 29976
Timm
Люди, вы меня удивляете.
Слишком глубоко копаешь. Параноидально слишком :)
16 авг 07, 18:48    [4537326]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить