при запуске external procedure выдается ошибка:
ORA-06521: PL/SQL: Error mapping function
ORA-06522: /lib/libabrogation.so: undefined symbol: abrogation
ORA-06512: at "WORK.ABROGATION", line 1
ORA-06512: at line 9
запуск процедуры:
DECLARE
PATH VARCHAR2(200);
MESSAGE VARCHAR2(200);
BEGIN
PATH := '/tmp/test.ttt';
MESSAGE := 'hhheh';
WORK.ABROGATION ( PATH, MESSAGE );
END;
создание библиотеки и процедуры:
CREATE OR REPLACE LIBRARY WORK.LIBABROGATION
IS '/lib/libabrogation.so'
/
CREATE OR REPLACE PROCEDURE abrogation
(path VARCHAR2
,message VARCHAR2) AS EXTERNAL
LIBRARY libabrogation
NAME "abrogation"
PARAMETERS
(path STRING
,message STRING);
/
source of libabrogation.c
#include <stdio.h>
#include <my_global.h>
#include <mysql.h>
#include <errmsg.h>
#include <mysqld_error.h>
void abrogation(char *path, char *message)
{
// Declare a FILE variable.
FILE *file_name;
// Open the File.
file_name = fopen(path,"w");
fprintf(file_name,"start0\n");
MYSQL conn;
if(!mysql_init(&conn))
{
fprintf(stderr, "Error: can't create MySQL-descriptor\n");
exit(1);
}
if(!mysql_real_connect(&conn,
"xxx.xxx.xxx.xxx",
"xxx",
"xxx",
NULL,
0,
NULL,
0))
{
fprintf(file_name, "Error: %s\n", mysql_error(&conn));
exit(1);
}
if(mysql_query(&conn, "SET NAMES 'cp1251'") != 0)
{
fprintf(file_name, "Error: can't set character set\n");
exit(1);
}
if(mysql_query(&conn, "USE `test`") != 0)
{
fprintf(file_name, "Error: %s\n", mysql_error(&conn));
exit(1);
}
if(mysql_query(&conn,
"INSERT INTO orains VALUES (NULL,12)") != 0)
{
fprintf(file_name, "Error: can't execute INSERT-query\n");
exit(1);
}
fprintf(file_name,"%d\n",mysql_insert_id(&conn));
mysql_close(&conn);
// Close the file.
fclose(file_name);
}
compile:
gcc -fPIC -c -I/usr/include/mysql libabrogation.c
gcc -fPIC -shared libabrogation.o /usr/lib/mysql/libmysqlclient.a /usr/lib/libz.a -lssl -Wl,-h,libabrogation.so -o libabrogation.so
получившаяся библиотека успешно работает через тестовую программу:
source main.cpp
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#include "libabrogation.h"
int main(int argc, char **argv)
{
void *lib_handle;
double (*fn)(char *path, char *message);
char *path="/tmp/test.ttt";
char *message="hhheh";
char *error;
lib_handle = dlopen("/lib/libabrogation.so", RTLD_LAZY);
if (!lib_handle)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
fn = dlsym(lib_handle, "abrogation");
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error);
exit(1);
}
(*fn)(path,message);
dlclose(lib_handle);
return 0;
}
compile: gcc -rdynamic main.c -o main -ldl
если убрать из abrogation.cpp всё завазаное с mysql, оракл переваривает библиотеку.
#include <stdio.h>
void abrogation(char *path, char *message)
{
// Declare a FILE variable.
FILE *file_name;
// Open the File.
file_name = fopen(path,"w");
fprintf(file_name,"start0\n");
// Close the file.
fclose(file_name);
}
подскажите в чем проблема?