Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Вниз

Проблема с передачей параметров в хранимую процедуру   Найти похожие ветки 

 
korvin ©   (2004-12-03 23:22) [0]

Есть хранимая на сервере процедура в которую нужно передать параметры DATA_FIRST и DATE_LAST (тип DATE) из программы
И тут проблема - параметры не обязательные и юзеру позволено их опустить,
Используются так:
and (DATA_DOK>=:DATE_FIRST)
and (DATA_DOK<=:DATE_LAST)

но получение такого параметра с значением nul даёт пустой результат на выходе.
Как передавать параметры в процедуру при выполнении программы?
Как не задавая один или оба эти параметра получить результат процедуры?


 
Ильичев С.А. ©   (2004-12-03 23:30) [1]

Так а ты проверяй перед вызовом процедуры.
Если не задана например DATE_FIRST то задавай
её сам - минимальное возможное значение (если я
правильно понял по смыслу) 12/30/1899

иль в самой процедуре такую же проверочку


 
DrPass ©   (2004-12-03 23:31) [2]

Ну так проверяй их перед тем как выполнять процедуру -
if (data_dok is null) then ... else ...


 
Johnmen ©   (2004-12-04 01:39) [3]

and ((:opustitь=1) or (DATA_DOK>=:DATE_FIRST))


 
korvin ©   (2004-12-04 08:23) [4]

Johnmen ©   (04.12.04 01:39) [3]
А ведь правда ;)
Наверно плохо вечером уже мозги ворочались, что не додумался, спасибо.


 
korvin ©   (2004-12-04 16:16) [5]

Остался ещё один вопрос - как передавать значения входящего параметра в процедуру во время работы программы.


 
korvin ©   (2004-12-04 16:18) [6]

Есть ещё одна проблемка. Кроме параметров дат в процедуру хотел передавать ещё несколько параметров, но их количетво сзаранее неизвестно.
Например, есть поле POLE1 (varchar(1)) и нужно получить на выходе из процедуры таблицу с значениями этого поля равными "1" и "2", в другом случае может потребоваться поставить условия отбора равными "0","1","5","7"...
Как организовать такую процедуру. Ведь сзаранее неизвестно количество входящих параметров.
Может какой цыкл в процедуре закрутить? А не то вообще под каждый отдельный запрос мастерить свою процедуру в рантайм, а потом её убивать?


 
Ильичев С.А. ©   (2004-12-04 16:47) [7]

2 [5] korvin ©   (04.12.04 16:16)

> Остался ещё один вопрос - как передавать значения входящего
> параметра в процедуру во время работы программы.


=))
У меня вопрос посложнее.
Как передавать значения входящего параметра в процедуру в то время когда программа не работает.


 
DSKalugin ©   (2004-12-04 17:27) [8]

Отказаться от идеи работать с использованием хранимой процедуры и перейти на ипользование обычного динамическиформируемого в процессе работы запроса

для этого можно менять одну строку в готовом запросе
Query1.close;
Query1.SQL.Strings[16]:=VarSQL_TEXT;
Query1.open;

или весь текст SQL


 
Zacho ©   (2004-12-04 17:47) [9]

korvin ©   (04.12.04 16:16) [5]
Читай хелп по используемым тобой компонентам, в нём всё должно быть написано.

korvin ©   (04.12.04 16:18) [6]
Или DSKalugin ©   (04.12.04 17:27) [8] , или переходи на FB 1.5 и используй EXECUTE STATEMENT, или создай отдельную табличку для параметров.


 
DSKalugin ©   (2004-12-04 18:12) [10]

2 Zacho ©   (04.12.04 17:47) [9]
переходи на FB 1.5 и используй EXECUTE STATEMENT

а можно уточнить? что это за зверь EXECUTE STATEMENT и как в данном случае его тут использовать


 
Zacho ©   (2004-12-04 18:52) [11]


> DSKalugin ©   (04.12.04 18:12) [10]


Выдержка из документации подойдет ?

EXECUTE STATEMENT

PSQL extension which takes a string which is a valid dynamic SQL statement and executes it as if it had
been submitted to DSQL.
Available in triggers and stored procedures.
The syntax may have three forms.

Syntax 1

Executes <string> as SQL operation that does not return any data rows, viz. INSERT, UPDATE, DELETE,
EXECUTE PROCEDURE or any DDL statement except CREATE/DROP DATABASE.
EXECUTE STATEMENT <string>;

Example

CREATE PROCEDURE DynamicSampleOne (Pname VARCHAR(100))
AS
Firebird 1.5 Release Notes v.1.08 5 February 2004 Page 21
DECLARE VARIABLE Sql VARCHAR(1024);
DECLARE VARIABLE Par INT;
BEGIN
SELECT MIN(SomeField) FROM SomeTable INTO :Par;
Sql = ’EXECUTE PROCEDURE ’ || Pname || ’(’;
Sql = Sql || CAST(Par AS VARCHAR(20)) || ’)’;
EXECUTE STATEMENT Sql;
END

Syntax 2

Executes <string> as SQL operation, returning single data row. Only singleton SELECT operators may be
executed with this form of EXECUTE STATEMENT.
EXECUTE STATEMENT <string> INTO :var1, […, :varn] ;

Example

CREATE PROCEDURE DynamicSampleTwo (TableName VARCHAR(100))
AS
DECLARE VARIABLE Par INT;
BEGIN
EXECUTE STATEMENT ’SELECT MAX(CheckField) FROM ’ || TableName INTO :Par;
IF (Par > 100) THEN
EXCEPTION Ex_Overflow ’Overflow in ’ || TableName;
END

Syntax 3

Executes <string> as SQL operation, returning multiple data rows. Any SELECT operator may be
executed with this form of EXECUTE STATEMENT.
FOR EXECUTE STATEMENT <string> INTO :var1, …, :varn DO
<compound-statement>;

Example

CREATE PROCEDURE DynamicSampleThree (
TextField VARCHAR(100),
TableName VARCHAR(100))
RETURNS (Line VARCHAR(32000))
AS
DECLARE VARIABLE OneLine VARCHAR(100);
BEGIN
Line = ’’;
FOR EXECUTE STATEMENT
’SELECT ’ || TextField || ’ FROM ’ || TableName INTO :OneLine
DO
IF (OneLine IS NOT NULL) THEN
Line = Line || OneLine || ’ ’;
SUSPEND;
END


 
DSKalugin ©   (2004-12-25 13:41) [12]

2 Zacho ©   (04.12.04 18:52) [11]

Спасибо, понял. Но не проще ли вообще отказаться от ХП и использовать динамические запросы, формируемые в рантайм?


 
Zacho ©   (2004-12-25 16:35) [13]

DSKalugin ©   (25.12.04 13:41) [12]
Но не проще ли вообще отказаться от ХП и использовать динамические запросы, формируемые в рантайм?


Может проще, может нет. В ХП ведь может быть не только один запрос, но и какие-либо другие действия :) , к-рые надо делать именно в ХП, а не в приложении.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.045 c
14-1105271522
Чеширский_Кот
2005-01-09 14:52
2005.01.30
Чужие


8-1098107144
igsi
2004-10-18 17:45
2005.01.30
Цикличное воспоизведение


1-1105945707
DelphiN!
2005-01-17 10:08
2005.01.30
Как установить иконку, для определенной строки ListBox-a ?


1-1106123275
Viruz
2005-01-19 11:27
2005.01.30
DecimalSeparator


14-1105436659
TUser
2005-01-11 12:44
2005.01.30
Размещение процедур





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский