powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как протестировать External Procedures под Windows при помощи kernel32.dll
6 сообщений из 6, страница 1 из 1
как протестировать External Procedures под Windows при помощи kernel32.dll
    #39936805
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
переводим свои сишные дллки на х64.
дллки собраны, сервер оракле хе 18 установлен на вин7 х64, extproc.ora прописан (SET EXTPROC_DLLS=ANY).
при запуске возвращает непонятную ошибку. естественно возникает вопрос - правильно ли настроен оракл сервер.
сишниками у нас занимается другой человек, поэтому нашел простой способ тестирования екстпроц через kernel32.dll (на вин платформе она есть всегда)
Calling External Procedure (DLL) from PL/SQL
может кому в таких ситуациях поможет

сами скрипты:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
CREATE OR REPLACE LIBRARY nt_kernel AS
'C:\Windows\System32\kernel32.dll';

CREATE OR REPLACE PACKAGE disk_util
AS
   FUNCTION get_disk_free_space (
      root_path                  IN       VARCHAR2,
      sectors_per_cluster        OUT      PLS_INTEGER,
      bytes_per_sector           OUT      PLS_INTEGER,
      number_of_free_clusters    OUT      PLS_INTEGER,
      total_number_of_clusters   OUT      PLS_INTEGER
   )
      RETURN PLS_INTEGER;

   PRAGMA RESTRICT_REFERENCES (get_disk_free_space, WNPS, RNPS, WNDS, RNDS);
END disk_util;
/

CREATE OR REPLACE PACKAGE BODY disk_util
AS
   FUNCTION get_disk_free_space (
      root_path                  IN       VARCHAR2,
      sectors_per_cluster        OUT      PLS_INTEGER,
      bytes_per_sector           OUT      PLS_INTEGER,
      number_of_free_clusters    OUT      PLS_INTEGER,
      total_number_of_clusters   OUT      PLS_INTEGER
   )
      RETURN PLS_INTEGER
   IS
   EXTERNAL
      LIBRARY nt_kernel                   -- our library (defined previously)
      NAME "GetDiskFreeSpaceA"            -- name of function in kernel32.dll
      LANGUAGE c                          -- external routine is written in C
      CALLING STANDARD pascal             -- uses Pascal parameter convention
      PARAMETERS                    -- map PL/SQL to C parameters by position
                (
         root_path STRING,
         sectors_per_cluster BY REFERENCE LONG,
         bytes_per_sector BY REFERENCE LONG,
         number_of_free_clusters BY REFERENCE LONG,
         total_number_of_clusters BY REFERENCE LONG,
         RETURN LONG
      );                       -- "return code" indicating success or failure
END disk_util;
/

SET SERVEROUTPUT ON SIZE 100000          
DECLARE
   lroot_path                  VARCHAR2 (3) := 'C: ';      -- look at C drive
   lsectors_per_cluster        PLS_INTEGER;
   lbytes_per_sector           PLS_INTEGER;
   lnumber_of_free_clusters    PLS_INTEGER;
   ltotal_number_of_clusters   PLS_INTEGER;
   return_code                 PLS_INTEGER;
   free_meg                    REAL;
BEGIN
   /* Call the external procedure.  We ignore the return code in this simple example.*/
   return_code :=
      disk_util.get_disk_free_space (lroot_path,
                                     lsectors_per_cluster,
                                     lbytes_per_sector,
                                     lnumber_of_free_clusters,
                                     ltotal_number_of_clusters
                                    );
                  /* Using the drive statistics that are returned from the external procedure,
   ||compute the amount of free disk space.  Remember Megabytes = (Bytes / 1024 / 1024)
                */
   DBMS_OUTPUT.put_line ('lsectors_per_cluster = ' || lsectors_per_cluster);
   DBMS_OUTPUT.put_line ('lbytes_per_sector = ' || lbytes_per_sector);
   DBMS_OUTPUT.put_line (   'lnumber_of_free_clusters = '
                         || lnumber_of_free_clusters
                        );
   DBMS_OUTPUT.put_line (   'ltotal_number_of_clusters = '
                         || ltotal_number_of_clusters
                        );
   free_meg :=
        (lsectors_per_cluster * lbytes_per_sector)
      * (lnumber_of_free_clusters / 1024)
      / 1024;
   DBMS_OUTPUT.put_line ('free disk space, megabytes = ' || free_meg);
END;
/
...
Рейтинг: 0 / 0
как протестировать External Procedures под Windows при помощи kernel32.dll
    #39936823
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha111,

А можно в более понятной форме для чего это всё может использоваться?
...
Рейтинг: 0 / 0
как протестировать External Procedures под Windows при помощи kernel32.dll
    #39936833
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feagorдля чего это всё может использоваться?

Это импорт пары системных функций чтобы, если что-то не работает, исключить из неизвестных
переменных кривизну самописной UDF.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как протестировать External Procedures под Windows при помощи kernel32.dll
    #39936850
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
feagor,
Чтобы убедиться что связка оракл-екстпроц-длл работает и проблема именно в длл которая вызывается, а не в настройках оракла.

Например была ситуация когда дллки прекрасно работали через екстпроц на вин 10,а на вин 7 не запускались. Все 32х разрядное.
Первое подозрение конечно было в кривой настройке екстпроц на сервере. Оказалось что не хватает дллек специфичных для вин10, но это другая история
...
Рейтинг: 0 / 0
как протестировать External Procedures под Windows при помощи kernel32.dll
    #39936858
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha111
Оказалось что не хватает дллек
тогда логично в самой dll реализовывать функцию с тестами предоставляемого api.
...
Рейтинг: 0 / 0
как протестировать External Procedures под Windows при помощи kernel32.dll
    #39936912
Misha111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

возможно. но повторюсь - дллками занимается другой человек, а мне надо было убедиться что в настройке оракла ошибок нет.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как протестировать External Procedures под Windows при помощи kernel32.dll
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]