1

以下はエラーになります

drop function testing();
CREATE FUNCTION testing()
 RETURNS text
AS $$
import ctypes
try:
   ctypes.windll.LoadLibrary("D:\\jcc.dll")
except:
   import traceback
   plpy.error(traceback.format_exc())
return ''
$$ LANGUAGE plpythonu;
select testing();

エラーメッセージ:

ERROR:  ('Traceback (most recent call last):\n  File "<string>", line 5, in __plpython_procedure_testing_1517640\n  File "D:\\Python26\\Lib\\ctypes\\__init__.py", line 431, in LoadLibrary\n    return self._dlltype(name)\n  File "D:\\Python26\\Lib\\ctypes\\__init__.py", line 353, in __init__\n    self._handle = _dlopen(self._name, mode)\nWindowsError: [Error 126] The specified module could not be found\n',)

Python インタープリターでは問題なく動作します。

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> ctypes.windll.LoadLibrary("D:\\jcc.dll")
<WinDLL 'D:\jcc.dll', handle 410000 at 1d9cb10>
>>>
4

1 に答える 1

1

"指定されたモジュールが見つかりませんでした" は、Windows が出力する有用なエラー メッセージの 1 つですが、必ずしもそれが意味するとは限りません。

ロードしようとした DLLまたはそれが依存する DLLが見つからない場合、Windows はそのメッセージを生成します。

PostgreSQL は独自のユーザー アカウントで実行されるため、テスト時にインタープリターが実行されるパスとは異なる PATH があります。(たとえばjcc.dll)依存してc:\jccsupportfiles\aaa.dllおりc:\jccsupportfiles、PATHにあるがPgサーバーのPATHにない場合、それはあなたの問題を説明します。

Dependency Walker (depends.exe)を使用して、DLL が必要とする DLL とその場所を特定してみてください。PATH の問題かどうかを確認します。

Pg サーバーの PATH をいじるよりも、jcc.dll が必要とするすべての DLL を jcc.dll と同じディレクトリに配置することを検討してください。IIRC Windows は、依存するモジュールをロードしようとするときに、最初にロードするモジュールと同じディレクトリを常に検索します。

于 2011-11-29T03:14:03.973 に答える