Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
OCI_session_handl
Guest
Доброго времени суток.
Подскажите pls, как получить текущую сессию на PRO*C?
Т.е. чтобы не указывать явно строку подключения и не открывать отдельный коннект к базе:
    strcpy( oracleid.arr, "scott/tiger@foo" );
    oracleid.len = strlen(oracleid.arr);
    EXEC SQL WHENEVER SQLERROR DO sqlerror_hard();
    EXEC SQL CONNECT :oracleid;

Идея то собственно заключается в следующем - в Forms 6i заюзать dll-ку (в основе PRO*C), в которой функция лезла бы в БД используя текущее подключение (прям в той же транзакции :-).
Ткните куда-нибудь почитать...

Или это бред?

Oracle 9.2.0.6.
8 авг 07, 16:24    [4497535]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
А зачем? Там вроде не нужно ничего особого получать. PRO*C по умолчанию работает в той-же сессии, что и Forms. К сожалению, не получить connect OCI :=( функции возвращающие OCI контекст из-под Forms работать отказываются.

См. доки и примеры на metalink по использованию PRO*C & USER_EXIT.

У меня точно все работало. Но примера кода сейчас под рукой нет (с прошлой работы уволился :=) ).

Единственное дополнение. PRO*C нужен правильный, версии 8.0.5 или 8.0.6.
8 авг 07, 16:39    [4497711]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
OCI_session_handl
Guest
Leonid Kudryavtsev
PRO*C по умолчанию работает в той-же сессии, что и Forms

Но коннект-то как-то открыть надо, или ну его нафик :) ?


Leonid Kudryavtsev
Единственное дополнение. PRO*C нужен правильный, версии 8.0.5 или 8.0.6.

А в инсталляции с Oracle 8.1.7 идет "неправильный" прекомпилятор???
Не подскажите, где можно взять "правильный"?
9 авг 07, 07:43    [4499883]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
sanek842
Member

Откуда: Тюмень
Сообщений: 1432
OCI_session_handl

Ткните куда-нибудь почитать...
Oracle 9.2.0.6.


http://download.oracle.com/docs/cd/B10501_01/appdev.920/a97269/pc_07pls.htm#8055

...
The REGISTER CONNECT statement will return the set of OCI handles (OCIEnv, OCISvcCtx, and OCIError) that are associated with the current Oracle connection and transaction.
...
9 авг 07, 08:44    [4499952]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
OCI_session_handl
Guest
sanek842
http://download.oracle.com/docs/cd/B10501_01/appdev.920/a97269/pc_07pls.htm#8055
...
The REGISTER CONNECT statement will return the set of OCI handles (OCIEnv, OCISvcCtx, and OCIError) that are associated with the current Oracle connection and transaction.
...

Не понимайтен:

...
In order to execute a server-side external C function, the REGISTER CONNECT embedded SQL statement must be used inside that function. The syntax of the statement is:
EXEC SQL REGISTER CONNECT USING :epctx [RETURNING :host_context] ;
where epctx is the external procedure context (of type pointer to OCIExtProcContext). epctx is passed to the procedure by PL/SQL.
...

1. Речь идет вроде как о server-side, разьве это и к вызову в Forms процедуры из этой dll-ки относится?
2. "epctx is passed to the procedure by PL/SQL" - что туда передвать ???
9 авг 07, 09:01    [4499988]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
sanek842
Member

Откуда: Тюмень
Сообщений: 1432
OCI_session_handl

1. Речь идет вроде как о server-side, разьве это и к вызову в Forms процедуры из этой dll-ки относится?


В forms это должно выглядеть как вызов обычной pl/sql процедуры или ф-ии

OCI_session_handl

2. "epctx is passed to the procedure by PL/SQL" - что туда передвать ???


туда контекст передается

CREATE OR REPLACE PROCEDURE extp1
AS EXTERNAL NAME "extp1"
LIBRARY mylib
WITH CONTEXT
PARAMETERS(CONTEXT) ;

из forms нужно будет обращаться к процедуре extp1
9 авг 07, 09:47    [4500164]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
OCI_session_handl
Guest
Не фту степь - серверную процедуру (у которой С-шная реализация) вызывать мне совсем не надо.

Мне надо на клиенте вызвать процедуру, которая из базы выгребет данные и на клиенте с ними кой-чего сделает (например сохранит в файл).
9 авг 07, 10:07    [4500280]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Через ORA_FFI или USER_EXEIT нормально вызываются.

Насчет REGISTER CONNECT никаких воспоминаний не осталось. Вроде ничего такого в коде не использовал.

автор

А в инсталляции с Oracle 8.1.7 идет "неправильный" прекомпилятор???


Да. Твоя DLL должна быть слинкована с теми же версиями DLL, что и Forms.

Нужен PRO*C версии 8.0.x. По докам 8.0.5 или 8.0.6. Я брал в Москве, в тех. суппорте РД-Тех'а. 8.0.5 они не нашли, прислали 8.0.3 - он то-же работает.

Ф-ции возвращающие OCI handle, из-под формс не работают. Все остальное - вроде Ok.
9 авг 07, 10:14    [4500336]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
OCI_session_handl
Guest
Вот примет простой проги на PRO*C.
#include <stdio.h>
#include <stdlib.h>
EXEC SQL INCLUDE sqlca;
main()
{
   
   EXEC SQL BEGIN DECLARE SECTION;
      char user_name[25];
      char *username = "SCOTT/tiger";
      char *connecting = "ORATEST";
   EXEC SQL END DECLARE SECTION;

   EXEC SQL CONNECT :username USING :connecting;
   if (sqlca.sqlcode <0) exit (-1);

   while (1)
      {
         EXEC SQL select user
	          into user_name
			  from dual;  
     }

   EXEC SQL COMMIT WORK RELEASE;
}
Зациклил специально, чтобы отловить сессию.

Откомпилили, сделали dll-ку с соответствующей функцией. Подключили и вызываем в Forms через ORA_FFI...
Все работает, НО - сессий открывается две, а не одна.
Как избавиться от "EXEC SQL CONNECT :username USING :connecting;" ??? - без этого дела выдает ошибку :-(
9 авг 07, 10:47    [4500564]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
To OCI_session_handl:

1. Посмотри примеры на metalink'е. Там в свое время были ноты под очень старые версии Forms'ов

2. Можно попытаться написать акробату (https://www.sql.ru/forum/actualthread.aspx?tid=374833), может у него мой код где-то под рукой есть :=(. Я сейчас в командировке, доступа к архивам старых программ не имею :=(
9 авг 07, 11:45    [4501036]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
P.S. Например на metalink'е:

Subject: Reading Oracle8 BLOBS into Forms 4.5 or 5.0
Doc ID: Note:52585.1
Type: FAQ
Last Revision Date: 31-OCT-2006 Status: ARCHIVED

Это то, что нашел с ходу.
9 авг 07, 11:50    [4501082]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Nikolay****
Member

Откуда:
Сообщений: 223
Leonid Kudryavtsev
To OCI_session_handl:

1. Посмотри примеры на metalink'е. Там в свое время были ноты под очень старые версии Forms'ов

2. Можно попытаться написать акробату (https://www.sql.ru/forum/actualthread.aspx?tid=374833), может у него мой код где-то под рукой есть :=(. Я сейчас в командировке, доступа к архивам старых программ не имею :=(



Леонид это вы про BLOBLIB.DLL у меня тоже ее исходники есть.Да кстати глючок так и остался:(
9 авг 07, 16:13    [4503575]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
OCI_session_handl
Guest
Таак, нашлись товарищи по несчастью... :-)

Скажите для начала - если "это" работает, то "оно" стопудово не создает собственную сессию, а работает в той же, что и runtime Forms-а открыл ???
9 авг 07, 16:21    [4503641]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
OCI_session_handl

Скажите для начала - если "это" работает, то "оно" стопудово не создает собственную сессию, а работает в той же, что и runtime Forms-а открыл ???


работает стопудово в той-же транзакции, что и основной поток Forms.

Только PRO/C нужен 8.0.x. С 8i работать стопудово не будет.
9 авг 07, 16:55    [4503959]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Nikolay****
Member

Откуда:
Сообщений: 223
OCI_session_handl
Таак, нашлись товарищи по несчастью... :-)

Скажите для начала - если "это" работает, то "оно" стопудово не создает собственную сессию, а работает в той же, что и runtime Forms-а открыл ???


Вы меня озадачили, щас навсякий случай проверю......
9 авг 07, 16:57    [4503977]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Nikolay****
Member

Откуда:
Сообщений: 223
Проверил, новых сессий не появлялось.
9 авг 07, 17:21    [4504215]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
rus123rus
Guest
Nikolay****
Проверил, новых сессий не появлялось.


А как ты это проверил, т.е. каким образом ты написал *.рс-файл, в котором явно не указывается строка подключения и не открывается отдельная сессия?

В документации по Oracle приводится пример создания процедуры extp1 на Pro*C с использованием << EXEC SQL REGISTER CONNECT USING :epctx [RETURNING :host_context] >>, но при попытке мною ее скомпилировать в Pro*C ни чего не выходит, в чем может быть ошибка?
10 авг 07, 09:30    [4506063]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
rus123rus

...каким образом ты написал *.рс-файл, в котором явно не указывается строка подключения и не открывается отдельная сессия?...


Пример кода Note 52585.1
Команда CONNECT вообще не нужна.


main()


Почему у тебя функция main? Ты как свой код компилируеш и вызываеш, как EXE файл через HOST?

Тогда конечно, тебе доступ к Forms'овой сессии не получить. Ты запускаешся как отдельный процесс OS. Тебе нужно сделать DLL и вызвать ее из Forms. Тогда твой код будет работать как часть кода Oracle Forms - ты получиш доступ к сессии, главное, что бы версии библиотек совпали, те которые используеш ты при компиляции и те, которые были использованы при сборке Oracle Forms Runtime. Насколько я знаю, Forms 6.0 и 6i собран с PRO*C 8.0 (НЕ 8i).
10 авг 07, 11:31    [4507042]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
rus123rus
Guest
Leonid Kudryavtsev

main()

Почему у тебя функция main? Ты как свой код компилируеш и вызываеш, как EXE файл через HOST?

Нет, просто из скомпилированного С файла я беру основу функции main и вставляю ее в свою функцию, находящуюся в dll, т.е.
extern "C" __declspec (dllexport) int test(char *my_text)
{
int n;
<<основа функции main>>
strcpy(my_text, user_name);
n=strlen(my_text);
return n;
}
А потом саму dll’ку я вызываю через Forms.
10 авг 07, 13:20    [4508084]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
OCI_session_handl
Guest
Версию PRO*C как узнать?
И еще вопрос - результатом поисков PRO*C "правильной версии" должна быть библиотека вроде этой:
"C:\oracle\ora92\precomp\lib\orasql9.lib" ???
10 авг 07, 13:26    [4508149]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
rus123rus
Guest
up
11 авг 07, 05:43    [4512064]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
OCI_session_handl
Guest
13 авг 07, 10:02    [4514763]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Вроде же на все вопросы ответы даны:

1. Ссылку на metalink'овский пример кода привели. Никаких дополнительных вызовов и шаманства с connect'ами в коде _не_ нужно.

2. У меня сорцов под руками нет :=(. Можеш попытаться попросить у Nikolay****, может у него есть какой нибудь пример кода.

> Версию PRO*C как узнать?

Вопрос не понял.
13 авг 07, 11:24    [4515358]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
P.S. напиши на e-mail. Я тебе номер своей ICQ скину.
13 авг 07, 11:49    [4515607]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текущий connect в PRO*C (from Forms 6i)?  [new]
OCI_session_handl
Guest
Leonid Kudryavtsev
Я тебе номер своей ICQ скину.
Спасибо за помощь, но доступ к ICQ у нас отрублен :(

Leonid Kudryavtsev
1. Ссылку на metalink'овский пример кода привели. Никаких дополнительных вызовов и шаманства с connect'ами в коде _не_ нужно.
Читал я это дело. Ок. Не нужно так не нужно. Делаю так:
--Тестовая табличка
CREATE TABLE log_table
    (code                           NUMBER,
    message                        VARCHAR2(200),
    info                           VARCHAR2(100))
Потом берем PRO*C:
#include <stdio.h>
#include <stdlib.h>
EXEC SQL INCLUDE sqlca;
main()
{   EXEC SQL insert into log_table
            values (1, 'Сообщение добавлено!','My_info');
}
Компилим это дело в dll-ку с помощью MS Visual C++ 6.0 : получаем test_proc.c (см.приложение)

Далее в Forms 6i подцепляем функцию:
PACKAGE dll IS
  FUNCTION test(my_var IN out varchar2) RETURN PLS_INTEGER;
END;

PACKAGE BODY dll IS
  dll_lhandle   	Ora_Ffi.Libhandletype;
  test_fhandle  	Ora_Ffi.Funchandletype;
  FUNCTION test_ (fhandle in Ora_Ffi.Funchandletype, my_var_ IN out varchar2) RETURN PLS_INTEGER ;
  PRAGMA interface(C, test_, 11265);  
  
  FUNCTION test(my_var IN out varchar2) RETURN PLS_INTEGER IS
    num integer;
  BEGIN
  	 num:=test_(test_fhandle, my_var);
  	 return num;
  exception
  	 when others then
  	   message(sqlerrm,acknowledge);
  END;

BEGIN   
 dll_lhandle := Ora_Ffi.Load_Library('', 'test_not_login.dll');
 test_fhandle := Ora_Ffi.Register_Function(dll_lhandle, 'test', Ora_Ffi.c_Std);
 ora_ffi.register_parameter(test_fhandle, ora_ffi.c_char_ptr);
 Ora_Ffi.Register_Return(test_fhandle, ora_ffi.c_long);

exception
 when others then
  message('Error dll ',acknowledge); 
END;
И вызываем эту функцию:
declare
	n PLS_INTEGER;
	st varchar2(50);
begin
	break;
	st:='just initialized..';
	n:=dll.test(st);
	forms_ddl('commit');
	:block.it:=n;
	:block.it2:=st;
	exception
  	 when others then
  	   message(sqlerrm,acknowledge);
end;
Соответственно ошибок не выдается, но и данных в таблице тоже не появляется.

Вопросы следующие.
1. >to Nikolay**** - суть мысли в исходниках верная? Может у Вас это откомпилится и заработает(если не в лом :) ?
2. что есть "PRO*C v.8.0.x" - это набор (*.lib,*.dll, proc.exe,procui.exe) или цельная отдельная инсталяха? Али проще искать что-нибудь типа Oracle 8.0.x и из него вырубать?

К сообщению приложен файл (test_proc.c - 6Kb) cкачать
14 авг 07, 11:16    [4521119]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить