![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хранимые процедуры в MS SQL [D5, MSSQL]
____Nikolay © (2003-12-16 18:13:00)
Не могу использовать хранимую процедуру, точнее функцию
Идея проста: в качестве входного параметра передаю ID учителя,
и получаю его оклад. Код такой:
CREATE FUNCTION dbo.FUNC_GET_TEACHERS_SALARY (@ITEACHERS_ID int)
RETURNS decimal(15,2) AS
BEGIN
DECLARE @FTEACHERS_SALARY decimal(15,2);
SELECT @FTEACHERS_SALARY = T.SALARY
from TEACHERS T
where T.ID = @ITEACHERS_ID;
RETURN @FTEACHERS_SALARY;
END
Использовать пытаюсь сначала в SQL Query Analyzer"e
SELECT *
FROM TEST.dbo.FUNC_GET_TEACHERS_SALARY(2)
TEST - имя БД
На что выдается ошибка: "Invalid object name "TEST.dbo.GET_TEACHERS_SALARY""
Если за место процедуры поставить имя таблицы - все нормально будет отрабатываться
И при работе в Delphi тоже не могу воспользоваться этой функцией:
// Получить зарплату преподавателя
function TForm1.GetTeachersSalary(ITEACHERS_ID: integer): double;
begin
with ADOStoredProc1 do
begin
ProcedureName := "FUNC_GET_TEACHERS_SALARY;1";
Parameters.Clear;
with Parameters.AddParameter do
begin
Name := "@ITEACHERS_ID";
DataType := ftInteger;
Direction := pdInput;
Precision := 10;
end;
with Parameters.AddParameter do
begin
Name := "@RETURN_VALUE";
DataType := ftBCD;
Direction := pdReturnValue;
NumericScale := 2;
Precision := 15;
end;
Parameters[0].Value := ITEACHERS_ID;
ExecProc;
Result := Parameters[1].Value;
end;
end;
В момент выполнения процедуры, говорит, что определено слишком
много параметров "Procedure or function FUNC_GET_TEACHERS_SALARY
has too many arguments specified"
1. Как быть в первом случае, когда процедуру нужно выполнить в SQL Query Analyzer"e
2. Почему в Delphi при работе с хранимыми процедурами с использованием ADO возникает ошибка
a. Почему такие сложности с параметрами (каждый нужно программно добавлять). В Interbase
при присвоении новой процедуры, ее параметры сразу известны
b. Как можно обращаться к параметрам по имени, а не по индексу?
____Nikolay (2003-12-16 20:55:00) [1]
Следуя совету, пробую использовать ADOCommand вместо ADOStoredProc
Почему-то выходной параметр всегда NULL
// Получить зарплату преподавателя (способ 3)
function TForm1.GetTeachersSalary3(ITEACHERS_ID: integer): double;
begin
with ADOCommand1 do
begin
CommandText := "SELECT :SAL = dbo.FUNC_GET_TEACHERS_SALARY(:ITEACHERS_ID)";
Parameters.Clear;
with Parameters.AddParameter do
begin
Name := "@ITEACHERS_ID";
DataType := ftInteger;
Direction := pdInput;
Precision := 10;
end;
with Parameters.AddParameter do
begin
Name := "@SAL";
DataType := ftBCD;
Direction := pdOutput;
NumericScale := 2;
Precision := 15;
end;
Parameters.ParamValues["@ITEACHERS_ID"] := ITEACHERS_ID;
Execute;
if VarIsNull(Parameters.ParamValues["@SAL"]) then
Result := 0 // <- Всегда NULL !!!
else
Result := double(Parameters.ParamValues["@SAL"]);
end;
end;
Подскажите, пожалуйста, где ошибка
или закиньте кусочек кода из какого-нибудь проекта с использованием ADOCommand
____Nikolay (2003-12-16 19:01:00) [2]
Спасибо!
ZrenBy (2003-12-16 18:53:00) [3]
сорри
b. ADOSP.Parameters.ParamValues["@I_PAR"] := 123
ZrenBy (2003-12-16 18:50:00) [4]
1. SELECT TEST.dbo.FUNC_GET_TEACHERS_SALARY(2)
2. Используй TADOCommand
a. Никаих сложностей. Работа с ADO оптимизирована не для Delphi
b. ADOSP.Parameters[2].Value
ADOSP.Parameters.Items[3].Value
kostik78ua (2003-12-16 18:39:00) [5]
SELECT * FROM TEST.dbo.FUNC_GET_TEACHERS_SALARY(2) ????
Если у тебя функция возвращает decimal(15,2), то как можно ее подставлять во FROM ????
Могу предположить что нужно было сделать:
SELECT ID, FUNC_GET_TEACHERS_SALARY(ID) FROM TEACHERS
JibSkeart (2003-12-16 18:22:00) [6]
случай 2
хмм а он тебе случаем не ставит параметры автоматом
всмысле TAdostoredproc
попробуй не добовлять сам параметры .