Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.06.2018, 12:10
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию Очень глупый вопрос о Хранимых процедурах

Пытаюсь понять и разобраться в этом вопросе и мне не понятен 1 момент.

Правильно ли я понимаю, что хранимые процедуры зарание никак не описать на сервере и чтобы их вызвать мы должны в наш Sql Запрос пихать полное их описание, потом использовать TFDStoredProc?

Если так, то это нужно делать после каждого отключения от сервера?
Понимаю, что вопрос крайне простой, но такая логика кажется мне странной
Либо, если мы их не дропаем - то мы их описали и можем просто вызвать из делфи?

Последний раз редактировалось nixon232, 15.06.2018 в 12:12.
Ответить с цитированием
  #2  
Старый 15.06.2018, 13:27
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Грубо говоря, ответ :
Цитата:
Либо, если мы их не дропаем - то мы их описали и можем просто вызвать из делфи?
Ответить с цитированием
  #3  
Старый 15.06.2018, 19:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Сам спросил, сам ответил

Да, собственно, хранимая процедура это и есть код, который хранится и выполняется в БД. Условно говоря, один раз создали (обычно не из программы, а при создании БД), потом вызываем любое кол-во раз. Соответственно, код процедуры должен быть нейтральным к данным, т.е. у тебя обычно нет возможности менять его для каждого вызова.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
nixon232 (16.06.2018)
  #4  
Старый 15.06.2018, 21:44
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Да, на первый вопрос удалось найти ответ самому. Если можно я еще "потуплю" на тему еще тк. гугл как-то не помогает с этим.
1 можно ли вирнуть функцией не одно значение а нейкий "результат запроса"? (думаю, что нет, уверености нет)

2. можно в конце процедуры "вернуть" набор переменных? без учета out.
то есть что--типа
Код:
BEGIN
DECLARE pid int;
DECLARE pMSG int DEFAULT -1;
set pid =2;
set pMSG =3

SELECT pid, pmsg;
END//  
Ответить с цитированием
  #5  
Старый 15.06.2018, 23:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Да, можно. Тогда процедура должны возвращать либо курсор, либо датасет (зависит от сервера), а на клиенте надо делать что-то типа
Код:
select * from stored_proc_name(:param,...)
2. Нет. Только как курсор.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
nixon232 (16.06.2018)
  #6  
Старый 16.06.2018, 10:22
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Пытаюсь создать простенькую тестовую ф-ю и упорно не компилирует
Код:
DELIMITER //

CREATE FUNCTION IsUser (IN UserName VARCHAR (50)) RETURNS INTEGER
BEGIN
 DECLARE RetVal INTEGER;
SELECT id INTO RetVal FROM table WHERE user=UserName;
 RETURN IFNULL(RetVal, 0);
END //

   DELIMITER ;
и проблема в том, что я не понимаю на что имено Он ругается. Якобы на строку 1, но там делимитер переназначается же
Цитата:
;
/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN UserName VARCHAR (50)) RETURNS INTEGER
BEGIN
DECLARE RetVal INTEGER;
SELE' at line 1 */
Менял даже INTEGER на INT
Mysql

Последний раз редактировалось nixon232, 16.06.2018 в 10:43.
Ответить с цитированием
  #7  
Старый 19.06.2018, 11:58
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Продолжается мое блуждание в трех соснах
Код:
DELIMITER //
DROP procedure IF EXISTS UserExist //

CREATE procedure UserExist (IN UserName VARCHAR(50), out RetMsg int)

  BEGIN

    SELECT id INTO RetMsg FROM Tab WHERE user = UserName;

  END;
//
DELIMITER ;

DELIMITER //
DROP procedure IF EXISTS SomeAuth //
CREATE PROCEDURE SomeAuth (UserName VarCHAR(50))
  BEGIN
    DECLARE pid int DEFAULT 0;
    DECLARE pMSG int DEFAULT 0;
    DECLARE pFile Mediumblob;
    DECLARE IsUser VARCHAR(20);
    set IsUser ='DefVal';
    call UserExist(UserName, @pMSG);

    if pMSG = 0 then
      set pid = 0;
        else
      set pid = 1;
    end iF;
  select @pid, @pMSG ;
  END //

DELIMITER ;
call SomeAuth('eefe490baa7c36fe1d073cc43fdcabf8');
Результат
Цитата:
@pid @pMSG
<null> 20
и сразу куча вопросов
Почему Pid null, если Default 0?
Почему не сработал If? С примерами из инета я отличий не вижу
Код:
mysql> DELIMITER // ;
mysql> CREATE PROCEDURE coursedetails_IFELSE(IN S_Subject Varchar(20), OUT S_Course varchar(50))
   -> BEGIN
   -> DECLARE Sub Varchar(20);
   -> SELECT Subject INTO SUB
   -> FROM Student_info WHERE S_Subject = Subject;
   -> IF Sub = 'Computers' THEN
   -> SET S_Course = 'B.Tech(CSE)';
   -> ELSE
   -> SET S_Course = 'Subject Not in the table ';
   -> END IF;
   -> END //
Query OK, 0 rows affected (0.00 sec
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter