при запуске external procedure выдается ошибка: ORA-06521 ORA-06522

beak
Дата: 09.03.2011 16:31:50
при запуске 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);
}
подскажите в чем проблема?