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 STRINGRETURN 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)”按钮,即如下所示:

PLSQL调用JAVA存储过程实现修改系统日期及时间

6.        在虚拟机的设置的“Options”中的“Synchronize guest time with host”的选项不要勾选,如下:

PLSQL调用JAVA存储过程实现修改系统日期及时间

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;

PLSQL调用JAVA存储过程实现修改系统日期及时间