我這麼使用perl,在Oracle過程中調用perl語言
公司使用Oracle 8i數據庫, 有使用一個外部過程, 用來發送Email, 是我以前用C語言實現的.
只能發送簡單文本信息
現在要求能發送html格式,或者附件.
SMTP本身是簡單的.最為繁雜的是Email的MIME編碼.
查了一下現成Mime庫, 有gnu的libgmime可用.
但使用最方便的該是perl的 MIME::Entity包了, 以前就用過它.
甘脆就使用它吧,輕車熟路的.
Oracle外部過程只能使用C和Java, 我的想法是在C中調用perl.
perldoc perlembed
遇到三個問題.
1. C嵌入的perl中找不到package, @INC變量中的確有.
解決方法: perl_parse第2個參數指明xs_init ,
perl_parse(my_perl, xs_init, 3, embedding, NULL);
xs_init函數code可以這樣由perl生成
perl -MExtUtils::Embed -e xsinit -- -o perlxsi.c
2. 執行時出現ORA-28576錯誤
解決方法: 在listener.ora中加入以下行
(ENVS="EXTPROC_DLLS=ANY")
這時問題並沒有解決,但是錯誤信息較為詳細.
3. Oracle 中調用外部函數時說某些符號未找到.
內容內似如下.
extprocPLSExtProc: symbol lookup error: /usr/lib/perl5/5.8.5/i386-linux-thread-multi/auto/Socket/Socket.so: undefined symbol: Perl_Tstack_sp_ptr
BEGIN
*
ERROR at line 1:
ORA-28576: lost RPC connection to external procedure agent
ORA-06512: at "YY3MAT.SENDMAILC", line 0
ORA-06512: at line 2
解決方法: gcc 編譯時將/usr/lib/perl5/5.8.5/i386-linux-thread-multi/auto/Socket/Socket.so連進去
再跟據錯誤提示再加.
Date: 2007/10/29
Writer: 阿飛