Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2010, 13:35   #1
new player
Форумчанин
 
Регистрация: 30.08.2010
Сообщений: 153
Вопрос Вызов функции

Всем доброго дня

Пытаюсь вызвать из Delphi функцию sql:

Код:
/*
		добавить группу
		возвращает идентификатор созданной группы
*/
function add_group (	p_group_code	varchar2, - код группы (макс 30 символов)
			p_group_name	varchar2  - имя группы (макс 128 символов)
			) return number;
В Oracle SQL Developer это реализуется следующим образом

Код:
declare
v number;
begin
  v:=SYS_ADM.ADMIN.ADD_GROUP(	'D4','G3');
end;
В Delphi использую ADOStoredProc. Подключаю его к нужным компонентам, в Procedure Name выбираю ADD_GROUP, вручную забиваю параметры.

Код:
ADOStoredProc.Parameters.ParamValues['p_group_code'] := Edit1.Text;
ADOStoredProc_add_group.Parameters.ParamValues['p_group_name'] := Edit2.Text;
ADOStoredProc_add_group.ExecProc;
Вылетает ошибка

Цитата:
ORA-06550: line 1, column 7:
PLS-00221:’ADD_GROUP’ is not a procedure or is undefined
ORA-06550: line1, column 7:
PL/SQL: Statement ignored.
Связана ошибка, видимо, с тем, что должен быть возвращен return number, но как это реализовать не знаю.
new player вне форума Ответить с цитированием
Старый 05.10.2010, 15:36   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну во-первых, имя процедуры будет ADMIN.ADD_GROUP (как я понял, у тебя эта функа описана в пакете)

ну и во-вторых, собсна возврат значения
но имхо проще сделать запрос вида
Код:
select ADMIN.ADD_GROUP('D4','G3') as res from dual
и проверь права на пакет
soleil@mmc вне форума Ответить с цитированием
Старый 05.10.2010, 16:03   #3
new player
Форумчанин
 
Регистрация: 30.08.2010
Сообщений: 153
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
ну во-первых, имя процедуры будет ADMIN.ADD_GROUP (как я понял, у тебя эта функа описана в пакете)

ну и во-вторых, собсна возврат значения
но имхо проще сделать запрос вида
Код:
select ADMIN.ADD_GROUP('D4','G3') as res from dual
и проверь права на пакет
soleil@mmc

Сделал так

Код:
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('select ADMIN.ADD_GROUP("D9","G9") as res from dual');
ADOQuery.ExecSQL;
Ошибка:

Цитата:
ORA-00904: ''G9' : invalid identifier
И такой же рассклад при любом втором параметре.

Вхожу в базу, как system. Остальные процедуры из пакет ADMIN доступны.

Что такое
Цитата:
as res from dual
?
new player вне форума Ответить с цитированием
Старый 05.10.2010, 23:16   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

это просто селект
его нужно открывать
Код:
ADOQuery.Open;
ну и ваще-то байнд_вариейбл рулит
Код:
var
  answer: double;
begin
.....

ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('select ADMIN.ADD_GROUP(:p0, :p1) as res from dual');
ADOQuery.Params.ParamByName('p0').asString := 'D9';
ADOQuery.Params.ParamByName('p1').asString := 'G9';
ADOQuery.Open;
answer := ADOQuery.FieldByName('res').AsFloat;

...
end;
дуал - ну табличка такая в памяти для всяких полезных вещей (можешь погуглить для подробностей)

Последний раз редактировалось soleil@mmc; 05.10.2010 в 23:20.
soleil@mmc вне форума Ответить с цитированием
Старый 06.10.2010, 09:44   #5
new player
Форумчанин
 
Регистрация: 30.08.2010
Сообщений: 153
Печаль

Попробовал так:

Код:
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('select ADMIN.ADD_GROUP(:p0, :p1) as res from dual');
ADOQuery.Parameters.ParamByName('p0').asString := 'D9';
ADOQuery.Parameters.ParamByName('p1').asString := 'G9';
ADOQuery.Open;
answer := ADOQuery.FieldByName('res').AsFloat;
ругается
Цитата:
Undeclared identifier: 'asString'
Попробовал так

Код:
ADOQuery.Parameters.ParamByName('p_group_code').DataType := ftString;
ADOQuery.Parameters.ParamByName('p_group_code').Value := 'D9';
Ругается
Цитата:
Undeclared identifier: 'ftString'
new player вне форума Ответить с цитированием
Старый 07.10.2010, 13:01   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ты для начала попробуй такой запрос в скл_девелопере или скл_плюсе
Код:
select ADMIN.ADD_GROUP('D9', 'G9') as res from dual
работает?
если нет, то ты не все рассказал про свою функу в пакете,
если да, то тебе нужно разбираться куда смотрят твои компоненты в приладе и т.п.
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вызов вложенной функции veter_s_morya PHP 1 12.11.2009 11:33
Вызов процедуры/функции W0LF Общие вопросы Delphi 7 26.07.2009 23:53
Вызов функции по событию phobos Общие вопросы .NET 8 26.05.2009 01:06
Вызов функции MarSeON PHP 2 01.08.2008 20:22
Вызов функции по таймеру Lexicss Общие вопросы Delphi 4 30.05.2007 22:47