Clarion&Oracle : вызов функции через PROP:SQL

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Clarion&Oracle : вызов функции через PROP:SQL

Сообщение tanatol »

Как в Clarion, используя PROP:SQL , вызвать функцию Oracle и получить результат или процедуру с параметром OUT ?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Clarion&Oracle : вызов функции через PROP:SQL

Сообщение Andrew™ »

tanatol писал(а):Как в Clarion, используя PROP:SQL , вызвать функцию Oracle и получить результат или процедуру с параметром OUT ?
в HELP'пе всё очень даже подробно расписано:

BIND('b',loc_b)
BIND('a',loc_a)
a = 'Hello!'
file{PROP:SQL} = 'BEGIN GrantAccessProcedure(&a[IN],&b[OUT]) END;'

НО самое главное правило при использовании ХП с OUTPUT параметрами, НИКОГДА их ХП не возвращайте NULL, будет откровенная ЖОПА, приложение не упадёт, но DRIVER начнёт себя вести непредсказуемо, например, на простых операциях чтения он будет давать ошибку 33, дескать записи по запросу кончились, а на самом деле они есть.
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Сообщение tanatol »

У меня не работает : 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

Вылетает ошибка !
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

tanatol писал(а):У меня не работает : Clarion 5 , Oracle 9i
Вылетает ошибка !
Включи DRIVER трассу(BIN\TRACE.EXE или DRVTRACE.EXE) и погляди что там, большой процент вопросов снимается после анализа лога. Не поймёшь в чём дело бросай лог и SQL скрипт на создание ХП сюда или в личное мыло.

Если начинаешь разработку попробуй MAV Direct ODBC, я кстати именно за проблем с FILE,DRIVER на больших коммерческих проектах перешёл на свою библитеку. Что до как перечислять не буду, НО много ограничений снимается, + шаблоны чисто SQL ориентированны.
Последний раз редактировалось Andrew™ 25 Октябрь 2005, 8:56, всего редактировалось 1 раз.
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Сообщение tanatol »

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
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

tanatol писал(а):У меня не работает : Clarion 5 , Oracle 9i
Вылетает ошибка !
Что я вижу, не разбирается сам вызов, а именно &, это означает что нету в начале процедуры POPBIND и в конце PUSHBIND, и [IN],[OUT] вставляй явно, давно не наступал на такого плана грабли, пишу на Clation, но не FILE,DRIVER, и есть мне счастье и тем кто юзает мою библу.
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Сообщение tanatol »

Есть POPBIND и PUSHBIND , может это из-за того что я использую ODBC. В хелпе это написано для акселератора.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

tanatol писал(а):Есть POPBIND и PUSHBIND , может это из-за того что я использую ODBC. В хелпе это написано для акселератора.
конечно, я ж тут всё говорю про FILE,DRIVER('ORACLE')

для FILE,DRIVER('ODBC') через PROP:henv и PROP:hdbc можно получить параметры соединения, далее через Win API вызывай ХПшки.
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Сообщение tanatol »

Чтобы использовать Win API что нужно включить в проект ? И если можно небольшой пример вызова XP с параметром OUT.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

tanatol писал(а):Чтобы использовать Win API что нужно включить в проект ? И если можно небольшой пример вызова XP с параметром OUT.
это очень объёмный вопрос,
прежде всего почитай либо в MSDN'е либо в инете инфо
по следующим функциям:

SQLAllocHandle
SQLBindParameter
SQLExecDirect
SQLFreeHandle


ежели это сложно для тебя есть несколько вариантов более простого решения:
1. не используй OUT параметры, IN вставляй явно значениями, а-ля OUT параметры записывай в какую нибудь таблицу, после вызова ХП штатными средставми через FILE читай её
2. либо поищи билиотеку, вопрос актуальный и скорее всего у многих уже написаны свои обёртки для удобной работы с ODBC API, в MAV Direct ODBC это тоже имеется.
tanatol
Посетитель
Сообщения: 27
Зарегистрирован: 24 Октябрь 2005, 13:27
Откуда: Tver

Сообщение tanatol »

Спасибо за ответы. Как бы вызов ХП выглядел в MAV. И можно ли его использовать вместе со штатными средствами ( времени совосем нет ).
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

tanatol писал(а):Спасибо за ответы. Как бы вызов ХП выглядел в MAV. И можно ли его использовать вместе со штатными средствами ( времени совосем нет ).
tmp MAVExecute
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 (настройка при соединении), штатно не юзаются, в результате колосальные выигыши в скоростях доступа к данным по сравнению со штатными средствами.
Ответить