Clarion&Oracle : вызов функции через PROP:SQL
Модератор: Andrew™
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Clarion&Oracle : вызов функции через PROP:SQL
Как в Clarion, используя PROP:SQL , вызвать функцию Oracle и получить результат или процедуру с параметром OUT ?
Re: Clarion&Oracle : вызов функции через PROP:SQL
в HELP'пе всё очень даже подробно расписано:tanatol писал(а):Как в Clarion, используя PROP:SQL , вызвать функцию Oracle и получить результат или процедуру с параметром OUT ?
BIND('b',loc_b)
BIND('a',loc_a)
a = 'Hello!'
file{PROP:SQL} = 'BEGIN GrantAccessProcedure(&a[IN],&b[OUT]) END;'
НО самое главное правило при использовании ХП с OUTPUT параметрами, НИКОГДА их ХП не возвращайте NULL, будет откровенная ЖОПА, приложение не упадёт, но DRIVER начнёт себя вести непредсказуемо, например, на простых операциях чтения он будет давать ошибку 33, дескать записи по запросу кончились, а на самом деле они есть.
У меня не работает : Clarion 5 , Oracle 9i
ret long
out long
OpenFile:LOG_TMP_ADR
bind('retcode',ret)
bind('out',out)
log_tmp_adr{PROP:SQL}='begin &retcode := test_func(100,&out); end;'
if errorcode()=90
stop(errorfile() & chr(10) & log_tmp_adr{PROP:SQL})
else
message('ret=' & ret & ' out='&out)
end
Вылетает ошибка !
ret long
out long
OpenFile:LOG_TMP_ADR
bind('retcode',ret)
bind('out',out)
log_tmp_adr{PROP:SQL}='begin &retcode := test_func(100,&out); end;'
if errorcode()=90
stop(errorfile() & chr(10) & log_tmp_adr{PROP:SQL})
else
message('ret=' & ret & ' out='&out)
end
Вылетает ошибка !
Включи DRIVER трассу(BIN\TRACE.EXE или DRVTRACE.EXE) и погляди что там, большой процент вопросов снимается после анализа лога. Не поймёшь в чём дело бросай лог и SQL скрипт на создание ХП сюда или в личное мыло.tanatol писал(а):У меня не работает : Clarion 5 , Oracle 9i
Вылетает ошибка !
Если начинаешь разработку попробуй MAV Direct ODBC, я кстати именно за проблем с FILE,DRIVER на больших коммерческих проектах перешёл на свою библитеку. Что до как перечислять не буду, НО много ограничений снимается, + шаблоны чисто SQL ориентированны.
Последний раз редактировалось Andrew™ 25 Октябрь 2005, 8:56, всего редактировалось 1 раз.
1) ЛОГ-файл
OPEN(TVERTMP.LOG_TMP_ADR 2) Time Taken: 0.28 secs
Closing Statement c429b0 Time Taken:0.00 secs
Closing Statement c429b0 Time Taken:0.00 secs
Executing Statement c429b0:begin test_PROC(&inpar,&outpar); end;
Error Occurred: S1000[Oracle][ODBC][Ora]ORA-06550: Строка 1, столбец 17:
PLS-00103: Встретился символ "&" в то время как ожидалось одно из следующих:
( ) - + case mod new not null others <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
table avg count current exists max min prior sql stddev sum
variance execute multiset the both leading trailing forall
merge year month DAY_ hour minute second timezone_hour
timezone_minute timezone_region timezone_abbr time timestamp
interval date
Time Taken:0.09 secs
SET_PROPERTY(TVERTMP.LOG_TMP_ADR 2) File Error: ORA-06550: Строка 1, столбец 17:
PLS-00103: Встретился символ "&" в то время как ожидалось одно из следующих:
( ) - + case mod new not null others <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
table avg count current Time Taken: 0.09 secs
GET_PROPERTY(TVERTMP.LOG_TMP_ADR 2) Time Taken: 0.00 secs
Freeing Statement c429b0 Time Taken:0.00 secs
DESTROY(TVERTMP.LOG_TMP_ADR 2) Time Taken: 0.00 secs
2) Процедура
CREATE OR REPLACE
PROCEDURE test_proc
( p_Num IN Number ,
p_Out IN OUT Number)
IS
BEGIN
P_OUT := p_num * 1000 ;
EXCEPTION
WHEN others THEN
p_out:=0 ;
END;
3) Вызов в Кларе
loc:IN long
loc:out long
OpenFile:LOG_TMP_ADR
FilesOpened = True
bind('outpar',loc:out)
BIND('inpar',loc:in)
loc:in=100
log_tmp_adr{PROP:SQL}='begin test_PROC(&inpar,&outpar); end;'
if errorcode()=90
stop(errorfile() & chr(10) & log_tmp_adr{PROP:SQL})
else
message(' out='&loc:out)
end
OPEN(TVERTMP.LOG_TMP_ADR 2) Time Taken: 0.28 secs
Closing Statement c429b0 Time Taken:0.00 secs
Closing Statement c429b0 Time Taken:0.00 secs
Executing Statement c429b0:begin test_PROC(&inpar,&outpar); end;
Error Occurred: S1000[Oracle][ODBC][Ora]ORA-06550: Строка 1, столбец 17:
PLS-00103: Встретился символ "&" в то время как ожидалось одно из следующих:
( ) - + case mod new not null others <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
table avg count current exists max min prior sql stddev sum
variance execute multiset the both leading trailing forall
merge year month DAY_ hour minute second timezone_hour
timezone_minute timezone_region timezone_abbr time timestamp
interval date
Time Taken:0.09 secs
SET_PROPERTY(TVERTMP.LOG_TMP_ADR 2) File Error: ORA-06550: Строка 1, столбец 17:
PLS-00103: Встретился символ "&" в то время как ожидалось одно из следующих:
( ) - + case mod new not null others <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
table avg count current Time Taken: 0.09 secs
GET_PROPERTY(TVERTMP.LOG_TMP_ADR 2) Time Taken: 0.00 secs
Freeing Statement c429b0 Time Taken:0.00 secs
DESTROY(TVERTMP.LOG_TMP_ADR 2) Time Taken: 0.00 secs
2) Процедура
CREATE OR REPLACE
PROCEDURE test_proc
( p_Num IN Number ,
p_Out IN OUT Number)
IS
BEGIN
P_OUT := p_num * 1000 ;
EXCEPTION
WHEN others THEN
p_out:=0 ;
END;
3) Вызов в Кларе
loc:IN long
loc:out long
OpenFile:LOG_TMP_ADR
FilesOpened = True
bind('outpar',loc:out)
BIND('inpar',loc:in)
loc:in=100
log_tmp_adr{PROP:SQL}='begin test_PROC(&inpar,&outpar); end;'
if errorcode()=90
stop(errorfile() & chr(10) & log_tmp_adr{PROP:SQL})
else
message(' out='&loc:out)
end
Что я вижу, не разбирается сам вызов, а именно &, это означает что нету в начале процедуры POPBIND и в конце PUSHBIND, и [IN],[OUT] вставляй явно, давно не наступал на такого плана грабли, пишу на Clation, но не FILE,DRIVER, и есть мне счастье и тем кто юзает мою библу.tanatol писал(а):У меня не работает : Clarion 5 , Oracle 9i
Вылетает ошибка !
конечно, я ж тут всё говорю про FILE,DRIVER('ORACLE')tanatol писал(а):Есть POPBIND и PUSHBIND , может это из-за того что я использую ODBC. В хелпе это написано для акселератора.
для FILE,DRIVER('ODBC') через PROP:henv и PROP:hdbc можно получить параметры соединения, далее через Win API вызывай ХПшки.
это очень объёмный вопрос,tanatol писал(а):Чтобы использовать Win API что нужно включить в проект ? И если можно небольшой пример вызова XP с параметром OUT.
прежде всего почитай либо в MSDN'е либо в инете инфо
по следующим функциям:
SQLAllocHandle
SQLBindParameter
SQLExecDirect
SQLFreeHandle
ежели это сложно для тебя есть несколько вариантов более простого решения:
1. не используй OUT параметры, IN вставляй явно значениями, а-ля OUT параметры записывай в какую нибудь таблицу, после вызова ХП штатными средставми через FILE читай её
2. либо поищи билиотеку, вопрос актуальный и скорее всего у многих уже написаны свои обёртки для удобной работы с ODBC API, в MAV Direct ODBC это тоже имеется.
tmp MAVExecutetanatol писал(а):Спасибо за ответы. Как бы вызов ХП выглядел в MAV. И можно ли его использовать вместе со штатными средствами ( времени совосем нет ).
ret long
out long
inp long
CODE
inp = 100
tmp.BindParameter(ret)
tmp.BindParameter(inp)
tmp.BindParameter(out,SQL_PARAM_OUTPUT)
if tmp.Run('test_func',1)
mavshoweror
else
! Ok
end
заюзать можно, но это будет второе соединение в программе, т к в MAV используются возможности ODBC Cursor Library (настройка при соединении), штатно не юзаются, в результате колосальные выигыши в скоростях доступа к данным по сравнению со штатными средствами.