Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание хранимой процедуры в Oracle в RunTime [D7]


mefodiy ©   (2005-02-04 16:05:00) 

Для выполнения Sql запроса использую SQLConnection. Код на нажатие кнопки следующий:
procedure TMainForm.Button1Click(Sender: TObject);
 var sql_str: string;
begin
 sql_str := 'CREATE OR REPLACE PROCEDURE MyFindNds(f_kod IN  VARCHAR2(8),f_nds OUT INTEGER) IS '+
                        'BEGIN '+
                          'SELECT Nds INTO f_nds FROM MAL '+
                          'WHERE MAL.kod = f_kod '+
                        'END MyFindNds ';
 SQLConnection1.Execute(sql_str,Nil,Nil);

end;
При выполнении программы никакой ошибки не выдается, но и процедура не создается (хотя вижу, что обращение к серверу происходит).
В чем тут дело? Спасибо.


mefodiy   (2005-02-10 16:36:00) [1]

Проблема разрешилась. Ограничитель '/' оказался лишним.
Всем спасибо.


mefodiy   (2005-02-10 14:15:00) [2]

Простите за поздний возврат к теме. Не было возможности "выйти в эфир".
Отладил процедуру в SQL*Plus. Вот текст:
CREATE OR REPLACE PROCEDURE MyFindNds(
                    f_kod IN VARCHAR2,
                    f_nds OUT INTEGER)
 IS
 BEGIN
   SELECT Nds INTO f_nds FROM MAL WHERE MAL.Kod = f_kod;
 END MyFindKdv;
/
Процедура номально создается со статусом Valid и выполняется из Дельфи без проблем.
Делаю то же самое через Дельфи:

var sql_str: string;
begin
sql_str := 'CREATE OR REPLACE PROCEDURE MyFindNds(f_kod IN  VARCHAR2,f_nds OUT INTEGER) IS '+
                      'BEGIN '+
                        'SELECT Nds INTO f_nds FROM MAL '+
                        'WHERE MAL.kod = f_kod; '+
                      'END MyFindNds; '+
                      '/';
SQLConnection1.Execute(sql_str,Nil,Nil);
end;

процедура создается со статусом Invalid и естественно не выпоняется.


Reindeer Moss Eater   (2005-02-04 18:01:00) [3]

А может не мудрствовать и отладить ТЕКСТ процедуры в нативном инструменте, и уже потом точить процесс ВЫПОЛНЕНИЯ заведомо правильного скрипта?

Кроме того, у тебя не хватает ограничителя команды после текста процедуры

/


mefodiy   (2005-02-04 17:50:00) [4]

Кое-что исправил (убрал (8) из VARCHAR2 и добавил в двух строках ';'):
procedure TMainForm.Button1Click(Sender: TObject);
var sql_str: string;
begin
sql_str := 'CREATE OR REPLACE PROCEDURE MyFindNds(f_kod IN  VARCHAR2,f_nds OUT INTEGER) IS '+
                       'BEGIN '+
                         'SELECT Nds INTO f_nds FROM MAL '+
                         'WHERE MAL.kod = f_kod; '+
                       'END MyFindNds; ';
SQLConnection1.Execute(sql_str,Nil,Nil);
end;
Теперь процедура создается, но со статусом 'INVALID'


Reindeer Moss Eater   (2005-02-04 17:15:00) [5]

В плюсе этот скрипт даст точно такой же результат


DenK_vrtz   (2005-02-04 16:28:00) [6]

можно еще записать этот скрипт в файл и прогнать в SQL Plus

к примеру:
WinExec('C:\orant\BIN\PLUS80W.EXE Схема/Пароль@Service_Name  @<имя файла>',1)


Reindeer Moss Eater   (2005-02-04 16:06:00) [7]

/


Наверх

Титульная страница Поиск, карта сайта Написать письмо