Google
 
Web itpro-blogger.blogspot.com
日曜日, 6月 10, 2007

[ORACLE]プロシージャ

▼質問
クライアントからサーバの処理を実行したいんだけど・・・。プロシージャで、できないのかな?

▼回答
実行ファイルが処理できるDLL(Windows)かSO(Unix)を作成して外部プロシージャに
定義(ライブラリ登録?)すれば実現できるよ!

自作しなくてもWindowsAPIを呼ぶことができるからいろいろできそうである。

下記のサイトにINIファイルのAPIを呼ぶサンプルがあったので実験してみた。

いっしーのプログラムヒント集
http://www.j-real.com/stone/progtips.html#Ora2

コピペしたらうまくいかなかったのでうまくいったものを下記に示しておきます。
←こんなエラーが出た!「PLS-00103: 記号"SHOW"が見つかりました」

SQL*Plusに「SYSTE]でログインして実行する。

ここから-------------------------------------------------------------------------------->

-- DLLファイルの名称定義 ディレクトリは環境によって変えてください
create or replace library kernel32 is 'c:\windows\system32\kernel32.dll';
/
show errors;

-- APIのGetPrivateProfileIntA(Iniファイルから数値を取り出す)
create or replace function GetIniInt(
lpApplicationName CHAR,
lpKeyName CHAR,
nDefault BINARY_INTEGER,
lpFileName CHAR
) RETURN BINARY_INTEGER AS
EXTERNAL
LIBRARY kernel32 NAME "GetPrivateProfileIntA"
LANGUAGE C
CALLING STANDARD C;
/
show errors;

-- APIのGetPrivateProfileStringA(Iniファイルから文字列を取り出す)
create or replace function GetIniString( --この関数名は好きなものを付けられます
lpApplicationName String,
lpKeyName String,
lpDefault String,
lpReturnedString OUT String,
nSize BINARY_INTEGER,
lpFileName String
) RETURN BINARY_INTEGER AS
EXTERNAL
LIBRARY kernel32
NAME "GetPrivateProfileStringA"
LANGUAGE C
CALLING STANDARD C;
/
show errors;

<--------------------------------------------------------------------------------ここまで SQL*Plusの実行結果 SQL> @C:\Work\プロシージャ\CRE_SP_INI.sql
ライブラリが作成されました。
エラーはありません。
ファンクションが作成されました。
エラーはありません。
ファンクションが作成されました。
エラーはありません。
SQL>

プロシージャの作成
名前:SP_INI_TEST
ソース

ここから-------------------------------------------------------------------------------->

(
dat in out varchar2,
ret out int
) as
begin
ret := GetIniInt('intl','iCountry', 0, 'c:\windows\win.ini');
dbms_output.put_line(ret);
ret := GetIniString('intl','sCountry', 'Default', dat, 255, 'c:\windows\win.ini'); dbms_output.put_line(dat ' ' ret);
end;

<--------------------------------------------------------------------------------ここまで SQL*Plusの実行方法 SQL> variable dat varchar2(255)
SQL> variable ret NUMBER
SQL> execute SP_INI_TEST( :dat, :ret )

こんなエラーが出た!
「ORA-28595: Extprocエージェント : DLLパスが無効です」

Oracle Net Servicesの拡張機能の使用
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19208-02/advcfg.htm

上記の「表 13-5 listener.oraファイルの外部プロシージャ設定」を読むとリスナーの設定が
必要のようだ。
「Net Manager」→「リスナー」→「LISTENER」→「その他のサービス」→「環境」

"EXTPROC_DLLS=ANY"
うまくいかん!

行番号 = 1 列番号 = 32 エラー・テキスト = PLS-00103: 記号"BEGIN"が見つかりました。 次のうちの1つが入るとき: ( ; is with authid as cluster compress order using compiled wrapped external deterministic parallel_enable pipelined

■参考サイト 外部プロシージャのコール http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19248-02/adfns_extern_proc.htm
OKLab - Oracle PL/SQL入門
http://www.oklab.org/oracle/plsql.xhtml






Comments: コメントを投稿

<< Home

This page is powered by Blogger. Isn't yours?