PLSQL调用JAVA存储过程实现修改系统日期及时间
PLSQL调用JAVA存储过程实现修改系统日期及时间
Author:张志远 mail:[email protected]
1. 以用户SCOTT登录,在PLSQL中执行如下脚本,即编译JAVA SOURCE:
create or replace and compile java source named exesyscommand as
import java.io.*;
import java.util.*;
public class ExeSysCommand
{
public static String ExeCmd(String argv) {
Runtime run = Runtime.getRuntime();
Process process = null;
try {
process = run.exec(argv); // 执行cmd命令
Thread.sleep(1000*2);
return "OK!";
} catch (Exception e) {
return e.getMessage();
}
}
public static void main(String[] args)
{
System.out.println("No command line arguments");
}
}
/
说明:本程序来源于网络。
2. 以用户SCOTT登录,在PLSQL中创建如下函数:
CREATE OR REPLACE FUNCTION execmd(cmd STRING) RETURN VARCHAR2 IS--执行OS命令测试
LANGUAGE JAVA NAME'ExeSysCommand.ExeCmd(java.lang.String) return java.lang.String';
3. 以用户SCOTT登录,在PLSQL中创建如下存储过程:
CREATE OR REPLACE PROCEDURE prc_set_server_datetime(p_datetime_str IN VARCHAR2) IS
/*******************************************************************************************************************
功能:按输入的日期和时间,设置服务器的日期和时间
参数说明:p_datetime_str YYYY-MM-DD HH24:MI:SS
********************************************************************************************************************/
v_cmd_status VARCHAR2(4000);
v_date DATE;
v_cmd_str VARCHAR2(4000);
BEGIN
--EXECUTE IMMEDIATE 'alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"';
IF p_datetime_str IS NOT NULL THEN
v_date := to_date(p_datetime_str, 'YYYY-MM-DDHH24:MI:SS');
v_cmd_str := 'cmd /c date ' || to_char(v_date, 'YYYY-MM-DD') || '&&time ' ||
to_char(v_date, 'HH24:MI:SS') || '&&exit';
SELECT execmd(v_cmd_str) INTO v_cmd_status FROM dual;
dbms_output.put_line(v_cmd_status);
END IF;
END prc_set_server_datetime;
4. 以sys用户登录SQLPLUS,执行如下过程,给当前用户授权:
execute dbms_java.grant_permission('SCOTT','SYS:java.io.FilePermission','<<ALL FILES>>','execute')
5. 在vmware虚拟机上打开控制面板的“区域和语言选项”,勾选“高级”tab页中的“默认用户账户设置”中的“将所有设置应用于当前用户账户和默认用户配置文件(D)”,并点击“应用(A)”按钮,即如下所示:
6. 在虚拟机的设置的“Options”中的“Synchronize guest time with host”的选项不要勾选,如下:
7. 以SCOTT用户执行如下存储过程,实现操作系统日期及时间的更改,注意,更改后需要等待2秒左右。
BEGIN
-- Call the procedure
prc_set_server_datetime(p_datetime_str =>'2018-08-10 21:00:00');
dbms_lock.sleep(3);
dbms_output.put_line(to_char(SYSDATE,'YYYY-MM-DD HH24:MI:SS'));
END;