Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1304022600
Юрий
2011-04-29 00:30
2011.08.21
С днем рождения ! 29 апреля 2011 пятница


2-1305003614
FIL-23
2011-05-10 09:00
2011.08.21
Вызов формы в delphi xe


2-1305007271
ixen
2011-05-10 10:01
2011.08.21
Как отобразить JPG из BLOB поля в FreeReport


15-1304271691
Сергей
2011-05-01 21:41
2011.08.21
Форумы по вебдизайну и вебпрограммированию


15-1303911419
Scott Storch
2011-04-27 17:36
2011.08.21
Проектирование БД - использование нескольких категорий





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский