以打印机为例,在FORM中可以用TEXT_IO来完成打印功能,程序如下:
PROCEDURE prn(linebuf varchar2) IS
BEGIN
declare
out_file text_io.file_type;
begin
out_file:=text_io.fopen('PRN','w');
text_io.putf(out_file,' %sn',linebuf);
text_io.fclose(out_file);
null;
end;
END;
注:需要先在Windows系统下添加相应的打印机驱动程序。
但有时打印机的驱动就是一个dll文件,TEXT_IO就不适用了,需要用ORA_FFI来解决。以下是一个调用dll的例子:
PACKAGE my IS
FUNCTION print(comname in out varchar2,dispstr in out varchar2)
RETURN PLS_INTEGER;
function iniCOM(comname in out varchar2,BaudRates pls_integer,Parity pls_integer,BteSize pls_integer,StopBits pls_integer)
return pls_integer;
FUNCTION closecom(comname in out varchar2)
RETURN PLS_INTEGER;
END;
PACKAGE BODY my IS
my_lhandle ORA_FFI.LIBHANDLETYPE;
print_fhandle ORA_FFI.FUNCHANDLETYPE;
closecom_fhandle ORA_FFI.FUNCHANDLETYPE;
inicom_fhandle ora_ffi.funchandletype;
FUNCTION ff_print(fhandle ORA_FFI.FUNCHANDLETYPE,
comname in out varchar2,
dispstr in out varchar2)
RETURN PLS_INTEGER;
PRAGMA interface(C, ff_print, 11265);
FUNCTION print(comname in out varchar2,dispstr in out varchar2)
RETURN PLS_INTEGER IS
BEGIN
RETURN(ff_print(print_fhandle,comname,dispstr));
END;
FUNCTION ff_closecom(fhandle ORA_FFI.FUNCHANDLETYPE,comname in out varchar2)
RETURN PLS_INTEGER;
PRAGMA interface(C, ff_closecom, 11265);
FUNCTION closecom(comname in out varchar2)
RETURN PLS_INTEGER IS
BEGIN
RETURN(ff_closecom(closecom_fhandle,comname));
END;
FUNCTION ff_inicom(fhandle ORA_FFI.FUNCHANDLETYPE,
ComName in out varchar2,BaudRates pls_integer,Parity pls_integer,BteSize pls_integer,StopBits pls_integer)
RETURN PLS_INTEGER;
PRAGMA interface(C, ff_inicom, 11265);
FUNCTION inicom(
comname in out varchar2,BaudRates pls_integer,Parity pls_integer,BteSize pls_integer,StopBits pls_integer)
RETURN PLS_INTEGER IS
BEGIN
RETURN(ff_inicom(inicom_fhandle,ComName,BaudRates,Parity,BteSize,StopBits));
END;
BEGIN
my_lhandle := ORA_FFI.LOAD_LIBRARY('d:', 'Custlist.dll'); --打印驱动程序,具体的功能函数必须参考说明
print_fhandle := ORA_FFI.REGISTER_FUNCTION
(my_lhandle, 'writeCOM', ORA_FFI.PASCAL_STD);
inicom_fhandle := ORA_FFI.REGISTER_FUNCTION
(my_lhandle, 'iniCOM', ORA_FFI.PASCAL_STD);
closecom_fhandle := ORA_FFI.REGISTER_FUNCTION
(my_lhandle, 'CloseCOM', ORA_FFI.PASCAL_STD);
ora_ffi.register_parameter(print_fhandle,ora_ffi.c_char_ptr);
ora_ffi.register_parameter(print_fhandle,ora_ffi.c_char_ptr);
ora_ffi.register_return(print_fhandle,ora_ffi.c_int);
ora_ffi.register_parameter(closecom_fhandle,ora_ffi.c_char_ptr);
ora_ffi.register_return(closecom_fhandle,ora_ffi.c_int);
ora_ffi.register_parameter(inicom_fhandle,ora_ffi.c_char_ptr);
ora_ffi.register_parameter(inicom_fhandle,ora_ffi.c_int);
ora_ffi.register_parameter(inicom_fhandle,ora_ffi.c_int);
ora_ffi.register_parameter(inicom_fhandle,ora_ffi.c_int);
ora_ffi.register_parameter(inicom_fhandle,ora_ffi.c_int);
ora_ffi.register_return(inicom_fhandle,ora_ffi.c_int);
END;
PROCEDURE prn(linebuf varchar2) IS
BEGIN
declare
sl pls_integer;
str varchar2(200);
comname varchar2(200);
cl pls_integer;
BaudRates pls_integer;
Parity pls_integer;
BteSize pls_integer;
StopBits pls_integer;
begin
str:=linebuf;
comname:='COM4'; --COM口
BaudRates:=9600; --波特率
Parity:=0; --无奇偶校验
BteSize:=8; --数据位
StopBits:=1; --停止位
cl:=my.inicom(comname,BaudRates,Parity,BteSize,StopBits); --初始化,其实初始化一次就行,不需要每次都初始化
sl:=my.print(comname,str); --打印输出
end;
END;
钱箱、客显都与打印机类似,只要有相对的dll。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/18966/viewspace-780594/ ,如需转载,请注明出处,否则将追究法律责任。