![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача sql-запроса из программы в PL/SQL developer
>|< © (2011-05-05 13:12:00)Кто сталкивался с такой проблемой, прошу помочь.
Есть вот такой код, но он не работает:
procedure SendToPLSQLDev(Q: TOracleQuery);
var MHandle, WHandle: THandle;
Data: Pointer;
Size: Integer;
S, Exe, Param: string;
i: Integer;
v: Variant;
procedure AddString(SubString: string);
begin
S := S + SubString + #0;
end;
begin
// PLSQLDevMsg := RegisterWindowMessage(PLSQLDevId);
// Build the string that is going to get transmitted to PL/SQL Developer
S := '';
AddString('Direct Oracle Access'); // First an application name
AddString(QueryName); // Object name
AddString(Q.SQL.Text); // The query text
for i := 0 to Q.VariableCount - 1 do // and the variables
begin // name, type and value
AddString(Q.VariableName(i));
AddString(IntToStr(Q.VariableType(i)));
v := Q.GetVariable(Q.VariableName(i));
if VarIsNull(v) or VarIsEmpty(v) then AddString('') else AddString(string(v));
end;
Size := Length(S);
// Create a block of shared memory
MHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, Size, PLSQLDevId);
if MHandle <> 0 then
begin
Data := MapViewOfFile(MHandle, FILE_MAP_WRITE, 0, 0, Size);
if Data <> nil then
begin
Move(S[1], Data^, Size);
// Send a message that a query is available
WHandle := FindWindow('TPLSQLDevForm', nil);
// If not active, try to wake him up
if WHandle = 0 then
begin
Exe := ReadRegString(HKEY_CLASSES_ROOT, 'PL/SQL Developer\Shell\Open\Command', '');
Param := Q.Session.LogonUsername + '/' + Q.Session.LogonPassword;
if Q.Session.LogonDatabase <> '' then Param := Param + '@' + Q.Session.LogonDatabase;
WinExec(PChar(Exe + ' userid=' + Param), SW_SHOWNORMAL);
Sleep(500); // Give PL/SQL Developer a moment
WHandle := FindWindow('TPLSQLDevForm', nil);
end;
if WHandle <> 0 then SendMessage(WHandle, PLSQLDevMsg, wm_QueryAvailable, Size);
UnmapViewOfFile(Data);
end;
CloseHandle(MHandle);
end;
end;
Посмотрел под отладчиком, окно TPLSQLDevForm находится
ему отправляется SendMessage(WHandle, PLSQLDevMsg, wm_QueryAvailable, Size);
Но фактически ничего не происходит.
Кто знает, в чем может быть проблема? В каком направлении копать?
Заранее благодарен.
>|< (2011-05-12 19:12:00) [1]
> другое дело, что программисту будет несколько удобнее читать
> такой запрос
Соглашусь с тем, что данное правило больше облегчит жизнь тем, кто будет поддерживать эти запросы.
Игорь Шевченко (2011-05-12 18:43:00) [2]
> Все перечисленные выше рекомендации почерпнул именно из
> первой книги.
Тут есть такой момент - Oracle все равно не единожды полезет в словарь данных при разборе запроса, хотя бы для того, чтобы проверить, что поля указаны верные, таблицы указаны верные, и к таблицам и к полям разрешен доступ правами пользователя, выполняющего запрос.
Поэтому
> использование синонимов в именах колонок и в условиях соединения,
> чтобы оракловый парсер не перебирал все таблицы в поисках
> соответствующей колонки
это конечно хорошо, но так как поля все равно будут перебираться, то такое указание ни оптимизатору, ни прочим механизмам скорости вряд ли прибавят.
другое дело, что программисту будет несколько удобнее читать такой запрос, но это совсем другой аспект.
>|< (2011-05-12 18:25:00) [3]
> Игорь Шевченко © (12.05.11 13:20) [33]
Все перечисленные выше рекомендации почерпнул именно из первой книги.
А Льюиса пока только дочитал до середины.
Игорь Шевченко (2011-05-12 13:20:00) [4]>|< (12.05.11 12:38) [32]
Не-не, при чтении Льюиса я не заметил там рекомендаций по оформлению текста запроса для помощи оптимизатору (ну кроме хинтов). Вот и думаю, что я пропустил.
>|< (2011-05-12 12:38:00) [5]
> Вот тут бы еще и страницу неплохо, о том, что оптимизатору
> надо помогать текстом запроса.
Вы хотите мед, так еще и ложкой)))
Cobalt (2011-05-12 10:41:00) [6]А вроде бы есть (был) в Дельфи SQLMonitor, и я даже пользовался им году этак в 99-ом...
Игорь Шевченко (2011-05-11 19:42:00) [7]
> Дж. Льюис. Oracle Основы стоимостной оптимизации.
Вот тут бы еще и страницу неплохо, о том, что оптимизатору надо помогать текстом запроса.
>|< (2011-05-11 15:54:00) [8]Oracle PL/SQL для профессионалов: практические решения / Коннор МакДональд, Хаим
Кац, Бек Кристофер и др. ; Пер. с англ. - СПб. : ООО «ДиаСофтЮП», 2005. — 560 с.
Дж. Льюис. Oracle Основы стоимостной оптимизации.
Игорь Шевченко (2011-05-11 12:23:00) [9]
> Также в печати вышло много умных книг по оптимизации запросов
> и правильному оформлению кода, который облегчит разбор и
> оптимизациию базой.
>
> Например, использование синонимов в именах колонок и в условиях
> соединения, чтобы оракловый парсер не перебирал все таблицы
> в поисках соответствующей колонки.
ой. если не затруднит, пример умной книжки.
>|< (2011-05-11 12:02:00) [10]
> Критерии "человеческого вида" где-то озвучены ?
Есть стандарты написания запросов SQL.
Также в печати вышло много умных книг по оптимизации запросов и правильному оформлению кода, который облегчит разбор и оптимизациию базой.
Например, использование синонимов в именах колонок и в условиях соединения, чтобы оракловый парсер не перебирал все таблицы в поисках соответствующей колонки.
Замена всех литералов на переменные во избежание повторного разбора запроса.
Пересмотр лишних индексов(нашел в БД таблицу, в которой 33 колонки и 28 индексов, таблицы строк заказов, в которой происходят постоянные апдейты и инсерты)
Еще один плюс хранения всех запросов в одной таблице позволит проинспектировать все запросы на предмет множества используемых таблиц, чтобы обозначить актуальные таблицы, которым следует уделить внимание.
Игорь Шевченко (2011-05-11 11:47:00) [11]
> их еще нужно по дороге в БД причесывать к человеческому
> виду
Критерии "человеческого вида" где-то озвучены ?
потому что вид в [24] явно нечеловеческий.
То, что хранится в исходниках, можно без лишнего шума перенести в dfm
>|< (2011-05-11 11:08:00) [12]
> PL/SQL Developer не надо будет насиловать.
связь с PL/SQL Developer-ом - это будет как удобная опция.
Если ее не будет, ничего страшного.
>|< (2011-05-11 11:06:00) [13]
> не проще ли написать "выделятор" запросов из текста/dfm/ресурсов
> и собрать их аккуратно в текстовом файле ?
их еще нужно по дороге в БД причесывать к человеческому виду
к тому же, запросы хранятся не только в компонентах, но и в исходниках.
Например:
strz :=
'Select id_strz,mgr.txt,id_spr,ITEMNAME3UK itemname,kol,concorde_ok,condition,num_nakl,st.stockunit n_ed,id_zak,fio,dt_ustanov,mgr.DISASSEMBLE,st.mountinggrp,in_spr,';
strz := strz +
' Parent_spr,P_SP,STR_CHANGE,strz.dt_vidachi,st.equipmenttype,strz.old_inspr,strz. old_parent,strz.fc_comment';
strz := strz +
' From s_us us,spr_mountinggroups mgr,stocktable st,zakaz z,str_zakaz strz';
strz := strz +
' Where (strz.id_spr=st.itemnumber) AND (st.mountinggrp=mgr.mountinggrp) and (strz.id_zak=z.id_z)';
strz := strz +
' AND (strz.id_ustanov=us.id_us(+)) AND ((IN_SPR=0) OR (IN_SPR=1)) AND (IN_DAT=' + Dat
+ ')';
if ZNakl = True then
strz := strz + ' AND (num_nakl=:nakl)'
else
strz := strz + ' AND (id_zak=:nakl)';
NaklForUst.Close;
NaklForUst.SQL.Clear;
NaklForUst.SQL.ADD(strz);
Не спорю, это плохой код.
И мне нужно что-то с этим делать.
MsGuns (2011-05-11 10:47:00) [14]Удалено модератором
Игорь Шевченко (2011-05-10 19:21:00) [15]не проще ли написать "выделятор" запросов из текста/dfm/ресурсов и собрать их аккуратно в текстовом файле ?
и PL/SQL Developer не надо будет насиловать.
>|< (2011-05-10 18:55:00) [16]
> а зачем для этого гуй скл-девелопера? прямо в базу нельзя
> писать?
Можно.
Но их еще нужно по дороге в БД причесывать к человеческому виду.
Так исторически сложилось, что запросы писались как попало, где попало и кем попало.
Соответственно, данная картина требует пересмотра всех запросов, которые используются в приложении.
Поэтому, для начала их нужно собрать в одном месте.
>|< (2011-05-10 18:32:00) [17]
> какого пакета? процедуры на сервере, внутри их меняй что/как
> угодно. никаких пере-компиляций (ну то что sql тоже "пре-
> компилируется" можно не считать, запросы по номерам то будут
> вообще всегда компилироваться)
Мы говорим о БД Oracle.
Там для удобства введено понятие пакета, который позволяет объединять в себе группу процедур. Если я каждый раз буду добавлять новую, пакет станет инвалидным и потребует перекомпиляции.
Если открывать запрос через параметризированный курсор, выше обозначенных неудобств возможно избежать.
sniknik (2011-05-10 17:36:00) [18]???
какого пакета? процедуры на сервере, внутри их меняй что/как угодно. никаких пере-компиляций (ну то что sql тоже "пре-компилируется" можно не считать, запросы по номерам то будут вообще всегда компилироваться)
>|< (2011-05-10 17:17:00) [19]
> насоздай
> Proc1, Proc2, Proc3, ... Proc9999
потребует перекомпиляции пакета, что не есть гуд.
sniknik (2011-05-10 16:20:00) [20]> напишу ф-цию в БД, которая по номеру запроса будет открывать курсор на соответствующий запрос.
а без извратов? раз уж нравятся номера...
насоздай
Proc1, Proc2, Proc3, ... Proc9999
хотя куча процедур без гибкости, без параметров, само по себе изврат, но поменьше чем запросы по номерам.