Форум: "Начинающим";
Текущий архив: 2011.08.21;
Скачать: [xml.tar.bz2];
ВнизПередача sql-запроса из программы в PL/SQL developer Найти похожие ветки
← →
>|< (2011-05-05 13:12) [0]Кто сталкивался с такой проблемой, прошу помочь.
Есть вот такой код, но он не работает:
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);
Но фактически ничего не происходит.
Кто знает, в чем может быть проблема? В каком направлении копать?
Заранее благодарен.
← →
clickmaker © (2011-05-05 13:16) [1]> Но фактически ничего не происходит.
а что должно происходить?
что тут передается? - SendMessage(WHandle, PLSQLDevMsg, wm_QueryAvailable, Size);
← →
OW © (2011-05-05 14:07) [2]а для чего это все?
← →
>|< (2011-05-05 15:54) [3]
> а для чего это все?
а как иначе?
> что тут передается? - SendMessage(WHandle, PLSQLDevMsg,
> wm_QueryAvailable, Size);
да, только заметил что
// PLSQLDevMsg := RegisterWindowMessage(PLSQLDevId);
и не совсем понятно, как сам запрос из
Data := MapViewOfFile(MHandle, FILE_MAP_WRITE, 0, 0, Size);
попадет в PLSQLDev...
← →
>|< (2011-05-05 15:56) [4]есть еще такие константы:
const // PL/SQL Developer interface
QueryName: string = "";
PLSQLDevId = "PLSQLDevInterface";
PLSQLDevMsg: Cardinal = 0;
wm_QueryAvailable = 1000;
wm_PLSQLDevQueryAvailable = 1001;
← →
OW © (2011-05-05 16:55) [5]
> а как иначе?
не понял, что преследуешь. Цель какая?
если слежу за своими прграммами, то в ODAC есть
omon1: TOraSQLMonitor;
у него есть св-во onSQL
и все запросы программы тут, тупо в мемо их, там и параметры и значения их
скопировать в PL/SQL Developer да F8 нажать..
чужие через
SQLMonitor.exe (OCIHook.dll)
отлавливаются, скопировать в PL/SQL Developer да F8 нажать..
или не то вообще?
← →
>|< (2011-05-05 17:02) [6]
> или не то вообще?
не то.
Мне нужно по нажатию кнопки скопировать в PL/SQL Developer из мой программы, которой я буду этот запрос составлять
← →
sniknik © (2011-05-05 19:33) [7]> Мне нужно
нужда/желание это не цель.
← →
OW © (2011-05-06 10:04) [8]а, понял, вроде
написана вспомогательная программка для генерации sql запросов,
и лень сделать ctrl-c из нее и ctrl-v в PL/SQL Developer,
и хочется сразу что бы сама передавала.
так?
← →
sniknik © (2011-05-06 10:06) [9]> вспомогательная программка для генерации sql запросов
э... а сам PL/SQL Developer не может их генерировать? их же сейчас только ленивый не "генерирует"...
← →
OW © (2011-05-06 10:28) [10]
> э... а сам PL/SQL Developer не может их генерировать?
ну, делфя помощнее будет в работе с строками
← →
MsGuns © (2011-05-06 10:30) [11]Идейка жиденькая какая-то, да и реализация, очевидно, убогенькая :)
← →
Cobalt © (2011-05-10 14:14) [12]попробуй сделать проще - найти окно этого "PL/SQL developer", в нем найти дочернее memo, и в него, в это дочернее memo, WM_SETTEXT"ом передать текст запроса.
← →
>|< (2011-05-10 15:45) [13]
> а, понял, вроде
> написана вспомогательная программка для генерации sql запросов,
>
> и лень сделать ctrl-c из нее и ctrl-v в PL/SQL Developer,
>
> и хочется сразу что бы сама передавала.
> так?
так
← →
>|< (2011-05-10 15:50) [14]
> попробуй сделать проще - найти окно этого "PL/SQL developer",
> в нем найти дочернее memo, и в него, в это дочернее memo,
> WM_SETTEXT"ом передать текст запроса.
да, так и думал сделать.
но для начала нужно программно создать в девелопере новое SQL-окно и тогда уже передавать через WM_SETTEXT
увы, не силен в винапи(
как найти окно - смогу, а как нажать пункт главного меню "Файл/Создать/SQL окно" - не знаю.
← →
>|< (2011-05-10 15:54) [15]
> а сам PL/SQL Developer не может их генерировать
может. и не только он может.
> нужда/желание это не цель.
Цель - вытащить все sql-запросы из программы и записать их в БД.
Собирать запросы буду в рантайме, пройдясь по всем компонентам доступа к БД на открытой форме.
Эта фича нужна как неосновная, чтобы можно было передать в девелопер для доработки запроса напильником в случае необходимости.
Потом все запросы заменю на их номера, напишу ф-цию в БД, которая по номеру запроса будет открывать курсор на соответствующий запрос.
← →
clickmaker © (2011-05-10 15:56) [16]> Цель - вытащить все sql-запросы из программы и записать
> их в БД.
а зачем для этого гуй скл-девелопера? прямо в базу нельзя писать?
← →
sniknik © (2011-05-10 16:20) [17]> напишу ф-цию в БД, которая по номеру запроса будет открывать курсор на соответствующий запрос.
а без извратов? раз уж нравятся номера...
насоздай
Proc1, Proc2, Proc3, ... Proc9999
хотя куча процедур без гибкости, без параметров, само по себе изврат, но поменьше чем запросы по номерам.
← →
>|< (2011-05-10 17:17) [18]
> насоздай
> Proc1, Proc2, Proc3, ... Proc9999
потребует перекомпиляции пакета, что не есть гуд.
← →
sniknik © (2011-05-10 17:36) [19]???
какого пакета? процедуры на сервере, внутри их меняй что/как угодно. никаких пере-компиляций (ну то что sql тоже "пре-компилируется" можно не считать, запросы по номерам то будут вообще всегда компилироваться)
← →
>|< (2011-05-10 18:32) [20]
> какого пакета? процедуры на сервере, внутри их меняй что/как
> угодно. никаких пере-компиляций (ну то что sql тоже "пре-
> компилируется" можно не считать, запросы по номерам то будут
> вообще всегда компилироваться)
Мы говорим о БД Oracle.
Там для удобства введено понятие пакета, который позволяет объединять в себе группу процедур. Если я каждый раз буду добавлять новую, пакет станет инвалидным и потребует перекомпиляции.
Если открывать запрос через параметризированный курсор, выше обозначенных неудобств возможно избежать.
← →
>|< (2011-05-10 18:55) [21]
> а зачем для этого гуй скл-девелопера? прямо в базу нельзя
> писать?
Можно.
Но их еще нужно по дороге в БД причесывать к человеческому виду.
Так исторически сложилось, что запросы писались как попало, где попало и кем попало.
Соответственно, данная картина требует пересмотра всех запросов, которые используются в приложении.
Поэтому, для начала их нужно собрать в одном месте.
← →
Игорь Шевченко © (2011-05-10 19:21) [22]не проще ли написать "выделятор" запросов из текста/dfm/ресурсов и собрать их аккуратно в текстовом файле ?
и PL/SQL Developer не надо будет насиловать.
← →
MsGuns © (2011-05-11 10:47) [23]Удалено модератором
← →
>|< (2011-05-11 11:06) [24]
> не проще ли написать "выделятор" запросов из текста/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);
Не спорю, это плохой код.
И мне нужно что-то с этим делать.
← →
>|< (2011-05-11 11:08) [25]
> PL/SQL Developer не надо будет насиловать.
связь с PL/SQL Developer-ом - это будет как удобная опция.
Если ее не будет, ничего страшного.
← →
Игорь Шевченко © (2011-05-11 11:47) [26]
> их еще нужно по дороге в БД причесывать к человеческому
> виду
Критерии "человеческого вида" где-то озвучены ?
потому что вид в [24] явно нечеловеческий.
То, что хранится в исходниках, можно без лишнего шума перенести в dfm
← →
>|< (2011-05-11 12:02) [27]
> Критерии "человеческого вида" где-то озвучены ?
Есть стандарты написания запросов SQL.
Также в печати вышло много умных книг по оптимизации запросов и правильному оформлению кода, который облегчит разбор и оптимизациию базой.
Например, использование синонимов в именах колонок и в условиях соединения, чтобы оракловый парсер не перебирал все таблицы в поисках соответствующей колонки.
Замена всех литералов на переменные во избежание повторного разбора запроса.
Пересмотр лишних индексов(нашел в БД таблицу, в которой 33 колонки и 28 индексов, таблицы строк заказов, в которой происходят постоянные апдейты и инсерты)
Еще один плюс хранения всех запросов в одной таблице позволит проинспектировать все запросы на предмет множества используемых таблиц, чтобы обозначить актуальные таблицы, которым следует уделить внимание.
← →
Игорь Шевченко © (2011-05-11 12:23) [28]
> Также в печати вышло много умных книг по оптимизации запросов
> и правильному оформлению кода, который облегчит разбор и
> оптимизациию базой.
>
> Например, использование синонимов в именах колонок и в условиях
> соединения, чтобы оракловый парсер не перебирал все таблицы
> в поисках соответствующей колонки.
ой. если не затруднит, пример умной книжки.
← →
>|< (2011-05-11 15:54) [29]Oracle PL/SQL для профессионалов: практические решения / Коннор МакДональд, Хаим
Кац, Бек Кристофер и др. ; Пер. с англ. - СПб. : ООО «ДиаСофтЮП», 2005. — 560 с.
Дж. Льюис. Oracle Основы стоимостной оптимизации.
← →
Игорь Шевченко © (2011-05-11 19:42) [30]
> Дж. Льюис. Oracle Основы стоимостной оптимизации.
Вот тут бы еще и страницу неплохо, о том, что оптимизатору надо помогать текстом запроса.
← →
Cobalt © (2011-05-12 10:41) [31]А вроде бы есть (был) в Дельфи SQLMonitor, и я даже пользовался им году этак в 99-ом...
← →
>|< (2011-05-12 12:38) [32]
> Вот тут бы еще и страницу неплохо, о том, что оптимизатору
> надо помогать текстом запроса.
Вы хотите мед, так еще и ложкой)))
← →
Игорь Шевченко © (2011-05-12 13:20) [33]>|< (12.05.11 12:38) [32]
Не-не, при чтении Льюиса я не заметил там рекомендаций по оформлению текста запроса для помощи оптимизатору (ну кроме хинтов). Вот и думаю, что я пропустил.
← →
>|< (2011-05-12 18:25) [34]
> Игорь Шевченко © (12.05.11 13:20) [33]
Все перечисленные выше рекомендации почерпнул именно из первой книги.
А Льюиса пока только дочитал до середины.
← →
Игорь Шевченко © (2011-05-12 18:43) [35]
> Все перечисленные выше рекомендации почерпнул именно из
> первой книги.
Тут есть такой момент - Oracle все равно не единожды полезет в словарь данных при разборе запроса, хотя бы для того, чтобы проверить, что поля указаны верные, таблицы указаны верные, и к таблицам и к полям разрешен доступ правами пользователя, выполняющего запрос.
Поэтому
> использование синонимов в именах колонок и в условиях соединения,
> чтобы оракловый парсер не перебирал все таблицы в поисках
> соответствующей колонки
это конечно хорошо, но так как поля все равно будут перебираться, то такое указание ни оптимизатору, ни прочим механизмам скорости вряд ли прибавят.
другое дело, что программисту будет несколько удобнее читать такой запрос, но это совсем другой аспект.
← →
>|< (2011-05-12 19:12) [36]
> другое дело, что программисту будет несколько удобнее читать
> такой запрос
Соглашусь с тем, что данное правило больше облегчит жизнь тем, кто будет поддерживать эти запросы.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.08.21;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.004 c