|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Очень глупый вопрос о Хранимых процедурах
Пытаюсь понять и разобраться в этом вопросе и мне не понятен 1 момент.
Правильно ли я понимаю, что хранимые процедуры зарание никак не описать на сервере и чтобы их вызвать мы должны в наш Sql Запрос пихать полное их описание, потом использовать TFDStoredProc? Если так, то это нужно делать после каждого отключения от сервера? Понимаю, что вопрос крайне простой, но такая логика кажется мне странной Либо, если мы их не дропаем - то мы их описали и можем просто вызвать из делфи? Последний раз редактировалось nixon232, 15.06.2018 в 12:12. |
#2
|
|||
|
|||
Грубо говоря, ответ :
Цитата:
|
#3
|
|||
|
|||
Сам спросил, сам ответил
Да, собственно, хранимая процедура это и есть код, который хранится и выполняется в БД. Условно говоря, один раз создали (обычно не из программы, а при создании БД), потом вызываем любое кол-во раз. Соответственно, код процедуры должен быть нейтральным к данным, т.е. у тебя обычно нет возможности менять его для каждого вызова. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
nixon232 (16.06.2018)
|
#4
|
|||
|
|||
Да, на первый вопрос удалось найти ответ самому. Если можно я еще "потуплю" на тему еще тк. гугл как-то не помогает с этим.
1 можно ли вирнуть функцией не одно значение а нейкий "результат запроса"? (думаю, что нет, уверености нет) 2. можно в конце процедуры "вернуть" набор переменных? без учета out. то есть что--типа Код:
BEGIN DECLARE pid int; DECLARE pMSG int DEFAULT -1; set pid =2; set pMSG =3 SELECT pid, pmsg; END// |
#5
|
|||
|
|||
1. Да, можно. Тогда процедура должны возвращать либо курсор, либо датасет (зависит от сервера), а на клиенте надо делать что-то типа
Код:
select * from stored_proc_name(:param,...) |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
nixon232 (16.06.2018)
|
#6
|
|||
|
|||
Пытаюсь создать простенькую тестовую ф-ю и упорно не компилирует
Код:
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 ; Цитата:
Mysql Последний раз редактировалось nixon232, 16.06.2018 в 10:43. |
#7
|
|||
|
|||
Продолжается мое блуждание в трех соснах
Код:
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 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 |