Текущий архив: 2004.01.13;
Скачать: CL | DM;
ВнизХранимые процедуры в MS SQL Найти похожие ветки
← →
____Nikolay (2003-12-16 18:13) [0]Не могу использовать хранимую процедуру, точнее функцию
Идея проста: в качестве входного параметра передаю 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. Как можно обращаться к параметрам по имени, а не по индексу?
← →
JibSkeart (2003-12-16 18:22) [1]случай 2
хмм а он тебе случаем не ставит параметры автоматом
всмысле TAdostoredproc
попробуй не добовлять сам параметры .
← →
kostik78ua (2003-12-16 18:39) [2]SELECT * FROM TEST.dbo.FUNC_GET_TEACHERS_SALARY(2) ????
Если у тебя функция возвращает decimal(15,2), то как можно ее подставлять во FROM ????
Могу предположить что нужно было сделать:
SELECT ID, FUNC_GET_TEACHERS_SALARY(ID) FROM TEACHERS
← →
ZrenBy (2003-12-16 18:50) [3]1. SELECT TEST.dbo.FUNC_GET_TEACHERS_SALARY(2)
2. Используй TADOCommand
a. Никаих сложностей. Работа с ADO оптимизирована не для Delphi
b. ADOSP.Parameters[2].Value
ADOSP.Parameters.Items[3].Value
← →
ZrenBy (2003-12-16 18:53) [4]сорри
b. ADOSP.Parameters.ParamValues["@I_PAR"] := 123
← →
____Nikolay (2003-12-16 19:01) [5]Спасибо!
← →
____Nikolay (2003-12-16 20:55) [6]Следуя совету, пробую использовать 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
Страницы: 1 вся ветка
Текущий архив: 2004.01.13;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.011 c