Browse Source

first commit

GTong 1 year ago
commit
0eae5eb3b7

+ 7 - 0
file/cluster.ini

@@ -0,0 +1,7 @@
+#MAX_NODES=16    MASTER_GRPS=1    PROTOCOL='UDP'    MSG_PORT_NUM=1    MAX_SEND_WIN=254 
+ MSG_HAVE_CRC=0    MERGE_SMALL_MSG=1    MSG_SIZE=64000    TIMEOUT=20000    RPC_WINDOW=16 
+ EJE_WINDOW=16    MAX_SHAKE_TIME=1200    MY_NID=0003    CHECK_RACK=0
+
+ NID=0001  RACK=0001  PORTS='192.168.75.140:50000'  ROLE='MSQW'  LPU=7  STORE_WEIGHT=10  STATE=DETECT;
+ NID=0002  RACK=0001  PORTS='192.168.75.141:50000'  ROLE='SQWG'  LPU=7  STORE_WEIGHT=10  STATE=DETECT;
+ NID=0003  RACK=0001  PORTS='192.168.75.142:50000'  ROLE='MSQW'  LPU=7  STORE_WEIGHT=10  STATE=DETECT;

+ 24 - 0
file/config.toml

@@ -0,0 +1,24 @@
+[node]
+target_file = "/DATA2/GT/TestA/test2/xugu"
+xugu_addr = "/DATA2/GT/TestA/test2/xugu"
+[node.1]
+ip_port = "10.28.20.101:22"
+user_password ="root:Xugu@2023"
+local_file = "./file/xugu"
+target_file = "/DATA2/GT/TestA/test2/xugu"
+[node.2]
+ip_port = "10.28.20.102:22"
+user_password ="root:Xugu@2023"
+local_file = "./file/xugu"
+
+
+
+[xugu]
+#local_file = "./file/xugu.ini"
+listen_port = "5193"
+
+[cluster]
+local_file ="./file/cluster.ini"
+
+
+

+ 168 - 0
file/xugu.ini

@@ -0,0 +1,168 @@
+#---------------------------------------------------------------
+# XuGu SQL Server 12.0.0
+#---------------------------------------------------------------
+
+#网络侦听设置
+    listen_port = 5190;  侦听端口
+    nio_timeout = 200;  网络读写超时(单位:秒)
+    login_timeout = 30;  登录超时时间(单位:秒)
+    use_std_nio = true;  是否使用标准网络监听器(标准监听使用select模型)
+    max_idle_time = 3600;  最大闲置时间(单位:秒,在此时间内若无请求,则断开连接,0表示无限制)
+    min_pass_len = 8;  口令的最短长度
+    pass_mode = 3;  口令模式 1:不重复字符或数字,2:字母+数字,3:字母+数字+符号
+    def_timezone = "GMT+08:00";  默认新建库和会话时区
+    def_timefmt = "YYYY-MM-DD HH24:MI:SS";  默认时间格式
+    def_charset = "GBK";  默认新建库和会话字符集
+    send_warning = true;  是否发送警告信息
+    conn_fail_cnt = 3;  禁止登陆的失败次数
+    max_act_conn_num = 0;  最大活动事务连接数(0表示无限制)
+    max_conn_num = 1024;  系统最大连接数(标准监听有效)
+    session_per_user = 1000;  默认用户可用连接数(0表示不限制)
+
+#系统并行度设置
+    thd_bind_mode = 0;  线程绑定cpu模式
+    task_thd_num = 16;  任务处理线程数
+    tcp_thd_num = 1;  TCP数据接收线程数
+    rsync_thd_num = 8;  远程同步处理线程数
+    rtran_thd_num = 8;  远程事务处理线程数
+    max_parallel = 1;  最大单任务并行度
+    cata_parti_num = 32;  目录分区数(建议设为CPU核数)
+    cata_hash_size = 8192;  系统对象目录速查Hash表尺度
+    lock_hash_size = 8192;  系统锁管理器Hash表尺度
+
+#系统缓冲区设置
+    data_buff_mem = 256;  数据缓冲区内存(单位:M)
+    swap_buff_mem = 64;  交换缓冲区内存(单位:M)
+    system_sga_mem = 128;  系统全局区内存(单位:M)
+    ena_share_sga = true;  是否允许缓冲区与SGA共享
+    xlog_buff_mem = 32;  事务日志缓冲区尺度(单位:M)
+    max_hash_size = 3000000;  最大Hash表槽数
+    max_hash_mem = 32;  允许单个hash节点使用的最大内存量(单位:M)
+    hash_parti_num = 16;  Hash运算在内存不够时转入分组处理的分组数
+    max_malloc_once = 512;  最大单次分配内存块大小(单位:M)
+    max_task_mem = 0;  任务线程运行最大内存(单位:M,0表示不限制)
+
+#SQL引擎设置
+    def_optimize_mode = 0;  默认优化模式(0:all rows,1:first rows,n:first n rows)
+    def_optimize_level = 3;  默认优化级别(预留暂未使用)
+    def_nulls_first = false;  默认排序时空值靠前(预留暂未使用)
+    max_prepare_num = 100;  最大prepared语句数
+    max_cursor_num = 100;  最大cursor数
+    prepare_reuse = true;  启用预处理重用
+    supple_prepare_sql = false;  补齐预处理定义语句
+    max_loop_num = 100000;  存储过程最大循环次数(0表示无限制)
+    proc_reuse_cnt = 1;  过程函数中SQL重用多少次后重解析规划(0表示不重解析)
+    delay_check_unique = false;  是否将唯一值检测延迟到事务结束时进行
+    str_trunc_warning = true;  字串超长时是否使用截断并告警
+    enable_lob_in_row = true;  是否允许将较小的大对象数据直接嵌入在行中(预留暂未使用)
+    def_empty_str_as_null = false;  是否默认将长度为0的字符串当作空值
+    auto_use_eje = false;  是否允许自动生成弹射式执行计划
+    auto_eje_cast = 10000;  自动生成弹射式执行计划的最小查询开销值(-1表示禁用并行执行)
+    auto_eje_parallel = 4;  自动生成弹射式执行计划的并行度参数
+    enable_eje_big_block = false;  是否允许弹射器堆扫描使用大块读策略
+    para_eje_seqscan_num = 2;  弹射器堆扫描器并行执行路数 
+    cata_case_sensitive = false;  系统字典大小写敏感
+    check_unique_mode = 2;  唯一值检测方式(1:不预检测 2:预检测)
+    ddl_timeout = 2000;  DDL操作加锁超时时间(ms)
+    tab_rebuild_limit = 10;  DDL表重整或复制行数限制(单位100万,0表示不限制)
+    use_index_order = false;  order by使用索引序
+    iscan_ini_cost = 200;  索引扫描初始化代价
+    seqscan_skip_err = false;  允许顺序扫描跳过847错误
+    enable_find_synonym = true;  允许查找同义词
+    support_global_tab = false;  是否支持全局临时表
+    idx_delay_del_limit = 0;  索引延迟删除量限制(不含唯一值索引,0表示不限制)
+    enable_sys_name_idx = false;  是否启用系统对象名索引(表名/视图名等)
+    enable_stream_import = false;  是否启用流导入功能
+    select_table_num = 12;  查询语句允许的最大表个数
+    def_index_row_length = 1024;  索引最大行长限制
+    week_mode = 0;  周数的计算模式(0-7)
+
+#存贮子系统参数
+    default_copy_num = 3;  存贮的默认版本个数
+    safely_copy_num = 2;  存贮的安全版本个数
+    enable_read_copy2 = false;  允许读存贮副本
+    max_hotspot_num = 256;  最大插入热点数
+    size_per_chunk = 8;  存储片大小(支持 1-64 单位:M)
+    block_size = 8192;  数据块大小
+    block_pctfree = 15;  默认新建表存储块空闲度百分比
+    init_data_space_num = 4;  初始化系统时数据表空间个数
+    init_temp_space_num = 2;  初始化系统时临时表空间个数
+    init_undo_space_num = 2;  初始化系统时回滚表空间个数
+    def_data_space_size = 256;  默认数据表空间的初始尺度(单位:M)
+    def_temp_space_size = 256;  默认临时表空间的初始尺度(单位:M)
+    def_undo_space_size = 256;  默认回滚表空间的初始尺度(单位:M)
+    def_redo_file_size = 500;  默认重做日志文件尺度(单位:M)
+    def_file_step_size = 64;  默认表空间文件的增长步长(单位:M)
+    max_temp_space_size = -1;  临时表空间的最大尺度(单位:M,-1表示不限制)
+    max_file_size = -1;  默认系统初始化数据和临时文件最大尺度(单位:M,-1表示不限制)
+    auto_extend_dfile = false;  是否允许自动扩展数据表空间文件
+    store_drop_delay = 16;  局部存贮的延迟删除时间(单位:分钟)
+    store_maint_span = 0;  存贮维护间隔时间(单位:ms,0表示不间隔)
+    enable_store_migrate = false;  是否允许自动迁移存储单元
+    ov_reuse = false;  是否允许OV存储重用
+    index_preload_cnt = 10000;  启用索引存储预加载最小个数(0表示不启用预加载)
+    data_file_append_mode = 0;  扩展文件大小时是否写实(0:写实,1:不写)
+    ioerr_report_mode = 1;  数据文件读写错时处理模式(0:block,1:space)
+
+#存贮子系统附属参数
+    datafile_use_aio = true;  是否启用异步文件IO
+    write_back_thd_num = 1;  磁盘回写线程数(同步IO有效,异步IO取固定值1)
+    max_write_back_num = 32;  脏块回写队列的最大深度
+    catalog_write_through = 2;  系统控制信息回写方式(1:立即保存 2:立即写通)
+    datafile_write_through = true;  是否要求OS对数据文件的更改立即写回磁盘
+    datafile_random_access = false;  数据文件是否以伪随机存取优化方式打开
+    redo_write_through = false;  重做日志文件是否写通方式打开
+    cache_undo_wrt = 1;  是否换缓存UNDO到REDO时写入(0:单独写,1:合并写,2:不写)
+    data_persistence = 0;  数据持久化策略
+    major_retry_num = 20;  重取主存储重试次数(50ms/次)
+    gstore_pick_mode = 1;  Gstore缓存访问并发控制模式(0:值比较,1:校验码,2:锁)
+    major_control_mode = 0;  存储主版本策略(0:轮转,1:固定到第一个存储节点)
+
+#事务子系统参数
+    strictly_commit = false;  事务日志必须写实
+    def_auto_commit = true;  事务默认为自动提交
+    def_iso_level = 1;  默认事务隔离级别(0:只读,1:读已提交,2:重复读,3:序列化)
+    max_trans_modify = 10000;  单个事务最大允许变更行数(0表示不限制)
+    dlock_check_delay = 3000;  死锁检测延迟时间(单位:ms)
+    checkpoint_delay = 15;  Checkpoint的延迟时间(单位:分钟)
+    exit_when_redo_err = true;  重做恢复失败时,系统是否退出
+    skip_boot_rollback = false;  跳过启动时回滚
+    undo_delay_free = 3000;  UNDO项延迟释放时间(单位:ms,0表示立即释放)
+    node_dead_delay = 30;  节点判死心跳次数(2秒/次)
+    enable_node_degrade = true;  是否启用节点降级
+
+#数据备份与同步复制
+    modify_log_parti_num = 8;  变更日志并行写通道数
+    modify_log_pice_len = 100;  变更日志文件分片大小(单位:M)
+    ignore_when_meta_err = 2;  变更日志元信息错误处理模式(0:抛错 1:返回NULL 2:不返回)
+    max_allow_lob_len = 10;  允许记载的最大大对象大小(单位:M)
+    log_archive_mode = 0;  重做日志归档模式(0:不归档,1:拷贝REDO,2:移动REDO)
+    log_supplement = false;  是否开启日志增补
+    enable_recycle = false;  是否启用表级回收站
+
+#系统运行(跟踪)日志参数
+    reg_command = false;  是否记录SQL命令
+    reg_ddl = false;  是否记录DDL命令
+    error_level = 3;  错误日志最低记载等级
+    errlog_size = 100;  错误日志分割长度(单位:M)
+    trace_login = true;  是否跟踪非法登录事件
+    core_dump = false;  是否在内存段错误时进行coredump
+    is_zh = false;  启用中文日志信息
+
+#安全审计参数
+    enable_audit = false;  是否允许审计
+    security_level = 0;  安全等级(0-2)
+
+#系统分析参数
+    enable_analyze = true;  是否启用定时分析功能
+    analyze_time = "02:00:00";  定时分析默认执行时间
+    analyze_threshold = 10;  默认统计分析触发阈值(1--100之间的整数)
+    analyze_mode = 1;  默认统计分析模式(1或2)
+    analyze_level = 2;  默认统计分析采样级别(1-6)
+    enable_monitor = 1;  监控信息统计设置标记位
+    debug_flag = 0;  数据库调试标记位
+
+#兼容性参数
+    def_identity_mode = 0;  自增列模式(1:NULL值自增; 2:0和NULL值自增)
+    def_group_by_mode = 0;  GROUPBY语句模式(0:标准模式; 1:MySQL方言写法)
+    def_compatible_mode = "NONE";  异构库兼容模式的默认值

BIN
file/xugu/BIN/xgconsole


+ 3827 - 0
file/xugu/BIN/xugu_init.sql

@@ -0,0 +1,3827 @@
+/*
+ * VERSION: 12.3.1
+ * LAST MODIFIED TIME: 2023-11-28
+ */
+----管理员工具包------------------
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_DBA 
+IS
+       PROCEDURE KILL_TRANS(NODEID INTEGER,TRANID BIGINT);
+       PROCEDURE KILL_SESSION(NODEID INTEGER,SESSID INTEGER);
+       PROCEDURE KILL_SESSION_TRANS(NODEID INTEGER,SESSID INTEGER);
+END SYSDBA.DBMS_DBA;
+/
+
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_DBA 
+IS
+	PROCEDURE KILL_TRANS(NODEID INTEGER,TRANID BIGINT)
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_KILL_TRANS";
+        
+	PROCEDURE KILL_SESSION(NODEID INTEGER,SESSID INTEGER)
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_KILL_SESSION";
+	
+	PROCEDURE KILL_SESSION_TRANS(NODEID INTEGER,SESSID INTEGER)
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_KILL_SESSION_TRANS";
+
+END SYSDBA.DBMS_DBA;
+/
+
+
+/***********创建DBMS_OUTPUT包*****************************/
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_OUTPUT 
+IS
+	PROCEDURE PUT_LINE(str VARCHAR);
+END SYSDBA.DBMS_OUTPUT;
+/
+
+----包体
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_OUTPUT 
+IS
+	
+	PROCEDURE PUT_LINE(str VARCHAR)
+	IS
+	BEGIN
+		send_msg(str);
+	END;
+	
+END SYSDBA.DBMS_OUTPUT;
+/
+
+/***********创建DBMS_INFO包(用于查询系统信息)***************/
+----包头
+CREATE PACKAGE SYSDBA.DBMS_INFO 
+IS
+	SUBTYPE  FileInfo IS RECORD(IS_DIR BOOLEAN,DB_PATH VARCHAR(256),OS_PATH VARCHAR(256));
+	SUBTYPE  FInfoTab IS TABLE OF FileInfo;
+	FUNCTION FILE_LIST(_dir VARCHAR) RETURN FInfoTab;
+END SYSDBA.DBMS_INFO;
+/
+
+----包体
+CREATE PACKAGE BODY SYSDBA.DBMS_INFO 
+IS
+	FUNCTION FILE_LIST(_dir VARCHAR) RETURN FInfoTab
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_FILE_LIST";
+END SYSDBA.DBMS_INFO;
+/
+
+
+----网络测试包------------------
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_TEST 
+IS
+	FUNCTION TEST_PING_PONG1(TARG_NID INTEGER,PACK_NUM INTEGER) RETURN INTEGER;
+	FUNCTION TEST_PING_PONG2(TARG_NID INTEGER,PACK_SIZE INTEGER,PACK_NUM INTEGER) RETURN INTEGER;
+	FUNCTION TEST_MSG_SEND1(TARG_NID INTEGER,PACK_SIZE INTEGER,PACK_NUM INTEGER) RETURN INTEGER;
+	FUNCTION TEST_MSG_SEND2(TARG_NID INTEGER,PACK_SIZE INTEGER,PACK_NUM INTEGER) RETURN INTEGER;
+	FUNCTION TEST_RPC_SEND(TARG_NID INTEGER,SEND_SIZE INTEGER) RETURN INTEGER;
+END SYSDBA.DBMS_TEST ;
+/
+
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_TEST  
+IS
+	FUNCTION TEST_PING_PONG1(TARG_NID INTEGER,PACK_NUM INTEGER) RETURN INTEGER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_TEST_PING_PONG1";
+
+	FUNCTION TEST_PING_PONG2(TARG_NID INTEGER,PACK_SIZE INTEGER,PACK_NUM INTEGER) RETURN INTEGER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_TEST_PING_PONG2";
+	
+	FUNCTION TEST_MSG_SEND1(TARG_NID INTEGER,PACK_SIZE INTEGER,PACK_NUM INTEGER) RETURN INTEGER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_TEST_MSG_SEND1";
+	
+	FUNCTION TEST_MSG_SEND2(TARG_NID INTEGER,PACK_SIZE INTEGER,PACK_NUM INTEGER) RETURN INTEGER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_TEST_MSG_SEND2";
+	
+	FUNCTION TEST_RPC_SEND(TARG_NID INTEGER,SEND_SIZE INTEGER) RETURN INTEGER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_TEST_RPC_SEND";
+END SYSDBA.DBMS_TEST ;
+/
+
+-----统计信息设置包-------------
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_STAT
+IS
+	PROCEDURE SET_STAT_INFO(TABLE_NAME VARCHAR,FIELD_NAME VARCHAR,MAX_VAL VARCHAR,MIN_VAL VARCHAR,REPET_RATE DOUBLE,DISPERSION DOUBLE);
+	PROCEDURE ANALYZE_TABLE(TABLE_NAME VARCHAR,FIELD_NAME VARCHAR,SAMPLE_RATE INTEGER,HSITOGRAM_NUM INTEGER);
+        PROCEDURE SET_ANALYZE_SCHEME(TABLE_NAME VARCHAR,SCHE_NAME VARCHAR,ENABLE BOOL);
+        PROCEDURE SET_ANALYZE_PARAM(TABLE_NAME VARCHAR,MODE TINYINT,THRESHOLD TINYINT,LEVEL TINYINT);
+        PROCEDURE SET_ANALYZE_OPTIMIZE(TABLE_NAME VARCHAR,PERIOD SMALLINT,MODE TINYINT);
+        PROCEDURE SET_ANALYZE_COLUMNS(TABLE_NAME VARCHAR,FIELD_NAME VARCHAR,STATUS TINYINT); 
+        FUNCTION  GET_STAT_INFO(TABLE_NAME VARCHAR) RETURN VARCHAR;
+END SYSDBA.DBMS_STAT ;
+/
+
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_STAT  
+IS
+	PROCEDURE SET_STAT_INFO(TABLE_NAME VARCHAR,FIELD_NAME VARCHAR, MAX_VAL VARCHAR,MIN_VAL VARCHAR,REPET_RATE DOUBLE,DISPERSION DOUBLE)
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_STAT_INFO";
+
+	PROCEDURE ANALYZE_TABLE(TABLE_NAME VARCHAR,FIELD_NAME VARCHAR,SAMPLE_RATE INTEGER,HSITOGRAM_NUM INTEGER)
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_ANALYZE_TABLE";
+
+        PROCEDURE SET_ANALYZE_SCHEME(TABLE_NAME VARCHAR,SCHE_NAME VARCHAR,ENABLE BOOL)
+        IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_ANALYZE_SCHEME";
+
+        PROCEDURE SET_ANALYZE_PARAM(TABLE_NAME VARCHAR,MODE TINYINT,THRESHOLD TINYINT,LEVEL TINYINT)
+        IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_ANALYZE_PARAM";
+
+        PROCEDURE SET_ANALYZE_OPTIMIZE(TABLE_NAME VARCHAR,PERIOD SMALLINT,OPTI_MODE TINYINT)
+        IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_ANALYZE_OPTIMIZE";
+
+        PROCEDURE SET_ANALYZE_COLUMNS(TABLE_NAME VARCHAR,FIELD_NAME VARCHAR,STATUS TINYINT)
+        IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_ANALYZE_COLUMNS";
+
+        FUNCTION  GET_STAT_INFO(TABLE_NAME VARCHAR) RETURN VARCHAR
+        IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_GET_STAT_INFO";
+	
+END SYSDBA.DBMS_STAT ;
+/
+
+----系统导入包,使用流方式快速导入数据,主要导入完成需要手动创建索引-------
+CREATE OR REPLACE  PACKAGE SYSDBA.DBMS_IMPORT
+IS
+  /* 列分隔符格式数据导入 */
+  FUNCTION IMPORT_TABLE_FROM_TXT(TABLE_NAME VARCHAR,    /* 表名 */
+                                 MODE INTEGER,          /* 追加模式 1:append 2:replace 异常值:append*/
+								 FLD_SEPARATOR VARCHAR, /* 列分隔符(仅支持单字符) */
+								 REINDEX BOOL)          /* 已暂未使用 */
+								 RETURN BIGINT;         /* 返回导入行数 */
+  /* 长度指示格式数据导入 */
+  FUNCTION IMPORT_TABLE_FROM_NET(TABLE_NAME VARCHAR,    /* 表名 */
+                                 MODE INTEGER,          /* 追加模式 1:append 2:replace 异常值:append*/
+								 REINDEX BOOL)          /* 已暂未使用 */
+								 RETURN BIGINT;	        /* 返回导入行数 */
+END SYSDBA.DBMS_TEST;
+/
+
+CREATE OR REPLACE  PACKAGE BODY SYSDBA.DBMS_IMPORT  
+IS
+	FUNCTION IMPORT_TABLE_FROM_TXT(TABLE_NAME VARCHAR,MODE INTEGER,FLD_SEPARATOR VARCHAR,REINDEX BOOL) RETURN BIGINT
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_IMPORT_TABLE_FROM_TXT";
+	
+	FUNCTION IMPORT_TABLE_FROM_NET(TABLE_NAME VARCHAR,MODE INTEGER,REINDEX BOOL) RETURN BIGINT
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_IMPORT_TABLE_FROM_NET";	
+END SYSDBA.DBMS_IMPORT ;
+/
+
+/***********创建DBMS_SCHEDULER包(用于查询系统信息)***************/
+----包头
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_SCHEDULER 
+AUTHID CURRENT_USER
+IS
+	 PROCEDURE CREATE_JOB (
+	   job_name             IN VARCHAR2,
+	   job_type             IN VARCHAR2,
+	   job_action           IN VARCHAR2,
+	   number_of_arguments  IN PLS_INTEGER              DEFAULT 0,
+	   start_date           IN TIMESTAMP  							DEFAULT NULL,
+	   repeat_interval      IN VARCHAR2                 DEFAULT NULL,
+	   end_date             IN TIMESTAMP 								DEFAULT NULL,
+	   job_class            IN VARCHAR2                 DEFAULT 'DEFAULT_JOB_CLASS',
+	   enabled              IN BOOLEAN                  DEFAULT FALSE,
+	   auto_drop            IN BOOLEAN                  DEFAULT TRUE,
+	   comments             IN VARCHAR2                 DEFAULT NULL);
+
+	 PROCEDURE SET_ATTRIBUTE (
+   	name           IN VARCHAR2,
+   	attribute      IN VARCHAR2,
+   	value          IN VARCHAR2);
+
+	 PROCEDURE SET_ATTRIBUTE (
+   	name           IN VARCHAR2,
+   	attribute      IN VARCHAR2,
+   	value          IN TIMESTAMP);
+                      
+	 PROCEDURE SET_ATTRIBUTE (
+   	name           IN VARCHAR2,
+   	attribute      IN VARCHAR2,
+   	value          IN PLS_INTEGER);
+   	
+	 PROCEDURE SET_ATTRIBUTE (
+   	name           IN VARCHAR2,
+   	attribute      IN VARCHAR2,
+   	value          IN BOOLEAN);
+   	
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN VARCHAR2);
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN VARCHAR2);
+  
+  PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN TINYINT);
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN TINYINT); 
+   
+  PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN SMALLINT);
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN SMALLINT); 
+
+  PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN INTEGER);
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN INTEGER);
+	
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN BIGINT);
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN BIGINT);
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN FLOAT);
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN FLOAT);
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN DOUBLE);
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN DOUBLE);
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN NUMERIC);
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN NUMERIC);
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN BOOLEAN); 
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN BOOLEAN);
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN TIME);
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN TIME);
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN DATE); 
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN DATE);
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN DATETIME); 
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN DATETIME);
+
+	PROCEDURE RUN_JOB (
+   job_name                IN VARCHAR2,
+   use_current_session     IN BOOLEAN DEFAULT TRUE);
+
+	PROCEDURE ENABLE (
+  	name              		IN VARCHAR2);
+	   
+	PROCEDURE DISABLE (
+  	name              		IN VARCHAR2,
+   	force             		IN BOOLEAN DEFAULT FALSE);
+  
+  PROCEDURE DROP_JOB (
+   job_name           		IN VARCHAR2,
+   force              		IN BOOLEAN DEFAULT FALSE);
+	
+	FUNCTION  JOB_NEXT_RUNTIME(
+	 job_name								IN VARCHAR2,
+	 last_rt								IN DATETIME) RETURN DATETIME;
+
+	FUNCTION  NEXT_RUNTIME(
+	 repeat_interval 				IN VARCHAR2,
+	 last_rt		IN DATETIME) RETURN DATETIME;
+	 		 	   	 
+END SYSDBA.DBMS_SCHEDULER;
+/
+
+----包体
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_SCHEDULER 
+IS
+	 PROCEDURE CREATE_JOB (
+	   job_name             IN VARCHAR2,
+	   job_type             IN VARCHAR2,
+	   job_action           IN VARCHAR2,
+	   number_of_arguments  IN PLS_INTEGER              DEFAULT 0,
+	   start_date           IN TIMESTAMP  							DEFAULT NULL,
+	   repeat_interval      IN VARCHAR2                 DEFAULT NULL,
+	   end_date             IN TIMESTAMP  							DEFAULT NULL,
+	   job_class            IN VARCHAR2                 DEFAULT 'DEFAULT_JOB_CLASS',
+	   enabled              IN BOOLEAN                  DEFAULT FALSE,
+	   auto_drop            IN BOOLEAN                  DEFAULT TRUE,
+	   comments             IN VARCHAR2                 DEFAULT NULL)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_CREATE_JOB";   
+
+PROCEDURE SET_ATTRIBUTE (
+   	name           IN VARCHAR2,
+   	attribute      IN VARCHAR2,
+   	value          IN VARCHAR2)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_SET_STR_ATTRIBUTE";   
+
+PROCEDURE SET_ATTRIBUTE (
+   	name           IN VARCHAR2,
+   	attribute      IN VARCHAR2,
+   	value          IN TIMESTAMP)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_SET_DT_ATTRIBUTE";   
+                      
+PROCEDURE SET_ATTRIBUTE (
+   	name           IN VARCHAR2,
+   	attribute      IN VARCHAR2,
+   	value          IN PLS_INTEGER)
+ IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_SET_I4_ATTRIBUTE";   
+  	
+PROCEDURE SET_ATTRIBUTE (
+   	name           IN VARCHAR2,
+   	attribute      IN VARCHAR2,
+   	value          IN BOOLEAN)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_SET_BOOL_ATTRIBUTE";   
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN VARCHAR2)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_STR_ARG_BY_ORD";   
+   	
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN VARCHAR2)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_STR_ARG_BY_NAME";   
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN INTEGER)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_I4_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN INTEGER)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_I4_ARG_BY_NAME";  
+	
+	
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN TINYINT)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_I1_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN TINYINT)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_I1_ARG_BY_NAME";  	
+	
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN SMALLINT)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_I2_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN SMALLINT)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_I2_ARG_BY_NAME";  		
+	
+	
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN BIGINT)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_I8_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN BIGINT)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_I8_ARG_BY_NAME";  
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN FLOAT)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_R4_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN FLOAT)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_R4_ARG_BY_NAME";  
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN DOUBLE)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_R8_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN DOUBLE)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_R8_ARG_BY_NAME";  
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN NUMERIC)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_NUM_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN NUMERIC)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_NUM_ARG_BY_NAME";  
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN BOOLEAN)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_BOOL_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN BOOLEAN)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_BOOL_ARG_BY_NAME";  
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN TIME)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_TIME_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN TIME)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_TIME_ARG_BY_NAME";  
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN DATE)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_DATE_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN DATE)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_DATE_ARG_BY_NAME";  
+
+PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_position      IN PLS_INTEGER,
+   argument_value         IN DATETIME)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_DT_ARG_BY_ORD";   
+
+	PROCEDURE SET_JOB_ARGUMENT_VALUE (
+   job_name               IN VARCHAR2,
+   argument_name          IN VARCHAR2,
+   argument_value         IN DATETIME)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_SET_JOB_DT_ARG_BY_NAME";  
+
+	PROCEDURE RUN_JOB (
+   job_name                IN VARCHAR2,
+   use_current_session     IN BOOLEAN DEFAULT TRUE)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RUN_JOB";   
+  	
+	PROCEDURE ENABLE (
+  	name              		IN VARCHAR2)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_ENABLE_JOB";   
+  	
+	   
+	PROCEDURE DISABLE (
+  	name              		IN VARCHAR2,
+   	force             		IN BOOLEAN DEFAULT FALSE)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_DISABLE_JOB";
+  
+  PROCEDURE DROP_JOB (
+   job_name           		IN VARCHAR2,
+   force              		IN BOOLEAN DEFAULT FALSE)
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_DROP_JOB";
+
+	FUNCTION  JOB_NEXT_RUNTIME(
+	 job_name								IN VARCHAR2,
+	 last_rt								IN DATETIME) RETURN DATETIME
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_GET_JOB_NEXT_RUNTIME";	 
+
+	FUNCTION  NEXT_RUNTIME(
+	 repeat_interval 				IN VARCHAR2,
+	 last_rt								IN DATETIME) RETURN DATETIME
+IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_GET_NEXT_RUNTIME";
+	   
+END SYSDBA.DBMS_SCHEDULER;
+/
+
+/**************创建DBMS_SQL包********************/
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_SQL
+AUTHID CURRENT_USER
+IS
+	  --参数描述信息结构 
+	SUBTYPE	 TParaInfo IS RECORD(ParaName VARCHAR(128),	--参数名
+		 			ParaNo    INTEGER, 		--编号
+		 			ParaTid   INTEGER,		--类型ID
+		 			ParaScale INTEGER,		--精度标度
+		 			BindState INTEGER);	 	--绑定状态(0:未绑定 1:已绑定)	
+	SUBTYPE	 TParams  IS TABLE OF TParaInfo;
+	--结果字段描述信息结构
+	SUBTYPE	 TResInfo IS  RECORD(ResName VARCHAR(128),	--输出字段名
+		 			ResTid   INTEGER,		--输出字段类型
+		 			ResScale INTEGER,		--输出精度标度
+		 			ResFlag  INTEGER,		--输出附加标志
+		 			TargTid INTEGER,		--接收变量的类型ID
+		 			TargScale INTEGER);		--接收变量的类型精度标度
+	SUBTYPE	 TResults IS TABLE OF TResInfo;
+	--游标对象结构
+	SUBTYPE  TCursor IS RECORD(StmtState  INTEGER,		--当前状态
+	   				StmtType INTEGER,		--parse返回的语句类型
+	   				StmtSQL VARCHAR(2000),		--SQL语句
+	   				ObjPtr VARCHAR(20),		--内部对象名(归系统使用)
+	   				ParaInfos TParams,		--参数描述表
+	   				ResInfos TResults);	 	--输出描述表
+	SUBTYPE  CursorVarr IS VARRAY(100) OF TCursor;
+	--常量定义
+	NATIVE			      INTEGER :=1;
+	   				      
+	TYPE_BOOL			  INTEGER :=2;
+	TYPE_I1			      INTEGER :=3;
+	TYPE_I2			      INTEGER :=4;
+	TYPE_I4			      INTEGER :=5;
+	TYPE_I8			      INTEGER :=6;
+	TYPE_NUMERIC	      INTEGER :=7;
+	TYPE_R4			      INTEGER :=8;
+	TYPE_R8			      INTEGER :=9;	   
+	TYPE_DATE		      INTEGER :=10;
+	TYPE_TIME		      INTEGER :=11;
+	TYPE_TIMEZ		      INTEGER :=12;
+	TYPE_DATETIME	      INTEGER :=13;
+	TYPE_DATETIMEZ        INTEGER :=14;
+	TYPE_INTERVAL_Y		  INTEGER :=15;
+	TYPE_INTERVAL_Y2M	  INTEGER :=16;
+	TYPE_INTERVAL_M		  INTEGER :=17;
+	TYPE_INTERVAL_D		  INTEGER :=18;
+	TYPE_INTERVAL_D2H     INTEGER :=19;
+	TYPE_INTERVAL_H		  INTEGER :=20;
+	TYPE_INTERVAL_D2M	  INTEGER :=21;
+	TYPE_INTERVAL_H2M	  INTEGER :=22;
+	TYPE_INTERVAL_MI	  INTEGER :=23;
+	TYPE_INTERVAL_D2S	  INTEGER :=24;
+	TYPE_INTERVAL_H2S	  INTEGER :=25;
+	TYPE_INTERVAL_M2S	  INTEGER :=26;
+	TYPE_INTERVAL_S		  INTEGER :=27;
+	TYPE_ROWVER			  INTEGER :=28;
+	TYPE_GUID			  INTEGER :=29;
+	TYPE_STR		      INTEGER :=30;
+	TYPE_CHAR		      INTEGER :=30;
+	TYPE_VARCHAR	      INTEGER :=30;
+	TYPE_CLOB		      INTEGER :=32;
+	TYPE_BINARY		      INTEGER :=33;
+	TYPE_BLOB	  	      INTEGER :=34;
+	TYPE_ROWID	  	      INTEGER :=45;
+	
+	--SQL状态
+	STMT_STATE_OPENED      INTEGER := 1;
+	STMT_STATE_PARSED      INTEGER := 2;
+	STMT_STATE_BINDED      INTEGER := 3;
+	STMT_STATE_DEFINED     INTEGER := 4;
+	STMT_STATE_EXCUTED     INTEGER := 5;
+	STMT_STATE_FETCHED     INTEGER := 6;
+
+	--游标对象数组 																
+	Cursors	  CursorVarr;
+	   
+	FUNCTION  STROF_CURSOR(CurNo INTEGER) RETURN VARCHAR(5000);
+	FUNCTION  OPEN_CURSOR() RETURN INTEGER;		 
+	FUNCTION  IS_OPEN(c IN INTEGER) RETURN BOOLEAN;
+	FUNCTION  PARSE(CurNo INTEGER,StmtSQL VARCHAR,SqlType INTEGER) RETURN INTEGER;
+	FUNCTION  EXECUTE(CurNo INTEGER) RETURN INTEGER;
+	FUNCTION  FETCH_ROWS(CurNo INTEGER) RETURN INTEGER;
+	FUNCTION  CLOSE_CURSOR(CurNo INTEGER) RETURN INTEGER;
+
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val BOOLEAN) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val TINYINT) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val SMALLINT) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTEGER) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val BIGINT) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val FLOAT) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val DOUBLE) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val NUMERIC) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val VARCHAR) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val CLOB) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val BLOB) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val TIME) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val TIME WITH TIME ZONE) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val DATE) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val DATETIME) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val DATETIME WITH TIME ZONE) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL YEAR) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL YEAR TO MONTH) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL MONTH) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL DAY) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL DAY TO HOUR) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL HOUR) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL DAY TO MINUTE) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL HOUR TO MINUTE) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL MINUTE) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL DAY TO SECOND) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL HOUR TO SECOND) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL MINUTE TO SECOND) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL SECOND) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val GUID) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val BINARY) RETURN INTEGER;
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val ROWID) RETURN INTEGER;
+		 
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT BOOLEAN) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT TINYINT) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT SMALLINT) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTEGER) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT BIGINT) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT FLOAT) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT DOUBLE) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT NUMERIC) RETURN INTEGER;	
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT VARCHAR) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT CLOB) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT BLOB) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT TIME) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT TIME WITH TIME ZONE) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT DATE) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT DATETIME) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT DATETIME WITH TIME ZONE) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL YEAR) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL YEAR TO MONTH) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MONTH) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO HOUR) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO MINUTE) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR TO MINUTE) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MINUTE) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO SECOND) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR TO SECOND) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MINUTE TO SECOND) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL SECOND) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT GUID) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT BINARY) RETURN INTEGER;
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT ROWID) RETURN INTEGER;
+
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT BOOLEAN) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT TINYINT) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT SMALLINT) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTEGER) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT BIGINT) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT FLOAT)  RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT DOUBLE) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT NUMERIC) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT VARCHAR) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT CLOB) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT BLOB) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT TIME) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT TIME WITH TIME ZONE) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT DATE) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT DATETIME) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT DATETIME WITH TIME ZONE) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL YEAR) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL YEAR TO MONTH) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MONTH) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO HOUR) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO MINUTE) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR TO MINUTE) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MINUTE) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO SECOND) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR TO SECOND) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MINUTE TO SECOND) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL SECOND) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT GUID) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT BINARY) RETURN INTEGER;
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT ROWID) RETURN INTEGER;
+END  SYSDBA.DBMS_SQL;
+/
+
+/**************创建DBMS_SQL包体********************/
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_SQL
+IS
+
+	FUNCTION	BLDIN_PARSE(sql_str VARCHAR,sys_obj OUT VARCHAR,paras_info OUT TParams,targs_info OUT TResults) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_PARSE";
+
+	FUNCTION 	BLDIN_EXECUTE(ObjName VARCHAR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_EXECUTE";
+		
+	FUNCTION 	BLDIN_FETCH_ROWS (ObjName VARCHAR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_FETCH";
+
+	FUNCTION	BLDIN_CLOSE_CURSOR(Cur VARCHAR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_CLOSE_STMT";
+
+	FUNCTION	BLDIN_PARA_NAME_CMP(sor_name VARCHAR,targ_name VARCHAR) RETURN BOOLEAN
+		IS	LANGUAGE  "C"  NAME  "BLDIN_PARA_NAME_CMP";
+		
+	FUNCTION	BLDIN_BIND_BOOL(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val BOOLEAN) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_BOOL(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val BOOLEAN) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+
+	FUNCTION	BLDIN_BIND_I1(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val TINYINT) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_I1(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val TINYINT) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+		
+	FUNCTION	BLDIN_BIND_I2(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val SMALLINT) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_I2(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val SMALLINT) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+				
+	FUNCTION	BLDIN_BIND_I4(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTEGER) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_I4(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTEGER) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+			
+	FUNCTION	BLDIN_BIND_I8(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val BIGINT) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";	
+
+	FUNCTION	BLDIN_NAME_BIND_I8(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val BIGINT) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";	
+	
+	FUNCTION	BLDIN_BIND_R4(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val FLOAT) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+		
+	FUNCTION	BLDIN_NAME_BIND_R4(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val FLOAT) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_R8(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val DOUBLE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_R8(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val DOUBLE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+
+	FUNCTION	BLDIN_BIND_Str(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val VARCHAR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+
+	FUNCTION	BLDIN_NAME_BIND_Str(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val VARCHAR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+
+	FUNCTION	BLDIN_BIND_CLOB(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val CLOB) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";		
+		
+	FUNCTION	BLDIN_NAME_BIND_CLOB(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val CLOB) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+
+	FUNCTION	BLDIN_BIND_BLOB(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val BLOB) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+
+	FUNCTION	BLDIN_NAME_BIND_BLOB(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val BLOB) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+
+	FUNCTION	BLDIN_BIND_T(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val TIME) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_T(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val TIME) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+		
+	FUNCTION	BLDIN_BIND_TZ(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val TIME WITH TIME ZONE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_TZ(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val TIME WITH TIME ZONE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_D(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val DATE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+
+	FUNCTION	BLDIN_NAME_BIND_D(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val DATE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+
+	FUNCTION	BLDIN_BIND_DT(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val DATETIME) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+
+	FUNCTION	BLDIN_NAME_BIND_DT(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val DATETIME) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_DTZ(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val DATETIME WITH TIME ZONE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+
+	FUNCTION	BLDIN_NAME_BIND_DTZ(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val DATETIME WITH TIME ZONE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_IY(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL YEAR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+
+	FUNCTION	BLDIN_NAME_BIND_IY(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL YEAR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_IY2M(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL YEAR TO MONTH) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_IY2M(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL YEAR TO MONTH) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_IM(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL MONTH) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_IM(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL MONTH) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_ID(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL DAY) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_ID(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL DAY) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_ID2H(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL DAY TO HOUR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_ID2H(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL DAY TO HOUR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_IH(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL HOUR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_IH(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL HOUR) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_ID2M(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL DAY TO MINUTE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_ID2M(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL DAY TO MINUTE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_IH2M(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL HOUR TO MINUTE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_IH2M(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL HOUR TO MINUTE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_IMI(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL MINUTE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_IMI(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL MINUTE) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_ID2S(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL DAY TO SECOND) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_ID2S(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL DAY TO SECOND) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_IH2S(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL HOUR TO SECOND) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_IH2S(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL HOUR TO SECOND) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_IM2S(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL MINUTE TO SECOND) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_IM2S(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL MINUTE TO SECOND) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_IS(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val INTERVAL SECOND) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_IS(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val INTERVAL SECOND) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_N(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val NUMERIC) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+
+	FUNCTION	BLDIN_NAME_BIND_N(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val NUMERIC) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_GUID(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val GUID) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_GUID(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val GUID) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_BINARY(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val BINARY) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_BINARY(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val BINARY) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION	BLDIN_BIND_ROWID(obj_name VARCHAR,para_no INTEGER,para_tid INTEGER,para_val ROWID) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND";
+	
+	FUNCTION	BLDIN_NAME_BIND_ROWID(obj_name VARCHAR,para_name VARCHAR,para_tid INTEGER,para_val ROWID) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_BIND_BY_NAME";
+	
+	FUNCTION 	BLDIN_DEFINE_COLUMN (ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_DEFINE_COLUMN";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_BOOL(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN BOOLEAN
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+	
+	FUNCTION 	BLDIN_COLUMN_VALUE_I1(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN TINYINT
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_I2(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN SMALLINT
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_I4(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTEGER
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_I8(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN BIGINT
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_R4(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN FLOAT
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_R8(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN DOUBLE
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_N(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN NUMERIC
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_STR(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN VARCHAR
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_CLOB(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN CLOB
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_BLOB(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN BLOB
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_T(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN TIME
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_TZ(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN TIME WITH TIME ZONE
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_D(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN DATE
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_DT(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN DATETIME
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_DTZ(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN DATETIME WITH TIME ZONE
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_IY(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL YEAR
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_IY2M(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL YEAR TO MONTH
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_IM(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL MONTH
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_ID(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL DAY
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_ID2H(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL DAY TO HOUR
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_IH(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL HOUR
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_ID2M(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL DAY TO MINUTE
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_IH2M(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL HOUR TO MINUTE
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_IMI(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL MINUTE
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_ID2S(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL DAY TO SECOND
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_IH2S(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL HOUR TO SECOND
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_IM2S(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL MINUTE TO SECOND
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_IS(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN INTERVAL SECOND
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_GUID(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN GUID
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_BINARY(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN BINARY
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	FUNCTION 	BLDIN_COLUMN_VALUE_ROWID(ObjName VARCHAR,ColNo INTEGER,var_tid INTEGER,var_scale INTEGER) RETURN ROWID
+		IS	LANGUAGE  "C"  NAME  "BLDIN_GET";
+
+	/******************检查序号范围***********/ 
+	FUNCTION CHECK_CURNO_RANGE(CurNo INTEGER) RETURN INTEGER
+		IS
+		BEGIN
+			IF (CurNo ISNULL OR CurNo<1 OR CurNo>100) THEN
+				RAISE_APPLICATION_ERROR(-1002,'游标序号错误');	
+				RETURN -1;
+			END IF;
+		END;
+	/******************检查存在性***********/ 
+	FUNCTION CHECK_CURNO_EXIST(CurNo INTEGER) RETURN INTEGER
+		IS
+		BEGIN
+			IF cursors(CurNo).StmtState ISNULL THEN
+				RAISE_APPLICATION_ERROR(-1003,'序号为'||CurNo||'的游标不存在');	
+				RETURN -1;
+			ENDIF;
+		END;
+	/******************检查语句状态***********/ 
+	FUNCTION CHECK_CURNO_STATE(CurNo INTEGER,STATE INTEGER) RETURN INTEGER
+		IS
+		BEGIN
+			IF STATE = STMT_STATE_PARSED AND cursors(CurNo).StmtState < STMT_STATE_PARSED THEN
+				RAISE_APPLICATION_ERROR(-1005,'序号为'||CurNo||'的游标未经过parse阶段');	
+				RETURN -1;
+			ELSIF STATE = STMT_STATE_EXCUTED AND cursors(CurNo).StmtState < STMT_STATE_EXCUTED THEN
+				RAISE_APPLICATION_ERROR(-1005,'序号为'||CurNo||'的游标未经过execute阶段');	
+				RETURN -1;
+			ELSIF STATE = STMT_STATE_FETCHED AND cursors(CurNo).StmtState < STMT_STATE_FETCHED THEN
+				RAISE_APPLICATION_ERROR(-1005,'序号为'||CurNo||'的游标未经过fetch阶段');	
+				RETURN -1;
+			ENDIF;
+		END;
+	/******************检查序号**************/ 
+	FUNCTION CHECK_CURNO(CurNo INTEGER,STATE INTEGER) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号范围
+			CHECK_CURNO_RANGE(CurNo);
+			--检查存在性
+			CHECK_CURNO_EXIST(CurNo);
+			--检查语句状态
+			CHECK_CURNO_STATE(CurNo,STATE);
+		END;
+	/******************检查序号范围和存在性**************/ 
+	FUNCTION CHECK_CURNO_RANGE_AND_EXIST(CurNo INTEGER) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号范围
+			CHECK_CURNO_RANGE(CurNo);
+			--检查存在性
+			CHECK_CURNO_EXIST(CurNo);
+		END;
+
+	/******************检查参数是否已绑定**************/ 
+	FUNCTION CHECK_PARA_BIND_STATE(Paras TParams) RETURN INTEGER
+		IS
+			para		TParaInfo;
+		BEGIN
+			--遍历参数表检查所有参数是否都已绑定
+			IF(Paras NOTNULL AND Paras.count>0) THEN
+				FOR i IN 1 .. Paras.COUNT LOOP
+					para:=Paras(i);
+					if(para ISNULL OR  para.BindState=0) THEN
+						RAISE_APPLICATION_ERROR(-1006, '参数'||para.ParaName||'未绑定');
+					ENDIF;
+				END FOR;
+			ENDIF;
+		END;
+
+	/******************设置绑定参数的绑定状态,更新绑定参数的类型**************/ 
+	FUNCTION SET_BIND_PARA_INFO(Paras IN OUT TParams,ParaName VARCHAR,ParaTid INTEGER) RETURN INTEGER
+		IS
+			para_no		INTEGER;
+		BEGIN
+			--按名给参数表中对应的参数标记绑定位,并更新绑定的参数类型。
+			IF(Paras NOTNULL AND Paras.count>0) THEN
+				para_no:=0;
+				FOR i IN 1 .. Paras.COUNT LOOP
+					if(Paras(i) NOTNULL AND (BLDIN_PARA_NAME_CMP(Paras(i).ParaName,ParaName) OR BLDIN_PARA_NAME_CMP(Paras(i).ParaName,(':'||ParaName)))) THEN
+						Paras(i).BindState:=1;
+						Paras(i).ParaTid:=ParaTid;
+						para_no:=i;
+						EXIT;
+					ENDIF;
+				END FOR;
+				IF(para_no=0) THEN
+					RAISE_APPLICATION_ERROR(-1007,'绑定参数对象'||ParaName||'不存在');
+				ENDIF;
+			ENDIF;
+		END;
+
+
+	/******************生成编号为CurNo的Cursor的文本信息,用于支持调试***********/ 		
+	FUNCTION STROF_CURSOR(CurNo INTEGER) RETURN VARCHAR(5000)
+		IS
+			cur 		TCursor;
+			str 		VARCHAR(5000);
+			para		TParaInfo;
+			targ		TResInfo;
+		BEGIN
+			--检查序号范围
+			CHECK_CURNO_RANGE(CurNo);
+			--检查存在性
+			CHECK_CURNO_EXIST(CurNo);
+			cur:=cursors(CurNo);
+			--输出状态,内部对象地址,SQL语句等
+			str:='Cursor{' || NEWLINE || '       state=' || cur.StmtState || '  ' || 'ObjPtr=' || cur.ObjPtr 
+				|| NEWLINE || '       SQL=' || cur.StmtSQL || NEWLINE;	
+			--输出参数信息
+			IF(cur.ParaInfos NOTNULL AND cur.ParaInfos.count>0) THEN
+				str:=str || '       Paras[' || NEWLINE;
+				FOR i IN 1 .. cur.ParaInfos.COUNT LOOP
+					para:=cur.ParaInfos(i);
+					str:=str || '             (' || para.ParaName || ' ' || para.ParaNo || ' ' || para.ParaTid 
+						 || ' ' || para.ParaScale || ')' || NEWLINE;
+				END FOR;
+				str:=str || '            ]' || NEWLINE;	 
+			ENDIF;
+			--输出结果集字段信息		
+			IF(cur.ResInfos NOTNULL AND cur.ResInfos.count>0) THEN
+				str:=str || '       Targets[' || NEWLINE;
+				FOR i IN 1 .. cur.ResInfos.COUNT LOOP
+					targ:=cur.ResInfos(i);
+					str:=str || '              (' || targ.ResName || ' ' || targ.ResTid || ' ' || targ.ResScale 
+						 || ' ' || targ.ResFlag || ')'||NEWLINE;
+				END FOR;
+				str:=str || '              ]' || NEWLINE;	 
+			ENDIF;
+			--返回结果	
+			RETURN str;				 	
+		END;
+	
+	/*****************打开一个游标(分配一个游标对象,返回游标编号)**************/
+	FUNCTION  OPEN_CURSOR() RETURN INTEGER
+		 IS
+		 i	INTEGER;
+		 BEGIN
+		 	/*从数组中找出空值项,并在此生成cursor对象*/
+		 	FOR i IN 1...100 LOOP
+		 		IF (Cursors(i).StmtState ISNULL) THEN
+		 			Cursors(i).StmtState := STMT_STATE_OPENED;
+		 			RETURN i;
+		 		END IF;
+		 	END FOR;
+		 	RAISE_APPLICATION_ERROR(-1001,'打开游标太多(最多100个)');	
+		 	RETURN -1;
+		 END;
+
+	/*****************关闭一个游标*****************************/
+	FUNCTION  CLOSE_CURSOR(CurNo INTEGER) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号范围
+			CHECK_CURNO_RANGE(CurNo);
+			--检查存在性
+			CHECK_CURNO_EXIST(CurNo);
+			--调用内部函数关闭内核对象
+			IF (cursors(CurNo).ObjPtr NOTNULL) THEN
+				BLDIN_CLOSE_CURSOR(cursors(CurNo).ObjPtr);
+			ENDIF;
+			cursors(CurNo).StmtState := NULL;
+			cursors(CurNo).StmtSQL   := NULL;
+	   		cursors(CurNo).ObjPtr    := NULL;
+	   		cursors(CurNo).ParaInfos := NULL;
+	   		cursors(CurNo).ResInfos  := NULL;
+			RETURN 1;
+		END;	
+	
+	/*****************检查一个游标是否处于开启状态***************************/
+	FUNCTION  IS_OPEN(CurNo IN INTEGER) RETURN BOOLEAN
+		IS
+		BEGIN
+			--检查序号范围
+			CHECK_CURNO_RANGE(CurNo);
+			--检查存在性	 
+			IF (cursors(CurNo).StmtState IS NULL) THEN
+				RETURN FALSE;
+			ELSE
+				RETURN TRUE;
+			END IF;
+		END;	
+		
+	/********************为Cursor设置一个SQL语句,并分析此语句*****************/		
+	FUNCTION  PARSE(CurNo INTEGER,SqlStr VARCHAR,SqlType INTEGER) RETURN INTEGER
+		IS
+			cur	TCursor;
+		BEGIN
+			--检查序号范围
+			CHECK_CURNO_RANGE(CurNo);
+			--检查存在性
+			CHECK_CURNO_EXIST(CurNo);
+			--设置SQL语句
+			cursors(CurNo).StmtSQL:=SqlStr;
+			--调用内核执行语句分析与规划
+			cursors(CurNo).StmtType := BLDIN_PARSE(SqlStr,cursors(CurNo).ObjPtr,cursors(CurNo).ParaInfos,cursors(CurNo).ResInfos);
+			--修改cursor状态
+			IF(cursors(CurNo).StmtType>0) THEN
+				cursors(CurNo).StmtState := STMT_STATE_PARSED;	--表示已分析,但未绑定变量
+			ELSE
+				RAISE_APPLICATION_ERROR(-1004,'未知的SQL语句');
+			END IF;
+			--返回语句类型
+			RETURN cursors(CurNo).StmtType;		
+		END;
+	
+	/**************执行游标语句*************/	
+	FUNCTION  EXECUTE(CurNo INTEGER) RETURN INTEGER
+		IS
+			cur_name VARCHAR;
+			ret      INTEGER;
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			CHECK_PARA_BIND_STATE(cursors(CurNo).ParaInfos);
+			ret := BLDIN_EXECUTE(cursors(CurNo).ObjPtr);
+			cursors(CurNo).StmtState := STMT_STATE_EXCUTED;
+			RETURN ret;
+		END;
+			
+	/****************向前抓取一行*************/		
+	FUNCTION 	FETCH_ROWS(CurNo INTEGER) RETURN INTEGER
+		IS
+			ret      INTEGER;
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_EXCUTED);
+			ret := BLDIN_FETCH_ROWS(cursors(CurNo).ObjPtr);
+			cursors(CurNo).StmtState := STMT_STATE_FETCHED;
+			RETURN ret;
+		END;
+	
+	/*********************绑定BOOLEAN型参数**********************/	
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val BOOLEAN) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_BOOL);
+			RETURN BLDIN_NAME_BIND_BOOL(cursors(CurNo).ObjPtr,col_name,TYPE_BOOL,Val);	
+		END;
+
+	/*********************绑定Tinyint型参数**********************/	
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val TINYINT) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_I1);
+			RETURN BLDIN_NAME_BIND_I1(cursors(CurNo).ObjPtr,col_name,TYPE_I1,Val);	
+		END;
+	
+	/*********************绑定SmallInt型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val SMALLINT) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_I2);
+			RETURN BLDIN_NAME_BIND_I2(cursors(CurNo).ObjPtr,col_name,TYPE_I2,Val);	
+		END;
+			
+	/*********************绑定Integer型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTEGER) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_I4);
+			RETURN BLDIN_NAME_BIND_I4(cursors(CurNo).ObjPtr,col_name,TYPE_I4,Val);
+		END;
+	
+	/*********************绑定BigInt型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val BIGINT) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_I8);
+			RETURN BLDIN_NAME_BIND_I8(cursors(CurNo).ObjPtr,col_name,TYPE_I8,Val);
+		END;
+
+	/*********************绑定Float型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val Float) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_R4);
+			RETURN BLDIN_NAME_BIND_R4(cursors(CurNo).ObjPtr,col_name,TYPE_R4,Val);
+		END;
+
+	/*********************绑定Double型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val DOUBLE) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_R8);
+			RETURN BLDIN_NAME_BIND_R8(cursors(CurNo).ObjPtr,col_name,TYPE_R8,Val);		
+		END;
+
+	/*********************绑定Numeric型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val NUMERIC) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_NUMERIC);
+			RETURN BLDIN_NAME_BIND_N(cursors(CurNo).ObjPtr,col_name,TYPE_NUMERIC,Val);	
+		END;
+
+	/*********************绑定CLOB型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val CLOB) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_CLOB);
+			RETURN BLDIN_NAME_BIND_CLOB(cursors(CurNo).ObjPtr,col_name,TYPE_CLOB,Val);		
+		END;
+
+	/*********************绑定BLOB型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val BLOB) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_BLOB);
+			RETURN BLDIN_NAME_BIND_BLOB(cursors(CurNo).ObjPtr,col_name,TYPE_BLOB,Val);
+		END;
+		
+	/*********************绑定VARCHAR型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val VARCHAR) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_VARCHAR);
+			RETURN BLDIN_NAME_BIND_STR(cursors(CurNo).ObjPtr,col_name,TYPE_VARCHAR,Val);
+		END;
+
+	/*********************绑定Time型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val TIME) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_TIME);
+			RETURN BLDIN_NAME_BIND_T(cursors(CurNo).ObjPtr,col_name,TYPE_TIME,Val);		
+		END;
+
+	/*********************绑定 TIME WITH TIME ZONE 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val TIME WITH TIME ZONE) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_TIMEZ);
+			RETURN BLDIN_NAME_BIND_TZ(cursors(CurNo).ObjPtr,col_name,TYPE_TIMEZ,Val);		
+		END;
+
+	/*********************绑定Date型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val DATE) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_DATE);
+			RETURN BLDIN_NAME_BIND_D(cursors(CurNo).ObjPtr,col_name,TYPE_DATE,Val);	
+		END;
+
+	/*********************绑定DateTime型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val DATETIME) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_DATETIME);
+			RETURN BLDIN_NAME_BIND_DT(cursors(CurNo).ObjPtr,col_name,TYPE_DATETIME,Val);	
+		END;
+
+	/*********************绑定DATETIME WITH TIME ZONE型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val DATETIME WITH TIME ZONE) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_DATETIMEZ);
+			RETURN BLDIN_NAME_BIND_DTZ(cursors(CurNo).ObjPtr,col_name,TYPE_DATETIMEZ,Val);	
+		END;
+
+	/*********************绑定 INTERVAL YEAR 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL YEAR) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_Y);
+			RETURN BLDIN_NAME_BIND_IY(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_Y,Val);	
+		END;
+	
+	/*********************绑定 INTERVAL YEAR TO MONTH 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL YEAR TO MONTH) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_Y2M);
+			RETURN BLDIN_NAME_BIND_IY2M(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_Y2M,Val);	
+		END;
+
+	/*********************绑定 INTERVAL MONTH 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL MONTH) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_M);
+			RETURN BLDIN_NAME_BIND_IM(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_M,Val);	
+		END;
+
+	/*********************绑定 INTERVAL DAY 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL DAY) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_D);
+			RETURN BLDIN_NAME_BIND_ID(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_D,Val);	
+		END;
+
+	/*********************绑定 INTERVAL DAY TO HOUR 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL DAY TO HOUR) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_D2H);
+			RETURN BLDIN_NAME_BIND_ID2H(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_D2H,Val);	
+		END;
+
+	/*********************绑定 INTERVAL HOUR 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL HOUR) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_H);
+			RETURN BLDIN_NAME_BIND_IH(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_H,Val);	
+		END;
+	
+	/*********************绑定 INTERVAL DAY TO MINUTE 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL DAY TO MINUTE) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_D2M);
+			RETURN BLDIN_NAME_BIND_ID2M(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_D2M,Val);	
+		END;
+	
+	/*********************绑定 INTERVAL HOUR TO MINUTE 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL HOUR TO MINUTE) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_H2M);
+			RETURN BLDIN_NAME_BIND_IH2M(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_H2M,Val);	
+		END;
+		
+	/*********************绑定 INTERVAL MINUTE 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL MINUTE) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_MI);
+			RETURN BLDIN_NAME_BIND_IMI(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_MI,Val);	
+		END;
+	
+	/*********************绑定 INTERVAL DAY TO SECOND 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL DAY TO SECOND) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_D2S);
+			RETURN BLDIN_NAME_BIND_ID2S(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_D2S,Val);	
+		END;
+	
+	/*********************绑定 INTERVAL HOUR TO SECOND 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL HOUR TO SECOND) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_H2S);
+			RETURN BLDIN_NAME_BIND_IH2S(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_H2S,Val);	
+		END;
+		
+	/*********************绑定 INTERVAL MINUTE TO SECOND 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL MINUTE TO SECOND) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_M2S);
+			RETURN BLDIN_NAME_BIND_IM2S(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_M2S,Val);	
+		END;
+	
+	/*********************绑定 INTERVAL SECOND 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val INTERVAL SECOND) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_INTERVAL_S);
+			RETURN BLDIN_NAME_BIND_IS(cursors(CurNo).ObjPtr,col_name,TYPE_INTERVAL_S,Val);	
+		END;
+	
+	/*********************绑定 GUID 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val GUID) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_GUID);
+			RETURN BLDIN_NAME_BIND_GUID(cursors(CurNo).ObjPtr,col_name,TYPE_GUID,Val);	
+		END;
+	
+	/*********************绑定 BINARY 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val BINARY) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_BINARY);
+			RETURN BLDIN_NAME_BIND_BINARY(cursors(CurNo).ObjPtr,col_name,TYPE_BINARY,Val);	
+		END;
+	
+	/*********************绑定 ROWID 型参数**********************/			
+	FUNCTION  BIND_VARIABLE(CurNo INTEGER,ColName VARCHAR,Val ROWID) RETURN INTEGER
+		IS
+			col_name VARCHAR:=UPPER(ColName);
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_PARSED);
+			SET_BIND_PARA_INFO(cursors(CurNo).ParaInfos,col_name,TYPE_ROWID);
+			RETURN BLDIN_NAME_BIND_ROWID(cursors(CurNo).ObjPtr,col_name,TYPE_ROWID,Val);	
+		END;
+	
+	/***********定义输出类型Boolean***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT BOOLEAN) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_BOOL,-1);
+		END;
+	
+	/***********定义输出类型TinyInt***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT TINYINT) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_I1,-1);
+		END;
+	
+	/***********定义输出类型SmallInt***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT SMALLINT) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_I2,-1);
+		END;
+
+	/***********定义输出类型Integer***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTEGER) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_I4,-1);
+		END;
+
+	/***********定义输出类型Bigint***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT BIGINT) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_I8,-1);
+		END;
+
+	/***********定义输出类型Float***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT FLOAT) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_R4,-1);
+		END;
+
+	/***********定义输出类型Double***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT DOUBLE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_R8,-1);
+		END;
+
+	/***********定义输出类型NUMERIC***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT NUMERIC) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_NUMERIC,-1);
+		END;
+
+	/***********定义输出类型Char***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT CHAR) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_STR,-1);
+		END;
+
+	/***********定义输出类型Varchar***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT VARCHAR) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_STR,-1);
+		END;
+
+	/***********定义输出类型CLOB***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT CLOB) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_CLOB,-1);
+		END;
+
+	/***********定义输出类型BLOB***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT BLOB) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_BLOB,-1);
+		END;
+
+	/***********定义输出类型TIME***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT TIME) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_TIME,-1);
+		END;
+
+	/***********定义输出类型TIME WITH TIME ZONE ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT TIME WITH TIME ZONE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_TIMEZ,-1);
+		END;
+
+	/***********定义输出类型Date***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT DATE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_DATE,-1);
+		END;
+
+	/***********定义输出类型Datetime***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT DATETIME) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_DATETIME,-1);
+		END;
+
+	/***********定义输出类型DATETIME WITH TIME ZONE***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT DATETIME WITH TIME ZONE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_DATETIMEZ,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL YEAR ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL YEAR) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_Y,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL YEAR TO MONTH ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL YEAR TO MONTH) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_Y2M,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL MONTH ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MONTH) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_M,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL DAY ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_D,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL DAY TO HOUR ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO HOUR) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_D2H,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL HOUR ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_H,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL DAY TO MINUTE ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO MINUTE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_D2M,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL HOUR TO MINUTE ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR TO MINUTE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_H2M,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL MINUTE ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MINUTE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_MI,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL DAY TO SECOND ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO SECOND) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_D2S,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL HOUR TO SECOND ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR TO SECOND) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_H2S,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL MINUTE TO SECOND ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MINUTE TO SECOND) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_M2S,-1);
+		END;
+	
+	/***********定义输出类型 INTERVAL SECOND ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL SECOND) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_S,-1);
+		END;
+	
+	/***********定义输出类型 GUID ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT GUID) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_GUID,-1);
+		END;
+	
+	/***********定义输出类型 BINARY ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT BINARY) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_BINARY,-1);
+		END;
+	
+	/***********定义输出类型 ROWID ***********/
+	FUNCTION  DEFINE_COLUMN(CurNo INTEGER,ColNo INTEGER,Var  OUT ROWID) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			RETURN BLDIN_DEFINE_COLUMN(cursors(CurNo).ObjPtr,ColNo,TYPE_ROWID,-1);
+		END;
+	
+	/***********取BOOLEAN字段值***************/	
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT BOOLEAN) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_BOOL(cursors(CurNo).ObjPtr,ColNo,TYPE_BOOL,-1);
+			RETURN 1;
+		END;
+
+	/***********取TinyInt字段值***************/	
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT TINYINT) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_I1(cursors(CurNo).ObjPtr,ColNo,TYPE_I1,-1);
+			RETURN 1;
+		END;
+
+	/***********取SmallInt字段值***************/	
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT SMALLINT) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_I2(cursors(CurNo).ObjPtr,ColNo,TYPE_I2,-1);
+			RETURN 1;
+		END;
+	
+	/***********取Integer字段值***************/	
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTEGER) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_I4(cursors(CurNo).ObjPtr,ColNo,TYPE_I4,-1);
+			RETURN 1;
+		END;
+	
+	/***********取BigInt字段值***************/	
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT BIGINT) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_I8(cursors(CurNo).ObjPtr,ColNo,TYPE_I8,-1);
+			RETURN 1;
+		END;
+
+	/***********取Float字段值***************/	
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT FLOAT) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_R4(cursors(CurNo).ObjPtr,ColNo,TYPE_R4,-1);
+			RETURN 1;
+		END;
+
+	/***********取DOUBLE字段值***************/	
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT DOUBLE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_R8(cursors(CurNo).ObjPtr,ColNo,TYPE_R8,-1);
+			RETURN 1;
+		END;
+
+	/***********取Numeric字段值***************/	
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT NUMERIC) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_N(cursors(CurNo).ObjPtr,ColNo,TYPE_NUMERIC,-1);
+			RETURN 1;
+		END;
+
+	/***********取Char字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT CHAR) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_STR(cursors(CurNo).ObjPtr,ColNo,TYPE_STR,-1);
+			RETURN 1;
+		END;
+
+	/***********取Varchar字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT VARCHAR) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_STR(cursors(CurNo).ObjPtr,ColNo,TYPE_STR,-1);
+			RETURN 1;
+		END;
+
+	/***********取CLOB字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT CLOB) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_CLOB(cursors(CurNo).ObjPtr,ColNo,TYPE_CLOB,-1);
+			RETURN 1;
+		END;
+
+	/***********取BLOB字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT BLOB) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_BLOB(cursors(CurNo).ObjPtr,ColNo,TYPE_BLOB,-1);
+			RETURN 1;
+		END;
+	/***********取TIME字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT TIME) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_T(cursors(CurNo).ObjPtr,ColNo,TYPE_TIME,-1);
+			RETURN 1;
+		END;
+
+	/***********取TIME WITH TIME ZONE字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT TIME WITH TIME ZONE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_TZ(cursors(CurNo).ObjPtr,ColNo,TYPE_TIMEZ,-1);
+			RETURN 1;
+		END;
+
+	/***********取DATE字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT DATE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_D(cursors(CurNo).ObjPtr,ColNo,TYPE_DATE,-1);
+			RETURN 1;
+		END;
+
+	/***********取DateTime字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT DATETIME) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_DT(cursors(CurNo).ObjPtr,ColNo,TYPE_DATETIME,-1);
+			RETURN 1;
+		END;
+
+	/***********取DATETIME WITH TIME ZONE字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT DATETIME WITH TIME ZONE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_DTZ(cursors(CurNo).ObjPtr,ColNo,TYPE_DATETIMEZ,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL YEAR 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL YEAR) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_IY(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_Y,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL YEAR TO MONTH 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL YEAR TO MONTH) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_IY2M(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_Y2M,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL MONTH字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MONTH) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_IM(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_M,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL DAY 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_ID(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_D,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL DAY TO HOUR 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO HOUR) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_ID2H(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_D2H,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL HOUR 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_IH(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_H,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL DAY TO MINUTE 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO MINUTE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_ID2M(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_D2M,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL HOUR TO MINUTE 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR TO MINUTE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_IH2M(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_H2M,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL MINUTE 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MINUTE) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_IMI(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_MI,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL DAY TO SECOND 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL DAY TO SECOND) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_ID2S(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_D2S,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL HOUR TO SECOND字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL HOUR TO SECOND) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO(CurNo,STMT_STATE_FETCHED);
+			Var:= BLDIN_COLUMN_VALUE_IH2S(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_H2S,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL MINUTE TO SECOND字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL MINUTE TO SECOND) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			Var:= BLDIN_COLUMN_VALUE_IM2S(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_M2S,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 INTERVAL SECOND字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT INTERVAL SECOND) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			Var:= BLDIN_COLUMN_VALUE_IS(cursors(CurNo).ObjPtr,ColNo,TYPE_INTERVAL_S,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 GUID字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT GUID) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			Var:= BLDIN_COLUMN_VALUE_GUID(cursors(CurNo).ObjPtr,ColNo,TYPE_GUID,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 BINARY 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT BINARY) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			Var:= BLDIN_COLUMN_VALUE_BINARY(cursors(CurNo).ObjPtr,ColNo,TYPE_BINARY,-1);
+			RETURN 1;
+		END;
+	
+	/***********取 ROWID 字段值***************/		
+	FUNCTION  COLUMN_VALUE(CurNo INTEGER,ColNo INTEGER,Var  OUT ROWID) RETURN INTEGER
+		IS
+		BEGIN
+			--检查序号
+			CHECK_CURNO_RANGE_AND_EXIST(CurNo);
+			Var:= BLDIN_COLUMN_VALUE_ROWID(cursors(CurNo).ObjPtr,ColNo,TYPE_ROWID,-1);
+			RETURN 1;
+		END;
+	
+BEGIN
+	Cursors.extend(100);	
+END  SYSDBA.DBMS_SQL;
+/
+
+/*************创建CTX_DOC包******************************/
+CREATE OR REPLACE PACKAGE  "SYSDBA"."CTX_DOC"
+AUTHID CURRENT_USER
+COMMENT '全文检索支持包'  
+IS
+	SUBTYPE TOKEN_REC  IS RECORD(TOKEN VARCHAR(64),OFFSET INTEGER,LENGTH INTEGER);
+	SUBTYPE TOKEN_REC2 IS RECORD(TOKEN VARCHAR(64),REPET_N INTEGER,LENGTH INTEGER);
+	SUBTYPE TOKEN_TAB  IS TABLE OF TOKEN_REC;
+	SUBTYPE TOKEN_TAB2 IS TABLE OF TOKEN_REC2;
+	
+	SP_MAX_LEN		CONSTANT INTEGER := 0;	--按最长词划分
+	SP_MIN_LEN		CONSTANT INTEGER := 1;	--按最短词划分
+	SP_SUB_WORD1	CONSTANT INTEGER := 2;	--结果包括大词的所有子词
+	SP_SUB_WORD2	CONSTANT INTEGER := 4;	--结果包括大词有非头部子词
+	SP_ASCII	    CONSTANT INTEGER := 8;	--结果包括ascii串
+	SP_DIGIT	    CONSTANT INTEGER := 16; --结果包括数字串
+	
+	SPILIT_POLICY INTEGER:= 0;	--MAX_LEN
+	VOCA_NAME VARCHAR(20):='STD_VOC';
+	KEY_TYPE  VARCHAR(10):='PRIMARY';
+	
+	PROCEDURE SET_KEY_TYPE(key_type  IN VARCHAR2);  --设置键类型
+	PROCEDURE SET_SPLIT_POLICY(_policy  IN INTEGER);--设置分词策略
+	PROCEDURE TOKENS(index_name      IN VARCHAR2,		
+                   textkey         IN VARCHAR2,
+                   restab          IN OUT TOKEN_TAB);
+  PROCEDURE TOKENS(index_name      IN VARCHAR2,
+                   textkey         IN VARCHAR2,
+                   restab          IN VARCHAR2,
+                   query_id        IN NUMBER DEFAULT 0);
+  PROCEDURE TOKENS(content         IN VARCHAR2,
+                   restab          IN OUT TOKEN_TAB);
+  PROCEDURE TOKENS(content         IN CLOB,
+                   restab          IN OUT TOKEN_TAB);
+               
+	PROCEDURE TOKENS2(index_name     IN VARCHAR2,
+                    textkey        IN VARCHAR2,
+                    restab         IN OUT TOKEN_TAB);
+  PROCEDURE TOKENS2(index_name     IN VARCHAR2,
+                    textkey        IN VARCHAR2,
+                    restab         IN VARCHAR2,
+                    query_id       IN NUMBER DEFAULT 0);
+  PROCEDURE TOKENS2(content        IN VARCHAR2,
+                    restab         IN OUT TOKEN_TAB);
+  PROCEDURE TOKENS2(content        IN CLOB,
+                    restab         IN OUT TOKEN_TAB);
+END  "SYSDBA"."CTX_DOC";
+/
+
+/*************创建CTX_DOC包体******************************/
+CREATE OR REPLACE PACKAGE BODY "SYSDBA"."CTX_DOC"
+IS
+	
+	PROCEDURE SET_KEY_TYPE(_key_type  IN VARCHAR2)
+	IS
+	BEGIN
+		key_type:=_key_type;
+	END;
+	
+	
+	PROCEDURE SET_SPLIT_POLICY(_policy  IN INTEGER)
+	IS
+	BEGIN
+		SPILIT_POLICY:=_policy;
+	END;
+	
+	PROCEDURE BLDIN_TOKENS(
+	                 voca_name       IN VARCHAR2,    
+	                 content         IN VARCHAR,
+                   restab          IN OUT TOKEN_TAB,
+                   sp_policy	     IN INTEGER)
+  IS  LANGUAGE "C" NAME  "BLDIN_TOKENS1";
+
+	PROCEDURE BLDIN_TOKENS2(
+	                 voca_name       IN VARCHAR2,    
+	                 content         IN VARCHAR,
+                   restab          IN OUT TOKEN_TAB,
+                   sp_policy	     IN INTEGER)
+  IS  LANGUAGE "C" NAME  "BLDIN_TOKENS2";
+  
+  PROCEDURE TOKENS(index_name      IN VARCHAR2,
+                   textkey         IN VARCHAR2,
+                   restab          IN OUT TOKEN_TAB)
+  IS
+  BEGIN
+  	NULL;
+  END;
+    
+  PROCEDURE TOKENS(index_name      IN VARCHAR2,
+                   textkey         IN VARCHAR2,
+                   restab          IN VARCHAR2,
+                   query_id        IN NUMBER DEFAULT 0)
+  IS
+  BEGIN
+  	NULL;
+  END;
+  
+  PROCEDURE TOKENS(content         IN VARCHAR2,
+                   restab          IN OUT TOKEN_TAB)
+  IS
+  BEGIN
+   	BLDIN_TOKENS(voca_name,content,restab,SPILIT_POLICY);
+  END;
+  
+  PROCEDURE TOKENS(content         IN CLOB,
+                   restab          IN OUT TOKEN_TAB)
+  IS
+  BEGIN
+   	BLDIN_TOKENS(voca_name,content,restab,SPILIT_POLICY);
+  END;
+               
+	PROCEDURE TOKENS2(index_name     IN VARCHAR2,
+                    textkey        IN VARCHAR2,
+                    restab         IN OUT TOKEN_TAB)
+  IS
+  BEGIN
+   	NULL;
+  END;
+  
+  PROCEDURE TOKENS2(index_name     IN VARCHAR2,
+                    textkey        IN VARCHAR2,
+                    restab         IN VARCHAR2,
+                    query_id       IN NUMBER DEFAULT 0)
+  IS
+  BEGIN
+   	NULL;
+  END;
+             
+  PROCEDURE TOKENS2(content        IN VARCHAR2,
+                   restab          IN OUT TOKEN_TAB)
+  IS
+  BEGIN
+  	BLDIN_TOKENS2(voca_name,content,restab,SPILIT_POLICY);
+  END;                 
+                             
+  PROCEDURE TOKENS2(content        IN CLOB,
+                    restab         IN OUT TOKEN_TAB)
+  IS
+  BEGIN
+  	BLDIN_TOKENS2(voca_name,content,restab,SPILIT_POLICY);
+  END;
+  
+END  "SYSDBA"."CTX_DOC";
+/
+
+/***********创建DBMS_LOB包(用于支持大对象操作)***************/
+----包头
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_LOB 
+IS
+	FUNCTION  GETLENGTH(lob_loc BLOB) RETURN INTEGER;
+	FUNCTION  GETLENGTH(lob_loc CLOB) RETURN INTEGER;
+	PROCEDURE READ(lob_loc BLOB,AMOUNT INTEGER,OFFSET INTEGER, OUT_BUFF OUT VARCHAR);
+	PROCEDURE READ(lob_loc CLOB,AMOUNT INTEGER,OFFSET INTEGER, OUT_BUFF OUT VARCHAR);
+END SYSDBA.DBMS_LOB;
+/
+
+----包体
+CREATE PACKAGE BODY SYSDBA.DBMS_LOB 
+IS
+	FUNCTION  GETLENGTH(lob_loc BLOB) RETURN INTEGER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_BLOB_GETLENGTH";
+	
+	FUNCTION  GETLENGTH(lob_loc CLOB) RETURN INTEGER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_CLOB_GETLENGTH";
+	
+	PROCEDURE READ(lob_loc BLOB,AMOUNT INTEGER,OFFSET INTEGER, OUT_BUFF OUT VARCHAR)
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_BLOB_READ";
+
+	PROCEDURE READ(lob_loc CLOB,AMOUNT INTEGER,OFFSET INTEGER, OUT_BUFF OUT VARCHAR)
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_CLOB_READ";
+	
+END SYSDBA.DBMS_LOB;
+/
+
+-----UTL_RAW包--------------------
+CREATE PACKAGE SYSDBA.UTL_RAW
+IS    
+       big_endian     CONSTANT PLS_INTEGER := 1;
+       little_endian  CONSTANT PLS_INTEGER := 2;
+       machine_endian CONSTANT PLS_INTEGER := 3;  
+       FUNCTION BIT_AND (r1 IN RAW, r2 IN RAW) RETURN RAW;
+       FUNCTION BIT_COMPLEMENT (r1 IN RAW, r2 IN RAW) RETURN RAW;
+       FUNCTION BIT_OR (r1 IN RAW, r2 IN RAW) RETURN RAW;
+       FUNCTION BIT_XOR (r1 IN RAW, r2 IN RAW) RETURN RAW;
+       FUNCTION CAST_FROM_BINARY_DOUBLE (n IN BINARY_DOUBLE, endianess IN BINARY_INTEGER DEFAULT 1) RETURN RAW;
+       FUNCTION CAST_FROM_BINARY_FLOAT (n IN BINARY_FLOAT, endianess IN BINARY_INTEGER DEFAULT 1) RETURN RAW;
+       FUNCTION CAST_FROM_BINARY_INTEGER (n IN BINARY_INTEGER, endianess IN BINARY_INTEGER DEFAULT 1) RETURN RAW;
+       FUNCTION CAST_FROM_NUMBER (n  IN NUMBER) RETURN RAW;
+       FUNCTION CAST_TO_BINARY_DOUBLE (r IN RAW,endianess IN BINARY_INTEGER DEFAULT 1) RETURN BINARY_DOUBLE;
+       FUNCTION CAST_TO_BINARY_FLOAT (r IN RAW, endianess IN BINARY_INTEGER DEFAULT 1) RETURN BINARY_FLOAT;
+       FUNCTION CAST_TO_BINARY_INTEGER (r IN RAW, endianess IN BINARY_INTEGER DEFAULT 1) RETURN BINARY_INTEGER;
+       FUNCTION CAST_TO_NUMBER (r IN RAW) RETURN NUMBER;
+       FUNCTION CAST_TO_NVARCHAR2 (r IN RAW) RETURN NVARCHAR2;
+       FUNCTION CAST_TO_RAW (c IN VARCHAR2) RETURN RAW;
+       FUNCTION CAST_TO_VARCHAR2 (r IN RAW) RETURN VARCHAR2;
+       FUNCTION COMPARE (r1 IN RAW,r2 IN RAW,pad IN RAW DEFAULT NULL) RETURN INTEGER;
+       FUNCTION CONCAT (r1  IN RAW DEFAULT NULL,
+			  r2  IN RAW DEFAULT NULL,
+   			r3  IN RAW DEFAULT NULL,
+   			r4  IN RAW DEFAULT NULL,
+   			r5  IN RAW DEFAULT NULL,
+   			r6  IN RAW DEFAULT NULL,
+   			r7  IN RAW DEFAULT NULL,
+   			r8  IN RAW DEFAULT NULL,
+   			r9  IN RAW DEFAULT NULL,
+   			r10 IN RAW DEFAULT NULL,
+   			r11 IN RAW DEFAULT NULL,
+   			r12 IN RAW DEFAULT NULL) 
+  			RETURN RAW;
+       FUNCTION CONVERT(r IN RAW,to_charset IN VARCHAR2,from_charset IN VARCHAR2) RETURN RAW;
+       FUNCTION COPIES (r IN RAW,n IN INTEGER) RETURN RAW;
+       FUNCTION LENGTH (r IN RAW) RETURN INTEGER;
+       FUNCTION OVERLAY(overlay_str IN RAW,target IN RAW,
+			pos IN BINARY_INTEGER DEFAULT 1,
+			len IN BINARY_INTEGER DEFAULT NULL,
+   			pad IN RAW DEFAULT NULL) 
+  			RETURN RAW;
+       FUNCTION REVERSE (r IN RAW) RETURN RAW;
+       FUNCTION SUBSTR (r IN RAW,pos IN BINARY_INTEGER,len IN BINARY_INTEGER DEFAULT NULL) RETURN RAW;
+       FUNCTION TRANSLATE (r IN RAW,from_set IN RAW,to_set IN RAW) RETURN RAW;
+       FUNCTION TRANSLITERATE (r IN RAW,to_set IN RAW DEFAULT NULL,from_set IN RAW DEFAULT NULL,pad IN RAW DEFAULT NULL) RETURN RAW;
+       FUNCTION XRANGE (start_byte IN RAW DEFAULT NULL,end_byte IN RAW DEFAULT NULL) RETURN RAW;
+END SYSDBA.UTL_RAW;
+/
+
+CREATE PACKAGE BODY SYSDBA.UTL_RAW
+IS    
+       FUNCTION BIT_AND (r1 IN RAW, r2 IN RAW) RETURN RAW 
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_BIT_AND";
+
+       FUNCTION BIT_COMPLEMENT (r1 IN RAW, r2 IN RAW) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_COMPLEMENT";
+
+       FUNCTION BIT_OR (r1 IN RAW, r2 IN RAW) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_BIT_OR";
+
+       FUNCTION BIT_XOR (r1 IN RAW, r2 IN RAW) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_BIT_XOR";
+
+       FUNCTION CAST_FROM_BINARY_DOUBLE (n IN BINARY_DOUBLE, endianess IN BINARY_INTEGER DEFAULT 1) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_DOUBLE2RAW";
+
+       FUNCTION CAST_FROM_BINARY_FLOAT (n IN BINARY_FLOAT, endianess IN BINARY_INTEGER DEFAULT 1) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_FLOAT2RAW";
+
+       FUNCTION CAST_FROM_BINARY_INTEGER (n IN BINARY_INTEGER, endianess IN BINARY_INTEGER DEFAULT 1) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_INTEGER2RAW";
+
+       FUNCTION CAST_FROM_NUMBER (n  IN NUMBER) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_NUMERIC2RAW";
+
+       FUNCTION CAST_TO_BINARY_DOUBLE (r IN RAW,endianess IN BINARY_INTEGER DEFAULT 1) RETURN BINARY_DOUBLE
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW2DOUBLE";
+
+       FUNCTION CAST_TO_BINARY_FLOAT (r IN RAW, endianess IN BINARY_INTEGER DEFAULT 1) RETURN BINARY_FLOAT
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW2FLOAT";
+
+       FUNCTION CAST_TO_BINARY_INTEGER (r IN RAW, endianess IN BINARY_INTEGER DEFAULT 1) RETURN BINARY_INTEGER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW2INTEGER";
+
+       FUNCTION CAST_TO_NUMBER (r IN RAW) RETURN NUMBER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW2NUMERIC";
+
+       FUNCTION CAST_TO_NVARCHAR2 (r IN RAW) RETURN NVARCHAR2
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW2NVARCHAR2";
+
+       FUNCTION CAST_TO_RAW (c IN VARCHAR2) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	 "BLDIN_VARCHAR22RAW";
+
+       FUNCTION CAST_TO_VARCHAR2 (r IN RAW) RETURN VARCHAR2
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW2VARCHAE2";
+
+       FUNCTION COMPARE (r1 IN RAW,r2 IN RAW,pad IN RAW DEFAULT NULL) RETURN INTEGER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_COMPARE";
+
+       FUNCTION CONCAT (r1  IN RAW DEFAULT NULL,
+			  r2  IN RAW DEFAULT NULL,
+   			r3  IN RAW DEFAULT NULL,
+   			r4  IN RAW DEFAULT NULL,
+   			r5  IN RAW DEFAULT NULL,
+   			r6  IN RAW DEFAULT NULL,
+   			r7  IN RAW DEFAULT NULL,
+   			r8  IN RAW DEFAULT NULL,
+   			r9  IN RAW DEFAULT NULL,
+   			r10 IN RAW DEFAULT NULL,
+   			r11 IN RAW DEFAULT NULL,
+   			r12 IN RAW DEFAULT NULL) 
+  			RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_CONCAT";
+
+       FUNCTION CONVERT(r IN RAW,to_charset IN VARCHAR2,from_charset IN VARCHAR2) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_CONVERT";
+
+       FUNCTION COPIES (r IN RAW,n IN INTEGER) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_COPYS";
+
+       FUNCTION LENGTH (r IN RAW) RETURN INTEGER
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_LENGTH";
+
+       FUNCTION OVERLAY(overlay_str IN RAW,target IN RAW,
+			pos IN BINARY_INTEGER DEFAULT 1,
+			len IN BINARY_INTEGER DEFAULT NULL,
+   			pad IN RAW DEFAULT NULL) 
+  			RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_OVERLAY";
+
+       FUNCTION REVERSE (r IN RAW) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_REVERSE";
+
+       FUNCTION SUBSTR (r IN RAW,pos IN BINARY_INTEGER,len IN BINARY_INTEGER DEFAULT NULL) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_SUBSTR";
+
+       FUNCTION TRANSLATE (r IN RAW,from_set IN RAW,to_set IN RAW) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_TRANSLATE";
+
+       FUNCTION TRANSLITERATE (r IN RAW,to_set IN RAW DEFAULT NULL,from_set IN RAW DEFAULT NULL,pad IN RAW DEFAULT NULL) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_TRANSLITERATE";
+
+       FUNCTION XRANGE (start_byte IN RAW DEFAULT NULL,end_byte IN RAW DEFAULT NULL) RETURN RAW
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_RAW_XRANGE";
+
+END SYSDBA.UTL_RAW;
+/
+
+
+
+
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_REPLICATION
+IS    
+  PROCEDURE CREATE_MODIFY_SOURCE(SCHEMA_NAME VARCHAR,TABLE_NAME VARCHAR);
+  PROCEDURE DROP_MODIFY_SOURCE(SCHEMA_NAME VARCHAR,TABLE_NAME VARCHAR);
+ 
+  PROCEDURE CREATE_SUBSCRIBER(SUBSCRIBER_NAME VARCHAR,USEER_NAME VARCHAR);
+  PROCEDURE DROP_SUBSCRIBER(SUBSCRIBER_NAME VARCHAR,USEER_NAME VARCHAR);
+  PROCEDURE SWITCH_FILE();
+  PROCEDURE POLL_MODIFY_DATA(SUBSCRIBER_NAME VARCHAR,PARTI_NO INTEGER,FILTER VARCHAR,POLL_LEN BIGINT,KEEP_POS BOOLEAN,FNO INTEGER DEFAULT -1,FPOS BIGINT DEFAULT 0,RET_TYPE INTEGER DEFAULT 0);
+  PROCEDURE DUMP_TABLE( TABLE_NAME VARCHAR,					--表名
+						FILTER VARCHAR,						--where 条件(不写where关键字)
+						PATH VARCHAR,						--导出数据 INSERT SQL 的数据库端输出文件(NULL时不输出到文件)
+						IS_SEND BOOLEAN DEFAULT false,		-- 是否将数据 INSERT SQL的结果集 返回客户端
+						IS_DUMP_META BOOLEAN DEFAULT false);-- 是否在数据前输出表定义DDL
+END SYSDBA.DBMS_REPLICATION;
+/
+
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_REPLICATION
+IS
+    
+  PROCEDURE CREATE_MODIFY_SOURCE(SCHEMA_NAME VARCHAR,TABLE_NAME VARCHAR)
+  IS 
+  LANGUAGE  "C"
+  NAME	  "BLDIN_CREATE_MODIFY_SOURCE";
+
+  PROCEDURE DROP_MODIFY_SOURCE(SCHEMA_NAME VARCHAR,TABLE_NAME VARCHAR)
+  IS 
+  LANGUAGE  "C"
+  NAME	  "BLDIN_DROP_MODIFY_SOURCE";
+ 
+  PROCEDURE CREATE_SUBSCRIBER(SUBSCRIBER_NAME VARCHAR,USEER_NAME VARCHAR)
+  IS 
+  LANGUAGE  "C"
+  NAME	  "BLDIN_CREATE_SUBSCRIBER";
+
+  PROCEDURE DROP_SUBSCRIBER(SUBSCRIBER_NAME VARCHAR,USEER_NAME VARCHAR)
+  IS 
+  LANGUAGE  "C"
+  NAME	  "BLDIN_DROP_SUBSCRIBER";
+  
+  PROCEDURE SWITCH_FILE()
+  IS 
+  LANGUAGE  "C"
+  NAME	  "BLDIN_SWITCH_FILE";
+
+  PROCEDURE POLL_MODIFY_DATA(SUBSCRIBER_NAME VARCHAR,PARTI_NO INTEGER,FILTER VARCHAR,POLL_LEN BIGINT,KEEP_POS BOOLEAN,FNO INTEGER DEFAULT -1,FPOS BIGINT DEFAULT 0,RET_TYPE INTEGER DEFAULT 0)
+  IS 
+  LANGUAGE  "C"
+  NAME	  "BLDIN_POLL_MODIFY_DATA";
+  
+  PROCEDURE DUMP_TABLE(TABLE_NAME VARCHAR,FILTER VARCHAR,PATH VARCHAR,IS_SEND BOOLEAN DEFAULT false,IS_DUMP_META BOOLEAN DEFAULT false)
+	IS 
+  LANGUAGE  "C"
+  NAME	  "BLDIN_DUMP_TABLE";
+  
+END SYSDBA.DBMS_REPLICATION;
+/
+
+
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_CRYPTO IS
+    -- hash算法
+    HASH_MD4  INTEGER :=     1;
+    HASH_MD5  INTEGER :=     2;
+    HASH_SH1  INTEGER :=     3;
+
+    -- 消息认证码hash方式
+    HMAC_MD5  INTEGER :=     1;
+    HMAC_SH1  INTEGER :=     2;
+
+    -- 块加密算法
+    ENCRYPT_DES        INTEGER :=     1;  -- 0x0001
+    ENCRYPT_3DES_2KEY  INTEGER :=     2;  -- 0x0002
+    ENCRYPT_3DES       INTEGER :=     3;  -- 0x0003
+    ENCRYPT_AES        INTEGER :=     4;  -- 0x0004
+    ENCRYPT_PBE_MD5DES INTEGER :=     5;  -- 0x0005
+    ENCRYPT_AES128     INTEGER :=     6;  -- 0x0006
+    ENCRYPT_AES192     INTEGER :=     7;  -- 0x0007
+    ENCRYPT_AES256     INTEGER :=     8;  -- 0x0008
+
+    -- 块加密模式
+    CHAIN_CBC INTEGER :=   256;  -- 0x0100
+    CHAIN_CFB INTEGER :=   512;  -- 0x0200
+    CHAIN_ECB INTEGER :=   768;  -- 0x0300
+    CHAIN_OFB INTEGER :=  1024;  -- 0x0400
+
+    -- 块加密填充方式
+    PAD_PKCS5 INTEGER :=  4096;  -- 0x1000
+    PAD_NONE  INTEGER :=  8192;  -- 0x2000
+    PAD_ZERO  INTEGER := 12288;  -- 0x3000
+    PAD_SELF  INTEGER := 16384;  -- 0x4000
+
+    -- 流加密算法
+    ENCRYPT_RC4        INTEGER :=   129;  -- 0x0081
+    
+    -- 常用加密套件
+    DES_CBC_PKCS5      INTEGER := ENCRYPT_DES+ CHAIN_CBC+ PAD_PKCS5;
+    DES3_CBC_PKCS5     INTEGER := ENCRYPT_3DES+ CHAIN_CBC+ PAD_PKCS5;
+    AES_CBC_PKCS5      INTEGER := ENCRYPT_AES+ CHAIN_CBC+ PAD_PKCS5;
+		--加密接口
+    FUNCTION  Encrypt (src IN RAW,typ IN INTEGER, key IN RAW,iv IN RAW DEFAULT NULL) RETURN RAW;
+    FUNCTION  Encrypt (src IN VARCHAR,typ IN INTEGER, key IN VARCHAR,iv IN VARCHAR DEFAULT NULL) RETURN RAW;
+    
+    PROCEDURE Encrypt (dst IN OUT BLOB,src IN BLOB,typ IN INTEGER,key IN RAW,iv IN RAW DEFAULT NULL);
+    PROCEDURE Encrypt (dst IN OUT BLOB,src IN CLOB ,typ IN INTEGER,key IN RAW,iv  IN RAW DEFAULT NULL);
+		--解密接口
+    FUNCTION  Decrypt (src IN RAW,typ IN INTEGER,key IN RAW,iv  IN RAW DEFAULT NULL)RETURN RAW;
+    FUNCTION  Decrypt (src IN RAW,typ IN INTEGER,key IN VARCHAR,iv  IN VARCHAR DEFAULT NULL)RETURN VARCHAR;
+    
+    PROCEDURE Decrypt (dst IN OUT BLOB,src IN BLOB,typ IN INTEGER,key IN RAW,iv  IN RAW DEFAULT NULL);
+    PROCEDURE Decrypt (dst IN OUT CLOB,src IN BLOB,typ IN INTEGER,key IN RAW,iv  IN RAW DEFAULT NULL);
+
+		--hash 接口
+    FUNCTION Hash (src IN RAW,typ IN INTEGER)RETURN RAW ;
+    FUNCTION Hash (src IN BLOB,typ IN INTEGER)RETURN RAW ;
+    FUNCTION Hash (src IN CLOB,typ IN INTEGER)RETURN RAW ;
+
+		--消息认证码
+    FUNCTION Mac (src IN RAW,typ IN INTEGER,key IN RAW)RETURN RAW;
+    FUNCTION Mac (src IN BLOB,typ IN INTEGER,key IN RAW)RETURN RAW;
+    FUNCTION Mac (src IN CLOB,typ IN INTEGER,key IN RAW)RETURN RAW;
+
+		--随机函数
+    FUNCTION RandomBytes (number_bytes IN INTEGER) RETURN RAW;
+    FUNCTION RandomNumber RETURN NUMBER;
+    FUNCTION RandomInteger RETURN INTEGER;
+
+END SYSDBA.DBMS_CRYPTO;
+/
+
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_CRYPTO IS
+		FUNCTION  Encrypt (src IN VARCHAR,typ IN INTEGER, key IN VARCHAR,iv IN VARCHAR DEFAULT NULL) RETURN RAW
+		IS
+		LANGUAGE "C"
+		NAME			"BLDIN_ENCRYPT1";
+		
+		FUNCTION  Decrypt (src IN RAW,typ IN INTEGER,key IN VARCHAR,iv  IN VARCHAR DEFAULT NULL) RETURN VARCHAR
+		IS
+		LANGUAGE "C"
+		NAME			"BLDIN_DECRYPT1";
+
+		FUNCTION  Encrypt (src IN RAW,typ IN INTEGER, key IN RAW,iv IN RAW DEFAULT NULL) RETURN RAW
+		IS
+		LANGUAGE "C"
+		NAME			"BLDIN_ENCRYPT1";
+		
+		FUNCTION  Decrypt (src IN RAW,typ IN INTEGER,key IN RAW,iv  IN RAW DEFAULT NULL) RETURN RAW
+		IS
+		LANGUAGE "C"
+		NAME			"BLDIN_DECRYPT1";
+
+END SYSDBA.DBMS_CRYPTO;
+/
+
+CREATE OR REPLACE PACKAGE  "SYSDBA"."DBMS_BACKUP"
+COMMENT '备份应用程序包'  
+IS
+  /**
+    参数:
+    planname	备份计划名称
+    plantype 	备份类型 系统备份(BAK)or 逻辑备份(EXP)
+    path		 	备份文件输出路径,暂时只支持服务器端配置路径,后续考虑支持备到客户端
+    starttime	计划开始时间
+    period		计划执行周期,分钟为单位
+  **/
+	PROCEDURE  Create_Plan(planname VARCHAR, plantype VARCHAR, path VARCHAR, starttime DATETIME, period INTERVAL DAY TO MINUTE);
+	
+	/**
+    参数:
+    planname	备份计划名称
+    ena 			true活动态,false禁用态(系统有且仅有一个计划为活动态)
+  **/
+	PROCEDURE  Enable_Plan(planname VARCHAR, ena BOOLEAN);	
+		
+	/**
+    参数:
+    planname	备份计划名称,不可删除活动态计划,删除时同时删除计划下所有项目
+  **/
+	PROCEDURE  Drop_Plan(planname VARCHAR); 
+	
+	/**
+		系统备份(BAK)项创建接口,包含增量和全备方式
+    参数:
+    planname		备份计划名称
+    filename 		备份数据文件名
+    time_offset	相对于计划开始时间的时间偏移(分钟为单位),不能超过计划周期
+    iperiod			计划执行周期,分钟为单位,全备时此参数为NULL
+  **/
+	PROCEDURE  Add_Backup_Item(planname	VARCHAR,filename VARCHAR, time_offset INTERVAL DAY TO MINUTE);
+	PROCEDURE  Add_Backup_Inc_Item(planname	VARCHAR,time_offset INTERVAL DAY TO MINUTE,iperiod INTERVAL DAY TO MINUTE DEFAULT NULL);
+	
+	/**
+		逻辑备份(EXP)项创建接口,包含库级和表级
+    参数:
+    planname		备份计划名称
+    obj_name		库名或表名
+    obj_type		备份对象类型 取值(DATABASE,TABLE)
+    filename 		备份数据文件名(必须包含路径信息)
+    time_offset	相对于计划开始时间的时间偏移(分钟为单位),不能超过计划周期
+  **/
+	PROCEDURE  Add_Export_Item(planname VARCHAR,obj_name VARCHAR, obj_type	VARCHAR, filename VARCHAR,time_offset INTERVAL DAY TO MINUTE);
+	
+	/**
+		文件项操作添加接口
+    参数:
+    planname		备份计划名称
+    filename 		备份数据文件名(必须包含路径信息)
+    bak_count		备份文件保留份数
+    optype			备份文件处理方式DELETE或MOVE
+    dstpath			MOVE 类型是的目标路径
+  **/
+	PROCEDURE  Add_File_Item(planname VARCHAR,filename VARCHAR, bak_count INTEGER,optype VARCHAR,dstpath VARCHAR DEFAULT NULL);
+						
+	/**
+		删除系统备份计划子项
+    参数:
+    planname		备份计划名称
+    item_n 			子项编号(创建时自动生成)
+  **/
+	PROCEDURE  Drop_Item(planname VARCHAR, item_n INTEGER);
+	
+	/**
+		删除逻辑备份子项和文件操作子项
+    参数:
+    planname		备份计划名称
+    objtype 		对象类型 取值('DATABASE','TABLE','FILE')
+  **/
+	PROCEDURE  Alter_Plan_Del_Item(planname VARCHAR,objtype VARCHAR,objname VARCHAR);	
+	/**
+	设置计划当前项目
+	 参数:
+    planname		备份计划名称
+    curr_item 	当前项目编号
+	**/
+	PROCEDURE  alter_modify_curr_item(planname VARCHAR,curr_item INTEGER);
+	/**
+	设置下次运行时间
+	参数:
+    planname			备份计划名称
+    curr_item 		当前项目编号
+    next_run_time 下次运行时间
+    istart_t			增量开始时间
+	**/
+	PROCEDURE  alter_modify_run_time(planname VARCHAR,curr_item INTEGER,next_run_time DATETIME,istart_t DATETIME DEFAULT NULL);
+	
+	/**
+		备份计划执行函数
+  **/						
+	PROCEDURE  Run();
+	
+	/**
+		日志文件删除接口,暂未使用
+  **/	
+	PROCEDURE  Del_xfn();
+	PROCEDURE  FILE_OPTION(PATH VARCHAR,OBJ_NAME VARCHAR,BAK_COUNT INT,OP_TYPE VARCHAR,PLAN_NAME VARCHAR,ITEM_NO INT);
+ 
+END "SYSDBA"."DBMS_BACKUP";
+/
+
+CREATE OR Replace Package Body  "DBMS_BACKUP" IS
+  /************创建备份计划**********/
+  PROCEDURE Create_Plan(planname  VARCHAR,
+                        plantype  VARCHAR,
+                        path      VARCHAR,
+                        starttime DATETIME,
+                        period    INTERVAL DAY TO MINUTE) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_CREATE_PLAN";
+  /*************设置备份计划的活动标志************/
+  PROCEDURE Enable_Plan(planname VARCHAR, b boolean) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_MODIFY_PLAN_STATE";
+
+  /************删除备份计划*******************/
+  PROCEDURE Drop_Plan(planname VARCHAR) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_DROP_PLAN";
+
+  /************增加全备份项目*************/
+  PROCEDURE Add_Backup_Item(planname    VARCHAR,
+                            filename    VARCHAR,
+                            time_offset INTERVAL DAY TO MINUTE) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_ADD_BAK_ITEM";
+
+  /************增加增量备份项目*************/
+  PROCEDURE Add_Backup_Inc_Item(planname    VARCHAR,
+                                time_offset INTERVAL DAY TO MINUTE,
+                                iperiod     INTERVAL DAY TO MINUTE DEFAULT NULL) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_ADD_INC_ITEM";
+
+  /************增加导出项目*************/
+  PROCEDURE Add_Export_Item(planname    VARCHAR,
+                            obj_name    VARCHAR,
+                            obj_type    VARCHAR,
+                            filename    VARCHAR,
+                            time_offset INTERVAL DAY TO MINUTE) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_ADD_EXP_ITEM";
+
+  /************增加文件操作项目***************/
+  PROCEDURE Add_File_Item(planname  VARCHAR,
+                          filename  VARCHAR,
+                          bak_count INTEGER,
+                          optype    VARCHAR,
+                          dstpath   VARCHAR DEFAULT NULL) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_ADD_FILE_ITEM";
+
+  /************删除项目****************/
+  PROCEDURE Drop_Item(planname VARCHAR, item_n INTEGER) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_DROP_ITEM_BY_NO";
+
+  /****************************按名删除table,database,file子项函数************************************/
+  PROCEDURE Alter_Plan_Del_Item(planname VARCHAR,
+                                objtype  VARCHAR,
+                                objname  VARCHAR) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_DROP_ITEM_BY_OBJNAME";
+  /****************************设置计划当前项目************************************/
+  PROCEDURE alter_modify_curr_item(planname VARCHAR, curr_item INTEGER) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_MODIFY_PLAN_CURR_ITEM";
+  /****************************设置下次运行时间************************************/
+  PROCEDURE alter_modify_run_time(planname      VARCHAR,
+                                  curr_item     INTEGER,
+                                  next_run_time DATETIME,
+                                  istart_t      DATETIME DEFAULT NULL) IS
+    LANGUAGE "C" NAME "BLDIN_BAK_MODIFY_ITEM_RUN_TIME";
+
+  /*************生成文件的时间后缀****************/
+  FUNCTION append_file_tail(srcpathname varchar) RETURN VARCHAR IS
+    pos         INTEGER;
+    tail        VARCHAR;
+    str_year    VARCHAR;
+    str_month   VARCHAR;
+    str_day     VARCHAR;
+    str_hour    VARCHAR;
+    str_minute  VARCHAR;
+    str_second  VARCHAR;
+    str_ext     VARCHAR;
+    dstpathname VARCHAR;
+  BEGIN
+    if not FILE_EXISTS(srcpathname) then
+      RETURN NULL;
+    end if;
+  
+    tail := to_char(sysdate);
+  
+    str_year   := substr(tail, 1, 4);
+    str_month  := substr(tail, 6, 2);
+    str_day    := substr(tail, 9, 2);
+    str_hour   := substr(tail, 12, 2);
+    str_minute := substr(tail, 15, 2);
+    str_second := substr(tail, 18, 2);
+  
+    tail := str_year || str_month || str_day || str_hour || str_minute ||
+            str_second;
+  
+    pos := POSITION('.' IN REVERSE_STR(srcpathname));
+    if pos > 0 then
+      str_ext     := tailing(srcpathname, pos - 1);
+      dstpathname := heading(srcpathname, len(srcpathname) - pos);
+    else
+      dstpathname := srcpathname;
+    end if;
+  
+    dstpathname := dstpathname || '_' || tail || '.' || str_ext;
+  
+    --send_msg(dstpathname);
+  
+    RETURN dstpathname;
+  
+END;
+
+  /**********************取得文件末尾的创建时间********************/
+  FUNCTION get_file_create_time(filename VARCHAR, compfilename VARCHAR)
+    RETURN DATETIME IS
+    dt         DATETIME;
+    dt_str     VARCHAR;
+    str_year   VARCHAR;
+    str_month  VARCHAR;
+    str_day    VARCHAR;
+    str_hour   VARCHAR;
+    str_minute VARCHAR;
+    str_second VARCHAR;
+    pos        INTEGER;
+  BEGIN
+  
+    --在文件名中,取得时间串
+    dt_str := substr(filename, len(compfilename) + 2, 14);
+    if len(dt_str) != 14 then
+      dt_str := '99991231235959';
+    end if;
+  
+    str_year   := substr(dt_str, 1, 4);
+    str_month  := substr(dt_str, 5, 2);
+    str_day    := substr(dt_str, 7, 2);
+    str_hour   := substr(dt_str, 9, 2);
+    str_minute := substr(dt_str, 11, 2);
+    str_second := substr(dt_str, 13, 2);
+  
+    dt_str := str_year || '-' || str_month || '-' || str_day || ' ' ||
+              str_hour || ':' || str_minute || ':' || str_second;
+    dt     := To_date(dt_str, 'yyyy-mm-dd hh24:mi:ss');
+    RETURN dt;
+END;
+
+  /************取得指定路径下,匹配指定部分开始字符的最早的一个文件*********/
+  FUNCTION get_first_file(path      VARCHAR,filename  VARCHAR,bak_count out integer) RETURN VARCHAR IS
+    str_name     varchar;
+    str_ext      varchar;
+    str_filename varchar;
+    str_fileext  varchar;
+    pos          integer;
+    create_dt    datetime;
+    ret_filename varchar;
+    dt_str       varchar;
+  BEGIN
+    bak_count    := 0;
+    ret_filename := NULL;
+  
+    --检测路径存在
+    if not dir_exists(path) then
+      RAISE_APPLICATION_ERROR(-30012, '目标路径' || path || '不存在.');
+    end if;
+  
+    --分离指定文件名的名字和后缀
+    pos := POSITION('.' IN REVERSE_STR(filename));
+    if pos > 0 then
+      str_ext  := tailing(filename, pos - 1);
+      str_name := heading(filename, len(filename) - pos);
+    end if;
+  
+    create_dt := To_date('9999-12-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss');
+  
+    FOR r IN (select * from TABLE(DBMS_INFO.FILE_LIST(path))) LOOP
+      if not r.is_dir then
+        pos := position('/' IN REVERSE_STR(r.db_path));
+        if pos > 0 then
+          str_filename := tailing(r.db_path, pos - 1);
+        else
+          str_filename := r.db_path;
+        end if;
+      
+        pos := POSITION('.' IN REVERSE_STR(str_filename));
+        if pos > 0 then
+          str_fileext  := tailing(str_filename, pos - 1);
+          str_filename := heading(str_filename, len(str_filename) - pos);
+        end if;
+      
+        pos := position(str_name in str_filename);
+        if pos = 1 and '_' = substr(str_filename, len(str_name) + 1, 1) and
+           str_ext = str_fileext then
+          bak_count := bak_count + 1;
+          if create_dt > get_file_create_time(str_filename, str_name) then
+            create_dt    := get_file_create_time(str_filename, str_name);
+            ret_filename := r.db_path;
+          end if;
+        end if;
+      end if;
+    END FOR;
+  
+    RETURN ret_filename; 
+END;
+
+  /*****************************处理重命名操作********************************/
+  PROCEDURE rename_op(path VARCHAR, fname VARCHAR) IS
+    pos         INTEGER;
+    srcfilename VARCHAR;
+    dstfilename VARCHAR;
+  BEGIN
+    --参数检测
+    
+    IF path ISNULL THEN
+      RAISE_APPLICATION_ERROR(-30020, '参数path不能为空');
+    END IF;
+  
+    IF fname ISNULL THEN
+      RAISE_APPLICATION_ERROR(-30020, '参数fname不能为空');
+    END IF;
+  
+    --处理路径
+    pos := position('/' in reverse_str(path));
+ 
+    IF pos = 1 THEN
+      srcfilename := path;
+    ELSE
+      srcfilename := CONCAT(path, '/');
+    END IF;
+
+    srcfilename := CONCAT(srcfilename, fname);
+    dstfilename := append_file_tail(srcfilename);
+    IF dstfilename is not null then
+        if not RENAME_FILE(srcfilename, dstfilename) then
+      RAISE_APPLICATION_ERROR(-30015,'重命名文件' || srcfilename || '失败.');
+    end if;
+    end if;
+END;
+
+PROCEDURE Del_xfn() as
+    path_str varchar;
+    xfn_str  varchar;
+    min_xfn  integer;
+    path_len integer;
+    xfn      integer;
+  BEGIN
+    select MIN_RESTORE_XFN into min_xfn from sys_ctl_vars;
+    for r in (select db_path
+                from TABLE(DBMS_INFO.FILE_LIST('/ARCH'))
+               ORDER BY DB_PATH) loop
+      path_str := r.db_path;
+      --取得归档号
+      path_len := len(path_str);
+      path_str := heading(path_str, path_len - 4);
+      xfn_str  := tailing(path_str, path_len - 4 - len('/HOME/ARCH/REDO'));
+      xfn      := atol(xfn_str);
+      --如果归档号小于最小安全号,则删除归档文件
+      if xfn < min_xfn then
+        DROP_FILE(r.db_path);
+      end if;
+    end for;
+END;
+
+PROCEDURE FILE_OPTION (PATH VARCHAR,OBJ_NAME VARCHAR,SAVE_BAK INT,OP_TYPE VARCHAR,PLAN_NAME VARCHAR,ITEM_NO INT,PATH_BAK VARCHAR)
+AS
+srcfilename 	VARCHAR;
+bak_count 		int;
+pos          	INTEGER;
+tmp_item_no  	INTEGER;
+s_t          	DATETIME;
+bakpathname 	VARCHAR;
+dstfilename 	VARCHAR;
+ BEGIN
+      --处理删除文件操作    
+      IF UPPER(OP_TYPE) = 'DELETE' THEN
+      --先重命名    
+      rename_op(PATH, OBJ_NAME);
+      --删除操作
+      srcfilename := get_first_file(PATH, OBJ_NAME, bak_count);
+      if srcfilename notnull and bak_count > SAVE_BAK then
+        if not DROP_FILE(srcfilename) then
+          RAISE_APPLICATION_ERROR(-30016,'删除文件' || srcfilename || '失败.');
+        end if;
+      end if;
+      --处理移动文件操作                  
+    ELSIF
+     UPPER(OP_TYPE) = 'MOVE' THEN
+    --先重命名
+    rename_op(PATH, OBJ_NAME);
+    --移动操作
+    srcfilename := get_first_file(PATH, OBJ_NAME, bak_count);
+    if srcfilename notnull and bak_count > SAVE_BAK then
+      pos := POSITION('/' IN REVERSE_STR(srcfilename));
+      if pos > 0 then
+        dstfilename := tailing(srcfilename, pos - 1);
+      end if;
+    
+      if '/' = TAILING(PATH_BAK, 1) then
+        dstfilename := CONCAT(PATH_BAK, dstfilename);
+      else
+        dstfilename := CONCAT('/', dstfilename);
+        dstfilename := CONCAT(PATH_BAK, dstfilename);
+      end if;
+    
+      if not RENAME_FILE(srcfilename, dstfilename) then
+        RAISE_APPLICATION_ERROR(-30017,'移动文件' || srcfilename || '失败.');
+      end if;
+    end if;
+    END IF;
+END;--end file_op
+
+/************备份计划的执行体(由JOB管理器调用)****************/
+PROCEDURE Run() IS
+    mark_str    VARCHAR;
+    sql_str     VARCHAR;
+    tv          INTERVAL DAY TO MINUTE;
+    nt          DATETIME;
+    tmp_item_no INTEGER;
+    s_t         DATETIME;
+    bakpathname VARCHAR;
+    option_type varchar;
+  BEGIN
+    --提取活动计划中到执行时间的子项
+    FOR r IN (SELECT * FROM DBA_BACKUP_ITEMS R1 ,DBA_BACKUP_PLANS R2
+               WHERE  r2.ENABLE=true AND NEXT_RUN_T < SYSDATE AND R1.PLAN_NAME=R2.PLAN_NAME
+               ORDER BY R1.PLAN_NAME, ITEM_NO) LOOP   
+     
+     IF r.op_type='BACKUP' THEN
+     		option_type:='BACKUP SYSTEM';
+     ELSIF r.op_type='BACKUP_INC' THEN
+     		option_type:='BACKUP SYSTEM INCREMENT';
+     ELSIF r.op_type='EXPORT'  AND r.OBJ_TYPE = 'DATABASE' THEN
+     		option_type:='EXPORT DATABASE';
+     ELSIF r.op_type='EXPORT'  AND r.OBJ_TYPE = 'TABLE' THEN
+     		option_type:='EXPORT TABLE';
+     END IF;
+      
+      ----每次备份前进行文件重名处理,并根据文件处理项进行处理,增量除外
+      IF R.OP_TYPE = 'BACKUP' or R.OP_TYPE='EXPORT' THEN
+        FILE_OPTION(r.PATH,r.FILE_NAME,r.FILE_KEEP_CNT,r.file_op,r.plan_name,r.item_no,r.FILE_MOVE_PATH);
+        nt := r.NEXT_RUN_T;
+        while nt <= SYSDATE LOOP
+           nt := nt + r.PERIOD;
+        END LOOP;
+        
+        --修改下次执行时间(无论成功失败,均修改执行时间)
+        dbms_backup.alter_modify_curr_item(r.PLAN_NAME, r.ITEM_NO);
+        dbms_backup.alter_modify_run_time(r.PLAN_NAME, r.ITEM_NO, nt);
+      ELSE
+        nt  := r.NEXT_RUN_T;
+        s_t := r.ISTART_T;
+        WHILE nt <= SYSDATE LOOP
+          nt := nt + r.IPERIOD;
+          IF nt > s_t + r.PERIOD THEN
+            s_t := s_t + r.PERIOD;
+            nt  := s_t + r.TIME_OFF;
+          END IF;
+        END LOOP;
+        dbms_backup.alter_modify_curr_item(r.PLAN_NAME, r.ITEM_NO);
+        dbms_backup.alter_modify_run_time(r.PLAN_NAME, r.ITEM_NO, nt, s_t);
+      END IF;
+
+
+
+
+      bakpathname := r.PATH;
+      IF '/' != TAILING(bakpathname, 1) THEN
+        bakpathname := CONCAT(bakpathname, '/');
+      END IF;
+      bakpathname := CONCAT(bakpathname, r.FILE_NAME);
+      
+      IF r.OP_TYPE = 'BACKUP' THEN
+        sql_str := 'BACKUP SYSTEM TO ''' || bakpathname || ''' online;';
+      ELSIF r.OP_TYPE = 'BACKUP_INC' THEN
+        sql_str := 'BACKUP SYSTEM INCREMENT APPEND TO ''' || bakpathname || ''' online;';
+      ELSIF r.OP_TYPE = 'EXPORT' AND r.OBJ_TYPE = 'DATABASE' THEN
+        sql_str := 'BACKUP DATABASE TO ''' || bakpathname || ''';';
+      ELSIF r.OP_TYPE = 'EXPORT' AND r.OBJ_TYPE = 'TABLE' THEN
+        sql_str := 'BACKUP TABLE ' || r.OBJ_NAME || ' APPEND TO ''' || bakpathname || ''';';
+      ELSE
+        CONTINUE;
+      END IF;   
+       
+      BEGIN
+	      EXECUTE IMMEDIATE sql_str;        
+	   END;--end execute
+END FOR;
+END; --end Run
+END DBMS_BACKUP;
+/
+
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_METADATA
+IS
+	FUNCTION GET_DDL(obj_name IN VARCHAR) RETURN CLOB;
+	FUNCTION GET_DDL(obj_type IN VARCHAR,obj_name IN VARCHAR,schema_name IN VARCHAR DEFAULT NULL) RETURN CLOB;
+	FUNCTION GET_DDL_INDEX(tab_name IN VARCHAR, idx_name IN VARCHAR DEFAULT 'ALL') RETURN CLOB;
+END SYSDBA.DBMS_METADATA;
+/
+
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_METADATA 
+IS
+	FUNCTION GET_DDL(obj_name IN VARCHAR) RETURN CLOB
+	IS
+ 	LANGUAGE  "C"
+	NAME	  "BLDIN_GET_DDL";
+	
+	FUNCTION GET_DDL(obj_type IN VARCHAR,obj_name IN VARCHAR,schema_name IN VARCHAR DEFAULT NULL) RETURN CLOB
+	IS
+ 	LANGUAGE  "C"
+	NAME	  "BLDIN_GET_DDL_P3";
+
+	FUNCTION GET_DDL_INDEX(tab_name IN VARCHAR, idx_name IN VARCHAR DEFAULT 'ALL') RETURN CLOB
+	IS
+ 	LANGUAGE  "C"
+	NAME	  "BLDIN_GET_DDL_INDEX";
+END SYSDBA.DBMS_METADATA;
+/
+
+
+----------数据库通用工具包(定义)------------------
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_UTILITY 
+IS
+       FUNCTION GET_TIME() RETURN BIGINT;
+       FUNCTION FORMAT_ERROR_STACK() RETURN VARCHAR(5000);
+       FUNCTION FORMAT_ERROR_BACKTRACE() RETURN VARCHAR(5000);
+END SYSDBA.DBMS_UTILITY;
+/
+
+----------数据库通用工具包(实现)------------------
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_UTILITY 
+IS
+	FUNCTION GET_TIME() RETURN BIGINT
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_GET_TIME";
+        
+	FUNCTION FORMAT_ERROR_STACK() RETURN VARCHAR(5000)
+	IS
+	BEGIN
+		return SQLERRM;
+	END;
+        
+	FUNCTION FORMAT_ERROR_BACKTRACE() RETURN VARCHAR(5000)
+	IS
+	LANGUAGE  "C"
+	NAME	  "BLDIN_FORMAT_ERROR_BACKTRACE";
+        
+END SYSDBA.DBMS_UTILITY;
+/
+
+
+CREATE OR REPLACE PACKAGE DBMS_RANDOM AS
+
+    -- Seed with a binary integer
+    PROCEDURE SEED(val IN INTEGER);
+
+    -- Seed with a string (up to length 2000)
+    PROCEDURE SEED(val IN VARCHAR2);
+
+    -- Get a random 18-digit precision number, 0.0 <= value < 1.0
+    FUNCTION VALUE RETURN NUMBER(38,18);
+
+    -- get a random Oracle number x, low <= x < high
+    FUNCTION VALUE (low IN NUMBER, high IN NUMBER) RETURN NUMBER(38,18);
+
+    -- get a random number from a normal distribution
+    FUNCTION normal RETURN NUMBER ;
+
+    -- get a random string
+    FUNCTION STRING (opt char, len NUMBER)
+          /* "opt" specifies that the returned string may contain:
+             'u','U'  :  upper case alpha characters only
+             'l','L'  :  lower case alpha characters only
+             'a','A'  :  alpha characters only (mixed case)
+             'x','X'  :  any alpha-numeric characters (upper)
+             'p','P'  :  any printable characters
+          */
+        RETURN VARCHAR2 ;  -- string of <len> characters
+
+    -- Obsolete, just calls seed(val)
+    PROCEDURE INITIALIZE(val IN INTEGER);
+
+    -- Obsolete, get integer in ( -power(2,31) <= random < power(2,31) )
+    FUNCTION RANDOM RETURN INTEGER;
+
+    TYPE NUM_ARRAY IS TABLE OF NUMBER(38,38) INDEX BY INTEGER;
+END DBMS_RANDOM;
+/
+
+
+CREATE OR REPLACE PACKAGE BODY DBMS_RANDOM AS
+    mem        num_array;           -- big internal state hidden from the user
+    counter    INTEGER := 55;       -- counter through the results
+    saved_norm NUMBER := NULL;      -- unused random normally distributed value
+    need_init  BOOLEAN := TRUE;     -- do we still need to initialize
+
+    -- Seed the random number generator with a INTEGER
+    PROCEDURE SEED(val IN INTEGER) IS
+    BEGIN
+		SEED(TO_CHAR(val));
+    END SEED;
+
+    -- Seed the random number generator with a string.
+    PROCEDURE SEED(val IN VARCHAR2) IS
+        junk     VARCHAR2(2000);
+        piece    VARCHAR2(20);
+        randval  NUMBER(38,37);
+        mytemp   NUMBER(38,0);
+        vatemp   NUMBER(38,14);
+        j        INTEGER;
+    BEGIN
+        need_init   := FALSE;
+        saved_norm  := NULL;
+        counter     := 0;
+        junk        := val;
+        FOR i IN 0..54 LOOP
+            piece   := SUBSTR(junk,1,19);
+            randval := 0;
+            j       := 1;
+
+            -- convert 19 characters to a 38-digit number
+            FOR j IN 1..19 LOOP
+                randval := 1e2*randval + NVL(ASCII(SUBSTR(piece,j,1)),0.0);
+            END LOOP;
+
+            -- try to avoid lots of zeros
+            randval := randval*1e-38+i*.01020304050607080910111213141516171819;
+            mem(i)  := randval - TRUNC(randval);
+
+            -- we've handled these first 19 characters already; move on
+            junk    := SUBSTR(junk,20);
+        END LOOP;
+
+	    randval := mem(54);
+        FOR j IN 0..10 LOOP
+            FOR i IN 0..54 LOOP
+                
+                -- barrelshift mem(i-1) by 24 digits
+                vatemp  := randval * 1e24;
+                mytemp  := TRUNC(randval);
+                randval := (randval - mytemp) + (mytemp * 1e-38);
+
+                -- add it to mem(i)
+                randval := mem(i)+randval;
+                IF (randval >= 1.0) THEN
+                    randval := randval - 1.0;
+                END IF;
+
+		        -- record the result
+                mem(i) := randval;
+            END LOOP;
+        END LOOP;
+    END seed;
+
+    -- give values to the user
+    -- Delayed Fibonacci, pilfered from Knuth volume 2
+    FUNCTION VALUE RETURN NUMBER(38,18) IS
+    randval  NUMBER(38,18);
+    BEGIN
+        counter := counter + 1;
+        IF counter >= 55 THEN
+
+            -- initialize if needed
+            IF (need_init = TRUE) THEN
+                SEED(TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS') ||
+                     USER || USERENV('SESSIONID'));
+            ELSE
+                -- need to generate 55 more results
+                FOR i IN 0..30 LOOP
+                    randval := mem(i+24) + mem(i);
+                    IF (randval >= 1.0) THEN
+                        randval := randval - 1.0;
+                    END IF;
+                    mem(i) := randval;
+                END LOOP;
+                FOR i IN 31..54 LOOP
+                    randval := mem(i-31) + mem(i);
+                    IF (randval >= 1.0) THEN
+                        randval := randval - 1.0;
+                    END IF;
+                    mem(i) := randval;
+                END LOOP;
+            END IF;
+            counter := 0;
+        END IF;
+        RETURN mem(counter)*mem(counter)*mem(counter);
+    END VALUE;
+
+    -- Random 38-digit number between LOW and HIGH.
+    FUNCTION VALUE ( low in NUMBER, high in NUMBER) RETURN NUMBER(38,18)
+    is
+    val numeric(38,18);
+    BEGIN
+        val  := VALUE();
+        val  := val*(high-low);
+        RETURN val+low;
+    END VALUE;
+
+    -- Random numbers in a normal distribution.
+    -- Pilfered from Knuth volume 2.
+    FUNCTION NORMAL RETURN NUMBER is
+                    -- 38 decimal places: Mean 0, Variance 1
+        v1  NUMBER(38,18);
+        v2  NUMBER(38,18);
+        r2  NUMBER(38,18);
+        fac NUMBER(38,18);
+    BEGIN
+        IF saved_norm is not NULL THEN     -- saved from last time
+            v1 := saved_norm;              -- to be returned this time
+            saved_norm := NULL;
+        ELSE
+            r2 := 2;
+            -- Find two independent uniform variables
+            WHILE r2 > 1 OR r2 = 0 LOOP
+                v1 := value();
+                v1 := v1 + v1 - 1;
+                v2 := value();
+                v2 := v2 + v2 - 1;
+                r2 := v1*v1 + v2*v2;  -- r2 is radius
+            END LOOP;      -- 0 < r2 <= 1:  in unit circle
+            /* Now derive two independent normally-distributed variables */
+            fac := sqrt(-2*ln(r2)/r2);
+            v1 := v1*fac;          -- to be returned this time
+            saved_norm := v2*fac;  -- to be saved for next time
+        END IF;
+        RETURN v1;
+    END  NORMAL;
+
+    -- Random string.  Pilfered from Chris Ellis.
+    FUNCTION STRING (opt char, len NUMBER)
+        RETURN VARCHAR2 is      -- string of <len> characters
+        optx char (1)  := lower(opt);
+        rng  NUMBER;
+        tmp  NUMBER(38,18);
+        n    INTEGER;
+        ccs  VARCHAR2 (128);    -- candidate character subset
+        xstr VARCHAR2 (4000) := NULL;
+    BEGIN
+        IF    optx = 'u' THEN    -- upper case alpha characters only
+            ccs := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+            rng := 26;
+        ELSIF optx = 'l' THEN    -- lower case alpha characters only
+            ccs := 'abcdefghijklmnopqrstuvwxyz';
+            rng := 26;
+        ELSIF optx = 'a' THEN    -- alpha characters only (mixed case)
+            ccs := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ||
+                  'abcdefghijklmnopqrstuvwxyz';
+            rng := 52;
+        ELSIF optx = 'x' THEN    -- any alpha-numeric characters (upper)
+            ccs := '0123456789' ||
+                  'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+            rng := 36;
+        ELSIF optx = 'p' THEN    -- any printable char (ASCII subset)
+            ccs := ' !"#$%&''()*+,-./' || '0123456789' || ':;<=>?@' ||
+                  'ABCDEFGHIJKLMNOPQRSTUVWXYZ' || '[\]^_`' ||
+                  'abcdefghijklmnopqrstuvwxyz' || '{|}~' ;
+            rng := 95;
+        ELSE
+            ccs := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+            rng := 26;          -- default to upper case
+        END IF;
+        FOR i IN 1 .. least(len,4000) LOOP
+            /* Get random integer within specified range */
+            tmp := rng * value;
+            n := TRUNC(tmp) + 1;
+            /* Append character to string  */
+            xstr := xstr || SUBSTR(ccs,n,1);
+        END LOOP;
+        RETURN xstr;
+    END STRING;
+
+    -- For compatibility with 8.1
+    PROCEDURE INITIALIZE(val IN INTEGER) IS
+    BEGIN
+		SEED(to_char(val));
+    END INITIALIZE;
+
+    -- For compatibility with 8.1
+    -- Random INTEGER, -power(2,31) <= Random < power(2,31)
+    -- Delayed Fibonacci, pilfered from Knuth volume 2
+    FUNCTION RANDOM RETURN INTEGER IS
+    BEGIN
+	RETURN TRUNC(Value*4294967296)-2147483648;
+    END RANDOM;
+
+END DBMS_RANDOM;
+/
+
+
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_JOB
+IS
+	PROCEDURE SUBMIT(job OUT INTEGER,what IN VARCHAR,next_date IN DATETIME DEFAULT sysdate,pop_interval IN VARCHAR DEFAULT NULL,no_parse IN BOOLEAN DEFAULT FALSE,instance IN INTEGER DEFAULT 0,force IN BOOLEAN DEFAULT FALSE);
+	PROCEDURE RUN(job INTEGER,force IN BOOLEAN DEFAULT FALSE);
+	PROCEDURE REMOVE(job INTEGER);
+END SYSDBA.DBMS_JOB;
+/
+
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_JOB 
+IS
+	PROCEDURE SUBMIT(job OUT INTEGER,what IN VARCHAR,next_date IN DATETIME DEFAULT sysdate,pop_interval IN VARCHAR DEFAULT NULL,no_parse IN BOOLEAN DEFAULT FALSE,instance IN INTEGER DEFAULT 0,force IN BOOLEAN DEFAULT FALSE)
+	IS
+		name varchar;
+	BEGIN
+		name := dbms_random.string('u',20);
+ 		DBMS_SCHEDULER.CREATE_JOB(name,'stored_procedure',what,0,next_date,pop_interval,'2099-12-31 00:00:00','JOB_CLASS',force,FALSE,NULL);
+		SELECT JOB_ID INTO job FROM ALL_JOBS WHERE JOB_NAME=name;
+	END;
+
+	PROCEDURE RUN(job INTEGER,force IN BOOLEAN DEFAULT FALSE)
+	IS
+		name varchar;
+	BEGIN
+		SELECT JOB_NAME INTO name FROM ALL_JOBS WHERE JOB_ID=job;
+		DBMS_SCHEDULER.RUN_JOB(name,force);
+	END;
+
+	PROCEDURE REMOVE(job INTEGER)
+	IS
+		name varchar;
+	BEGIN
+		SELECT JOB_NAME INTO name FROM ALL_JOBS WHERE JOB_ID=job;
+		DBMS_SCHEDULER.DROP_JOB(name,TRUE);
+	END;
+	
+END SYSDBA.DBMS_JOB;
+/
+
+ ----------SYNONYM DEFINE-------------
+CREATE PUBLIC SYNONYM RECYCLEBIN FOR USER_RECYCLEBIN;
+/
+
+/** 使用时开启
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_SESSION
+IS
+	PROCEDURE SET_CONTEXT(context_name VARCHAR,attribute VARCHAR,value VARCHAR,username VARCHAR DEFAULT NULL,client_id VARCHAR DEFAULT NULL);
+END SYSDBA.DBMS_SESSION;
+
+
+----包体
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_SESSION 
+IS
+	PROCEDURE SET_CONTEXT(context_name VARCHAR,attribute VARCHAR,value VARCHAR,username VARCHAR DEFAULT NULL,client_id VARCHAR DEFAULT NULL)
+IS
+ 	LANGUAGE  "C"
+  NAME	  "BLDIN_SET_CONTEXT";
+	
+END SYSDBA.DBMS_SESSION;
+
+
+CREATE OR REPLACE PACKAGE SYSDBA.DBMS_RLS
+IS
+CONTEXT_SENSITIVE integer :=1;
+	PROCEDURE ADD_POLICY(
+	 object_schema            IN VARCHAR,
+   object_name              IN VARCHAR,
+   policy_name              IN VARCHAR,
+   function_schema          IN VARCHAR,
+   policy_function          IN VARCHAR,
+   statement_types          IN VARCHAR,
+   update_check             IN BOOLEAN DEFAULT FALSE,
+   enable                   IN BOOLEAN DEFAULT TRUE,
+   static_policy            IN BOOLEAN DEFAULT FALSE,
+   policy_type              IN BINARY_INTEGER DEFAULT NULL,
+   long_predicate           IN BOOLEAN DEFAULT FALSE,
+   sec_relevant_cols        IN VARCHAR2 DEFAULT NULL,
+   sec_relevant_cols_opt    IN BINARY_INTEGER DEFAULT NULL);
+   PROCEDURE DROP_POLICY(
+	 object_schema            IN VARCHAR,
+   object_name              IN VARCHAR,
+   policy_name              IN VARCHAR);
+END SYSDBA.DBMS_RLS;
+
+
+----包体
+CREATE OR REPLACE PACKAGE BODY SYSDBA.DBMS_RLS 
+IS
+	PROCEDURE ADD_POLICY(
+	 object_schema            IN VARCHAR,
+   object_name              IN VARCHAR,
+   policy_name              IN VARCHAR,
+   function_schema          IN VARCHAR,
+   policy_function          IN VARCHAR,
+   statement_types          IN VARCHAR,
+   update_check             IN BOOLEAN DEFAULT FALSE,
+   enable                   IN BOOLEAN DEFAULT TRUE,
+   static_policy            IN BOOLEAN DEFAULT FALSE,
+   policy_type              IN BINARY_INTEGER DEFAULT NULL,
+   long_predicate           IN BOOLEAN DEFAULT FALSE,
+   sec_relevant_cols        IN VARCHAR2 DEFAULT NULL,
+   sec_relevant_cols_opt    IN BINARY_INTEGER DEFAULT NULL)
+  IS
+ 	LANGUAGE  "C"
+  NAME	  "BLDIN_ADD_POLICY";
+  
+  PROCEDURE DROP_POLICY(
+	 object_schema            IN VARCHAR,
+   object_name              IN VARCHAR,
+   policy_name              IN VARCHAR)
+	 IS
+ 	LANGUAGE  "C"
+  NAME	  "BLDIN_DROP_POLICY";
+END SYSDBA.DBMS_RLS;
+**/
+

BIN
file/xugu/BIN/xugu_linux_aarch64_20240117


+ 1 - 0
file/xugu/BIN/xugu_start.sh

@@ -0,0 +1 @@
+$PWD/xugu_linux_x86_64_20240117 -service

+ 10 - 0
file/xugu/SETUP/mount.ini

@@ -0,0 +1,10 @@
+
+/XGLOG      ./XGLOG
+/CATA      ./XHOME/CATA
+/DATA      ./XHOME/DATA
+/TEMP      ./XHOME/TEMP
+/REDO      ./XHOME/REDO
+/BACKUP      ./XHOME/BACKUP
+/ARCH      ./XHOME/ARCH
+/UNDO      ./XHOME/UNDO
+/MODI      ./XHOME/XMODI

+ 3 - 0
file/xugu/SETUP/trust.ini

@@ -0,0 +1,3 @@
+#Trusted db user ip setup:
+# trust(or untrust)db_name(or everydb)user_name(or everyone) from ip1 to ip2 
+  trust everydb everyone from anywhere

+ 18 - 0
file/xugu/SETUP/types.ini

@@ -0,0 +1,18 @@
+BOOL      BOOLEAN
+INT       INTEGER
+SHORT     SMALLINT
+LONGINT   BIGINT
+LONG      CLOB
+REAL      FLOAT
+DECIMAL   NUMERIC
+TEXT      VARCHAR
+NCHAR     CHAR
+NVARCHAR  VARCHAR
+NVARCHAR2 VARCHAR
+VARCHAR2  VARCHAR
+NCLOB     CLOB
+PLS_INTEGER INTEGER
+BINARY_INTEGER INTEGER
+BINARY_DOUBLE DOUBLE
+BINARY_FLOAT FLOAT
+RAW BINARY

+ 168 - 0
file/xugu/SETUP/xugu.ini

@@ -0,0 +1,168 @@
+#---------------------------------------------------------------
+# XuGu SQL Server 12.0.0
+#---------------------------------------------------------------
+
+#网络侦听设置
+    listen_port = 5138;  侦听端口
+    nio_timeout = 100;  网络读写超时(单位:秒)
+    login_timeout = 30;  登录超时时间(单位:秒)
+    use_std_nio = true;  是否使用标准网络监听器(标准监听使用select模型)
+    max_idle_time = 3600;  最大闲置时间(单位:秒,在此时间内若无请求,则断开连接,0表示无限制)
+    min_pass_len = 8;  口令的最短长度
+    pass_mode = 3;  口令模式 1:不重复字符或数字,2:字母+数字,3:字母+数字+符号
+    def_timezone = "GMT+08:00";  默认新建库和会话时区
+    def_timefmt = "YYYY-MM-DD HH24:MI:SS";  默认时间格式
+    def_charset = "GBK";  默认新建库和会话字符集
+    send_warning = true;  是否发送警告信息
+    conn_fail_cnt = 3;  禁止登陆的失败次数
+    max_act_conn_num = 0;  最大活动事务连接数(0表示无限制)
+    max_conn_num = 1024;  系统最大连接数(标准监听有效)
+    session_per_user = 1000;  默认用户可用连接数(0表示不限制)
+
+#系统并行度设置
+    thd_bind_mode = 0;  线程绑定cpu模式
+    task_thd_num = 16;  任务处理线程数
+    tcp_thd_num = 1;  TCP数据接收线程数
+    rsync_thd_num = 8;  远程同步处理线程数
+    rtran_thd_num = 8;  远程事务处理线程数
+    max_parallel = 1;  最大单任务并行度
+    cata_parti_num = 32;  目录分区数(建议设为CPU核数)
+    cata_hash_size = 8192;  系统对象目录速查Hash表尺度
+    lock_hash_size = 8192;  系统锁管理器Hash表尺度
+
+#系统缓冲区设置
+    data_buff_mem = 256;  数据缓冲区内存(单位:M)
+    swap_buff_mem = 64;  交换缓冲区内存(单位:M)
+    system_sga_mem = 128;  系统全局区内存(单位:M)
+    ena_share_sga = true;  是否允许缓冲区与SGA共享
+    xlog_buff_mem = 32;  事务日志缓冲区尺度(单位:M)
+    max_hash_size = 3000000;  最大Hash表槽数
+    max_hash_mem = 32;  允许单个hash节点使用的最大内存量(单位:M)
+    hash_parti_num = 16;  Hash运算在内存不够时转入分组处理的分组数
+    max_malloc_once = 512;  最大单次分配内存块大小(单位:M)
+    max_task_mem = 0;  任务线程运行最大内存(单位:M,0表示不限制)
+
+#SQL引擎设置
+    def_optimize_mode = 0;  默认优化模式(0:all rows,1:first rows,n:first n rows)
+    def_optimize_level = 3;  默认优化级别(预留暂未使用)
+    def_nulls_first = false;  默认排序时空值靠前(预留暂未使用)
+    max_prepare_num = 100;  最大prepared语句数
+    max_cursor_num = 100;  最大cursor数
+    prepare_reuse = true;  启用预处理重用
+    supple_prepare_sql = false;  补齐预处理定义语句
+    max_loop_num = 100000;  存储过程最大循环次数(0表示无限制)
+    proc_reuse_cnt = 1;  过程函数中SQL重用多少次后重解析规划(0表示不重解析)
+    delay_check_unique = false;  是否将唯一值检测延迟到事务结束时进行
+    str_trunc_warning = true;  字串超长时是否使用截断并告警
+    enable_lob_in_row = true;  是否允许将较小的大对象数据直接嵌入在行中(预留暂未使用)
+    def_empty_str_as_null = false;  是否默认将长度为0的字符串当作空值
+    auto_use_eje = false;  是否允许自动生成弹射式执行计划
+    auto_eje_cast = 10000;  自动生成弹射式执行计划的最小查询开销值(-1表示禁用并行执行)
+    auto_eje_parallel = 4;  自动生成弹射式执行计划的并行度参数
+    enable_eje_big_block = false;  是否允许弹射器堆扫描使用大块读策略
+    para_eje_seqscan_num = 2;  弹射器堆扫描器并行执行路数 
+    cata_case_sensitive = false;  系统字典大小写敏感
+    check_unique_mode = 2;  唯一值检测方式(1:不预检测 2:预检测)
+    ddl_timeout = 2000;  DDL操作加锁超时时间(ms)
+    tab_rebuild_limit = 10;  DDL表重整或复制行数限制(单位100万,0表示不限制)
+    use_index_order = false;  order by使用索引序
+    iscan_ini_cost = 200;  索引扫描初始化代价
+    seqscan_skip_err = false;  允许顺序扫描跳过847错误
+    enable_find_synonym = true;  允许查找同义词
+    support_global_tab = false;  是否支持全局临时表
+    idx_delay_del_limit = 0;  索引延迟删除量限制(不含唯一值索引,0表示不限制)
+    enable_sys_name_idx = false;  是否启用系统对象名索引(表名/视图名等)
+    enable_stream_import = false;  是否启用流导入功能
+    select_table_num = 12;  查询语句允许的最大表个数
+    def_index_row_length = 1024;  索引最大行长限制
+    week_mode = 0;  周数的计算模式(0-7)
+
+#存贮子系统参数
+    default_copy_num = 3;  存贮的默认版本个数
+    safely_copy_num = 2;  存贮的安全版本个数
+    enable_read_copy2 = false;  允许读存贮副本
+    max_hotspot_num = 256;  最大插入热点数
+    size_per_chunk = 8;  存储片大小(支持 1-64 单位:M)
+    block_size = 8192;  数据块大小
+    block_pctfree = 15;  默认新建表存储块空闲度百分比
+    init_data_space_num = 4;  初始化系统时数据表空间个数
+    init_temp_space_num = 2;  初始化系统时临时表空间个数
+    init_undo_space_num = 2;  初始化系统时回滚表空间个数
+    def_data_space_size = 256;  默认数据表空间的初始尺度(单位:M)
+    def_temp_space_size = 256;  默认临时表空间的初始尺度(单位:M)
+    def_undo_space_size = 256;  默认回滚表空间的初始尺度(单位:M)
+    def_redo_file_size = 500;  默认重做日志文件尺度(单位:M)
+    def_file_step_size = 64;  默认表空间文件的增长步长(单位:M)
+    max_temp_space_size = -1;  临时表空间的最大尺度(单位:M,-1表示不限制)
+    max_file_size = -1;  默认系统初始化数据和临时文件最大尺度(单位:M,-1表示不限制)
+    auto_extend_dfile = false;  是否允许自动扩展数据表空间文件
+    store_drop_delay = 16;  局部存贮的延迟删除时间(单位:分钟)
+    store_maint_span = 0;  存贮维护间隔时间(单位:ms,0表示不间隔)
+    enable_store_migrate = false;  是否允许自动迁移存储单元
+    ov_reuse = false;  是否允许OV存储重用
+    index_preload_cnt = 10000;  启用索引存储预加载最小个数(0表示不启用预加载)
+    data_file_append_mode = 0;  扩展文件大小时是否写实(0:写实,1:不写)
+    ioerr_report_mode = 1;  数据文件读写错时处理模式(0:block,1:space)
+
+#存贮子系统附属参数
+    datafile_use_aio = true;  是否启用异步文件IO
+    write_back_thd_num = 1;  磁盘回写线程数(同步IO有效,异步IO取固定值1)
+    max_write_back_num = 32;  脏块回写队列的最大深度
+    catalog_write_through = 2;  系统控制信息回写方式(1:立即保存 2:立即写通)
+    datafile_write_through = true;  是否要求OS对数据文件的更改立即写回磁盘
+    datafile_random_access = false;  数据文件是否以伪随机存取优化方式打开
+    redo_write_through = false;  重做日志文件是否写通方式打开
+    cache_undo_wrt = 1;  是否换缓存UNDO到REDO时写入(0:单独写,1:合并写,2:不写)
+    data_persistence = 0;  数据持久化策略
+    major_retry_num = 20;  重取主存储重试次数(50ms/次)
+    gstore_pick_mode = 1;  Gstore缓存访问并发控制模式(0:值比较,1:校验码,2:锁)
+    major_control_mode = 0;  存储主版本策略(0:轮转,1:固定到第一个存储节点)
+
+#事务子系统参数
+    strictly_commit = false;  事务日志必须写实
+    def_auto_commit = true;  事务默认为自动提交
+    def_iso_level = 1;  默认事务隔离级别(0:只读,1:读已提交,2:重复读,3:序列化)
+    max_trans_modify = 10000;  单个事务最大允许变更行数(0表示不限制)
+    dlock_check_delay = 3000;  死锁检测延迟时间(单位:ms)
+    checkpoint_delay = 15;  Checkpoint的延迟时间(单位:分钟)
+    exit_when_redo_err = true;  重做恢复失败时,系统是否退出
+    skip_boot_rollback = false;  跳过启动时回滚
+    undo_delay_free = 3000;  UNDO项延迟释放时间(单位:ms,0表示立即释放)
+    node_dead_delay = 30;  节点判死心跳次数(2秒/次)
+    enable_node_degrade = true;  是否启用节点降级
+
+#数据备份与同步复制
+    modify_log_parti_num = 8;  变更日志并行写通道数
+    modify_log_pice_len = 100;  变更日志文件分片大小(单位:M)
+    ignore_when_meta_err = 2;  变更日志元信息错误处理模式(0:抛错 1:返回NULL 2:不返回)
+    max_allow_lob_len = 10;  允许记载的最大大对象大小(单位:M)
+    log_archive_mode = 0;  重做日志归档模式(0:不归档,1:拷贝REDO,2:移动REDO)
+    log_supplement = false;  是否开启日志增补
+    enable_recycle = false;  是否启用表级回收站
+
+#系统运行(跟踪)日志参数
+    reg_command = false;  是否记录SQL命令
+    reg_ddl = false;  是否记录DDL命令
+    error_level = 3;  错误日志最低记载等级
+    errlog_size = 100;  错误日志分割长度(单位:M)
+    trace_login = true;  是否跟踪非法登录事件
+    core_dump = false;  是否在内存段错误时进行coredump
+    is_zh = false;  启用中文日志信息
+
+#安全审计参数
+    enable_audit = false;  是否允许审计
+    security_level = 0;  安全等级(0-2)
+
+#系统分析参数
+    enable_analyze = true;  是否启用定时分析功能
+    analyze_time = "02:00:00";  定时分析默认执行时间
+    analyze_threshold = 10;  默认统计分析触发阈值(1--100之间的整数)
+    analyze_mode = 1;  默认统计分析模式(1或2)
+    analyze_level = 2;  默认统计分析采样级别(1-6)
+    enable_monitor = 1;  监控信息统计设置标记位
+    debug_flag = 0;  数据库调试标记位
+
+#兼容性参数
+    def_identity_mode = 0;  自增列模式(1:NULL值自增; 2:0和NULL值自增)
+    def_group_by_mode = 0;  GROUPBY语句模式(0:标准模式; 1:MySQL方言写法)
+    def_compatible_mode = "NONE";  异构库兼容模式的默认值

BIN
file/xugu_linux_aarch64_20240117.tar.gz


+ 33 - 0
go.mod

@@ -0,0 +1,33 @@
+module xg_auto_deploy
+
+go 1.21.4
+
+require (
+	github.com/pkg/sftp v1.13.6
+	github.com/sirupsen/logrus v1.9.3
+	github.com/spf13/viper v1.18.2
+	golang.org/x/crypto v0.22.0
+)
+
+require (
+	github.com/fsnotify/fsnotify v1.7.0 // indirect
+	github.com/hashicorp/hcl v1.0.0 // indirect
+	github.com/kr/fs v0.1.0 // indirect
+	github.com/magiconair/properties v1.8.7 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/pelletier/go-toml/v2 v2.1.0 // indirect
+	github.com/sagikazarmark/locafero v0.4.0 // indirect
+	github.com/sagikazarmark/slog-shim v0.1.0 // indirect
+	github.com/sourcegraph/conc v0.3.0 // indirect
+	github.com/spf13/afero v1.11.0 // indirect
+	github.com/spf13/cast v1.6.0 // indirect
+	github.com/spf13/pflag v1.0.5 // indirect
+	github.com/subosito/gotenv v1.6.0 // indirect
+	go.uber.org/atomic v1.9.0 // indirect
+	go.uber.org/multierr v1.9.0 // indirect
+	golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
+	golang.org/x/sys v0.19.0 // indirect
+	golang.org/x/text v0.14.0 // indirect
+	gopkg.in/ini.v1 v1.67.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)

+ 109 - 0
go.sum

@@ -0,0 +1,109 @@
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
+github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
+github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
+github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
+github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo=
+github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
+github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
+github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
+github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
+github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
+github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
+github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
+github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ=
+github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
+go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
+go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
+golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
+golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
+golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
+golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 85 - 0
internal/auto/check_env.go

@@ -0,0 +1,85 @@
+package auto
+
+import (
+	"fmt"
+	"xg_auto_deploy/internal/global"
+	"xg_auto_deploy/internal/models"
+	"xg_auto_deploy/internal/remote"
+)
+
+func CheckSysEnv(nodeTemp *models.ServerNodeConfig) {
+	send := func(cmd string, flag *string) {
+		_, err := remote.SingleCmd(nodeTemp, cmd)
+		if err != nil {
+			*flag = "未设置"
+		}
+		*flag = "已配置"
+	}
+	send(`grep "net.core.wmem_default = 2097152" /etc/sysctl.conf`, &nodeTemp.CoreWmemDefault)
+	send(`grep "net.core.rmem_default = 2097152" /etc/sysctl.conf`, &nodeTemp.CoreRmemDefault)
+	send(`grep "net.core.rmem_max = 8388608" /etc/sysctl.conf`, &nodeTemp.CoreRmemMax)
+	send(`grep "net.core.wmem_max = 8388608" /etc/sysctl.conf`, &nodeTemp.CoreWmemMax)
+	send(`grep "ulimit -s 20480" /etc/profile`, &nodeTemp.OsOpenFiles)
+	send(`grep "ulimit -n 10240" /etc/profile`, &nodeTemp.OsStackSize)
+}
+
+func modifySysEnv(nodeTemp *models.ServerNodeConfig, cmd string) {
+	send := func(cmd string) {
+		_, err := remote.SingleCmd(nodeTemp, cmd)
+		if err != nil {
+
+		}
+	}
+	send(`echo "net.core.wmem_default = 2097152" | sudo tee -a /etc/sysctl.conf`)
+	send(`echo "net.core.rmem_default = 2097152" | sudo tee -a /etc/sysctl.conf`)
+	send(`echo "net.core.rmem_max = 8388608" | sudo tee -a /etc/sysctl.conf`)
+	send(`echo "net.core.wmem_max = 8388608" | sudo tee -a /etc/sysctl.conf`)
+	send(`echo "ulimit -s 20480" | sudo tee -a /etc/profile`)
+	send(`echo "ulimit -n 10240" | sudo tee -a /etc/profile`)
+	send("sysctl -p /etc/sysctl.conf")
+	send("source /etc/profile")
+}
+
+func checkAppEnv(nodeTemp *models.ServerNodeConfig) {
+	//var temp string
+	// 执行命令检查文件夹路径是否存在
+	cmd := fmt.Sprintf("if [ ! -d %s ]; then mkdir -p %s; fi", nodeTemp.TargetFile, nodeTemp.TargetFile)
+	_, err := remote.SingleCmd(nodeTemp, cmd)
+	if err != nil {
+		global.Logs.Error("无法创建路径targetFile文件夹:", err)
+		return
+	}
+
+	_, err = remote.SingleCmd(nodeTemp, "gcc --version")
+	if err != nil {
+
+		//xgad.errors = append(xgad.errors, fmt.Sprintf("节点%s :gcc未安装", nodeTemp.ID))
+		//xgad.setErrors(fmt.Sprintf("节点%s :gcc未安装", nodeTemp.ID))
+		nodeTemp.AppConfig.Gcc = "0"
+		global.Logs.Warnf("%s: gcc未安装", nodeTemp.ID)
+	} else {
+		global.Logs.Printf("%s:gcc已安装", nodeTemp.ID)
+	}
+
+	_, err = remote.SingleCmd(nodeTemp, "rpm -q libaio")
+	if err != nil {
+		//xgad.setErrors(fmt.Sprintf("节点%s :libaio未安装", nodeTemp.ID))
+		nodeTemp.AppConfig.Libaio = "0"
+		global.Logs.Warnf("%s: libaio未安装", nodeTemp.ID)
+	} else {
+	}
+	_, err = remote.SingleCmd(nodeTemp, "snmpd -v")
+	if err != nil {
+		//xgad.setErrors(fmt.Sprintf("节点%s :snmpd未安装", nodeTemp.ID))
+		nodeTemp.AppConfig.Snmpd = "0"
+		global.Logs.Warnf("%s节点:snmpd未安装", nodeTemp.ID)
+	} else {
+	}
+	_, err = remote.SingleCmd(nodeTemp, "ntpd --version")
+	if err != nil {
+		//	xgad.setErrors(fmt.Sprintf("节点%s :ntpd未安装", nodeTemp.ID))
+		nodeTemp.AppConfig.Ntpd = "0"
+		global.Logs.Warnf("%s节点: ntpd未安装", nodeTemp.ID)
+	} else {
+	}
+}

+ 233 - 0
internal/auto/xugu_deploy.go

@@ -0,0 +1,233 @@
+package auto
+
+import (
+	"bytes"
+	"fmt"
+	"io"
+	"os"
+	"reflect"
+	"strconv"
+	"strings"
+	"xg_auto_deploy/internal/config"
+	"xg_auto_deploy/internal/global"
+	"xg_auto_deploy/internal/models"
+	"xg_auto_deploy/internal/remote"
+	"xg_auto_deploy/internal/utils"
+
+	"golang.org/x/crypto/ssh"
+)
+
+func AutoDeployALL() {
+	for serverNodeId, serverNodeConfig := range global.ServerNodeConfigs {
+		//检查环境
+		CheckSysEnv(&serverNodeConfig)
+		//上传文件到目标服务器
+		UploadFileOrDir(serverNodeId, serverNodeConfig)
+		//设置xugu.ini
+		AutoXuguini(&serverNodeConfig)
+		//设置cluster
+		AutoCluster(&serverNodeConfig)
+	}
+
+	for _, serverNodeConfig := range global.ServerNodeConfigs {
+		PrintServerNodeEnv(&serverNodeConfig)
+	}
+}
+
+// 上传cluster到目标服务器
+func AutoCluster(nodeTemp *models.ServerNodeConfig) {
+	id, err := strconv.Atoi(nodeTemp.NodeId)
+	if err != nil {
+		global.Logs.Errorf("%s节点修改cluster文件失败:%s\n", nodeTemp.NodeId, err)
+		return
+	}
+	var ids string
+	if id < 10 {
+		ids = fmt.Sprintf("000%s", strconv.Itoa(id))
+	} else {
+		ids = fmt.Sprintf("00%s", strconv.Itoa(id))
+	}
+	clusterTemp := config.SaveClusterConfigBuffer(global.ClusterInfo, ids)
+	err = remote.UploadFileBuffer(nodeTemp, clusterTemp, fmt.Sprintf(nodeTemp.XuguAddr+"/SETUP/cluster.ini"))
+	if err != nil {
+		global.Logs.Errorf("%s节点上传cluster文件失败:%s\n", nodeTemp.NodeId, err)
+	}
+}
+
+// 上传xugu.ini到目标服务器
+func AutoXuguini(nodeTemp *models.ServerNodeConfig) {
+	xginiLocal := global.XginiConfigMap["local_file"]
+	// 创建一个 bytes.Buffer
+	xuguIniBuf := new(bytes.Buffer)
+	//设置xuguini内存相关优化
+	setxginiMemory(nodeTemp)
+	//指定上传本地文件xugu.ini,
+	if xginiLocal != "" {
+		// 打开文件
+		file, err := os.Open(xginiLocal)
+		if err != nil {
+			global.Logs.Errorf("%s节点打开xugu.ini文件失败:%s\n", nodeTemp.NodeId, err)
+			panic(err)
+		}
+		defer file.Close()
+
+		// 将文件内容复制到 buf 中
+		if _, err := io.Copy(xuguIniBuf, file); err != nil {
+			global.Logs.Errorf("%s节点修改xugu.ini文件失败:%s\n", nodeTemp.NodeId, err)
+			panic(err)
+		}
+
+		//将配置文件里[xugu]组下的参数替换xugu.ini文件里的参数
+		config.SetXginiBuffer(xuguIniBuf, global.XginiConfigMap)
+		//上传到目标节点
+		err = remote.UploadFileBuffer(nodeTemp, xuguIniBuf, fmt.Sprintf(nodeTemp.XuguAddr+"/SETUP/xugu.ini"))
+		if err != nil {
+			global.Logs.Errorf("%s节点上传xugu.ini文件失败:%s\n", nodeTemp.NodeId, err)
+		}
+	} else {
+		xuguIniDownloadTempbuf := remote.DownloadFileBuffer(nodeTemp, fmt.Sprintf(nodeTemp.XuguAddr+"/SETUP/xugu.ini"))
+		//将配置文件里[xugu]组下的参数替换xugu.ini文件里的参数
+		config.SetXginiBuffer(xuguIniDownloadTempbuf, global.XginiConfigMap)
+		err := remote.UploadFileBuffer(nodeTemp, xuguIniDownloadTempbuf, fmt.Sprintf(nodeTemp.XuguAddr+"/SETUP/xugu.ini"))
+		if err != nil {
+			global.Logs.Errorf("%s节点上传xugu.ini文件失败:%s\n", nodeTemp.NodeId, err)
+		}
+	}
+}
+
+// 设置xugu.ini配置文件中的内存相关
+func setxginiMemory(nodeTemp *models.ServerNodeConfig) {
+	// 检测系统内存大小 free -h | awk 'NR==2{print $2}'
+	memoryTemp, err := remote.SingleCmd(nodeTemp, "free -m | awk 'NR==2{print $4}'")
+	if err != nil {
+		global.Logs.Errorf("%s节点系统内存查询失败,取消自动配置xugu.ini:%s\n", nodeTemp.NodeId, err)
+	}
+	//分配到XginiMap
+	memoryTemp = strings.TrimSpace(memoryTemp)
+	memorySize, err := strconv.Atoi(memoryTemp)
+	if err != nil {
+		// 处理转换错误
+		global.Logs.Errorf("%s节点程序内部计算远端内存大小转换错误::%s\n", nodeTemp.NodeId, err)
+		return
+	}
+	setXgMem := func(memorySize int, para string, fls ...float64) {
+		if memorySize < 8*1024 {
+		} else if memorySize <= 32*1024 {
+			global.XginiConfigMap[para] = strconv.Itoa(int((float64(memorySize) * fls[0] / 1024) * 1024))
+		} else if memorySize <= 64*1024 {
+			global.XginiConfigMap[para] = strconv.Itoa(int((float64(memorySize) * fls[1] / 1024) * 1024))
+		} else if memorySize <= 256*1024 {
+			global.XginiConfigMap[para] = strconv.Itoa(int((float64(memorySize) * fls[2] / 1024) * 1024))
+		} else if memorySize <= 1000*1024 {
+			global.XginiConfigMap[para] = strconv.Itoa(int((float64(memorySize) * fls[3] / 1024) * 1024))
+		}
+	}
+
+	//判断配置文件是否有该参数
+	//data_buff_mem
+	if global.XginiConfigMap["data_buff_mem"] == "" {
+		setXgMem(memorySize, "data_buff_mem", 0.5, 0.6, 0.7, 0.8)
+	}
+	//system_sga_mem
+	if global.XginiConfigMap["system_sga_mem"] == "" {
+		setXgMem(memorySize, "system_sga_mem", 0.1, 0.1, 0.1, 0.05)
+	}
+}
+
+// 上传文件到目标服务器
+func UploadFileOrDir(serverNodeId string, serverNodeConfig models.ServerNodeConfig) {
+	//传送文件
+	//检测上传为文件还是文件夹
+	ret, _ := utils.IsFileOrFolder(serverNodeConfig.LocalFile)
+	switch ret {
+	case "file":
+		err := remote.UploadFile(&serverNodeConfig, serverNodeConfig.LocalFile, serverNodeConfig.TargetFile)
+		if err != nil {
+			global.Logs.Fatalf("%s节点上传文件失败: %s\n", serverNodeId, err)
+			return
+		}
+		global.Logs.Printf("%s节点上传文件成功\n", serverNodeId)
+
+	case "folder":
+		// 连接到远程主机
+		client, err := ssh.Dial("tcp", serverNodeConfig.IpPort, serverNodeConfig.SSHClient)
+		if err != nil {
+			panic(err)
+		}
+		defer client.Close()
+		// 检测远端文件夹是否存在,不存在则创建 [ ! -d "/DATA2/GT/test" ] && mkdir -p /DATA2/GT/test
+		remote.SingleCmd(&serverNodeConfig, fmt.Sprintf(`[ ! -d "%s" ] && mkdir -p %s`, serverNodeConfig.TargetFile, serverNodeConfig.TargetFile))
+		// 上传文件夹
+		err = remote.UploadDir(&serverNodeConfig, serverNodeConfig.LocalFile, serverNodeConfig.TargetFile)
+		if err != nil {
+			panic(err)
+		}
+		global.Logs.Printf("%s节点上传文件成功\n", serverNodeId)
+
+	}
+
+}
+
+// 打印节点基础环境
+func PrintServerNodeEnv(nodeTemp *models.ServerNodeConfig) {
+
+	printFieldNames := func(i interface{}) {
+		t := reflect.TypeOf(i)
+		if t.Kind() == reflect.Ptr {
+			t = t.Elem()
+		}
+
+		for i := 0; i < t.NumField(); i++ {
+			field := t.Field(i)
+			//fmt.Println("Field Name:", field.Name)
+			selectNodeEnvInfo(nodeTemp.SysInfo, field.Name)
+		}
+		for i := 0; i < t.NumField(); i++ {
+			field := t.Field(i)
+			//fmt.Println("Field Name:", field.Name)
+			selectNodeEnvInfo(nodeTemp.AppInfo, field.Name)
+		}
+
+	}
+
+	//fmt.Printf("节点%s : %s\n", nodeTemp.NodeId, nodeTemp.SysInfo)
+	global.Logs.Printf("--------------------%s节点--------------------------------------:\n", nodeTemp.NodeId)
+	// 使用反射打印字段
+	printFieldNames(nodeTemp.SysInfo)
+	printFieldNames(nodeTemp.AppInfo)
+	global.Logs.Printf("--------------------------------------------------------------:\n")
+}
+
+func selectNodeEnvInfo(target interface{}, key string) {
+
+	switch t := target.(type) {
+	case *models.SysInfo:
+		switch key {
+		case "OsStackSize":
+			global.Logs.Printf("系统环境Stack size :%s\n", t.OsStackSize)
+		case "OsOpenFiles":
+			global.Logs.Printf("系统环境Open files :%s\n", t.OsOpenFiles)
+		case "CoreWmemDefault":
+			global.Logs.Printf("系统环境Wmem Default :%s\n", t.CoreWmemDefault)
+		case "CoreRmemDefault":
+			global.Logs.Printf("系统环境Rmem Default :%s\n", t.CoreRmemDefault)
+		case "CoreWmemMax":
+			global.Logs.Printf("系统环境Wmem Max :%s\n", t.CoreWmemMax)
+
+		}
+	case *models.AppInfo:
+		// 根据key设置对应字段的值
+		switch key {
+		case "Gcc":
+			global.Logs.Printf("基础包 GCC :%s\n", t.Gcc)
+		case "Libaio":
+			global.Logs.Printf("基础包 Libaio :%s\n", t.Libaio)
+		case "Snmpd":
+			global.Logs.Printf("基础包 Snmpd :%s\n", t.Snmpd)
+		case "Ntpd":
+			global.Logs.Printf("基础包 Ntpd :%s\n", t.Ntpd)
+
+		}
+	}
+
+}

+ 252 - 0
internal/config/cluster.go

@@ -0,0 +1,252 @@
+package config
+
+import (
+	"bufio"
+	"bytes"
+	"fmt"
+	"os"
+	"strings"
+	"xg_auto_deploy/internal/models"
+)
+
+//var ClusterConfig1 models.ClusterConfig
+
+func GetClusterConfig(path string) (*models.ClusterConfig, error) {
+	clusterConfig := models.ClusterConfig{}
+	firstPart, secondPart, err := splitFileByNID(path)
+	if err != nil {
+		fmt.Println("GetClusterConfig Error:", err)
+		return &clusterConfig, err
+	}
+
+	SetClusterConfig(firstPart, secondPart, &clusterConfig)
+	return &clusterConfig, nil
+}
+
+// 切分cluster文件 NID上下部分
+func splitFileByNID(filename string) (string, string, error) {
+	file, err := os.Open(filename)
+	if err != nil {
+		return "", "", err
+	}
+	defer file.Close()
+
+	scanner := bufio.NewScanner(file)
+
+	var firstPart, secondPart string
+	foundNID := false
+	for scanner.Scan() {
+		line := scanner.Text()
+		if !foundNID {
+			if strings.Contains(line, "NID") && (strings.Index(line, "NID") == 0 || line[strings.Index(line, "NID")-1] == ' ') {
+				foundNID = true
+			} else {
+				firstPart += line + "\n"
+			}
+		}
+		if foundNID {
+			secondPart += line + "\n"
+		}
+	}
+
+	if err := scanner.Err(); err != nil {
+		return "", "", err
+	}
+
+	return firstPart, secondPart, nil
+}
+
+// 根据cluster文件 NID 上下部分分别设置ClusterConfig的各个字段
+func SetClusterConfig(firstPart string, secondPart string, clusterConfig *models.ClusterConfig) {
+	var clusterfirstPart models.ClusterfirstPart
+	// 按空格分割字符串
+	parts := strings.Split(firstPart, " ")
+
+	// 遍历分割后的部分
+	for _, part := range parts {
+		// 寻找等号的下标
+		eqIndex := strings.Index(part, "=")
+		if eqIndex == -1 {
+			continue
+		}
+
+		// 获取key和value
+		key := part[:eqIndex]
+		value := part[eqIndex+1:]
+		setFieldValue(&clusterfirstPart, key, value)
+
+	}
+
+	clusterConfig.FirstPart = clusterfirstPart
+	// 按行分割字符串
+	lines := strings.Split(secondPart, "\n")
+	// 遍历每一行
+	for _, line := range lines {
+		// 去除末尾的分号和空格
+		line = strings.TrimSpace(strings.TrimSuffix(line, ";"))
+		// 如果行为空,则停止读取
+		if line == "" {
+			break
+		}
+
+		// 按空格分割行
+		parts := strings.Split(line, " ")
+
+		node := models.ClustersecondPart{}
+
+		// 遍历分割后的部分
+		for _, part := range parts {
+			// 寻找等号的下标
+			eqIndex := strings.Index(part, "=")
+			if eqIndex == -1 {
+				continue
+			}
+
+			// 获取key和value
+			key := part[:eqIndex]
+			value := part[eqIndex+1:]
+			setFieldValue(&node, key, value)
+
+		}
+		clusterConfig.SecondParts = append(clusterConfig.SecondParts, node)
+
+	}
+
+}
+
+// 设置字段的值
+func setFieldValue(target interface{}, key string, value string) {
+
+	switch t := target.(type) {
+	case *models.ClusterfirstPart:
+		switch key {
+		case "#MAX_NODES":
+			t.MaxNodes = value
+		case "MASTER_GRPS":
+			t.MasterGrps = value
+		case "PROTOCOL":
+			t.Protocol = strings.Trim(value, "'")
+		case "MSG_PORT_NUM":
+			t.MsgPortNum = value
+		case "MAX_SEND_WIN":
+			t.MaxSendWin = value
+		case "MSG_HAVE_CRC":
+			t.MsgHaveCRC = value
+		case "MERGE_SMALL_MSG":
+			t.MergeSmallMsg = value
+		case "MSG_SIZE":
+			t.MsgSize = value
+		case "TIMEOUT":
+			t.Timeout = value
+		case "RPC_WINDOW":
+			t.RPCWindow = value
+		case "EJE_WINDOW":
+			t.EJEWindow = value
+		case "MAX_SHAKE_TIME":
+			t.MaxShakeTime = value
+		case "MY_NID":
+			t.MyNID = value
+		case "CHECK_RACK":
+			t.CheckRack = value
+		}
+	case *models.ClustersecondPart:
+		// 根据key设置对应字段的值
+		switch key {
+		case "NID":
+			t.NID = value
+		case "RACK":
+			t.RACK = value
+		case "PORTS":
+			t.PORTS = value
+		case "ROLE":
+			t.ROLE = value
+		case "LPU":
+			t.LPU = value
+		case "STORE_WEIGHT":
+			t.StoreWeight = value
+		case "STATE":
+			t.STATE = value
+		}
+	}
+
+}
+
+func SaveClusterConfigBuffer(clusterConfig *models.ClusterConfig, MyNID string) *bytes.Buffer {
+
+	str := fmt.Sprintf(`#MAX_NODES=%s MASTER_GRPS=%s  PROTOCOL='%s'  MSG_PORT_NUM=%s  MAX_SEND_WIN=%s
+MSG_HAVE_CRC=%s MERGE_SMALL_MSG=%s MSG_SIZE=%s  TIMEOUT=%s  RPC_WINDOW=%s
+EJE_WINDOW=%s  MAX_SHAKE_TIME=%s MY_NID=%s  CHECK_RACK=%s 
+`, clusterConfig.FirstPart.MaxNodes, clusterConfig.FirstPart.MasterGrps,
+		clusterConfig.FirstPart.Protocol, clusterConfig.FirstPart.MsgPortNum, clusterConfig.FirstPart.MaxSendWin,
+		clusterConfig.FirstPart.MsgHaveCRC, clusterConfig.FirstPart.MergeSmallMsg, clusterConfig.FirstPart.MsgSize,
+		clusterConfig.FirstPart.Timeout, clusterConfig.FirstPart.RPCWindow, clusterConfig.FirstPart.EJEWindow,
+		clusterConfig.FirstPart.MaxShakeTime, MyNID, clusterConfig.FirstPart.CheckRack)
+
+	for _, v := range clusterConfig.SecondParts {
+		str += fmt.Sprintf(`NID=%s  RACK=%s  PORTS=%s  ROLE=%s  LPU=%s  STORE_WEIGHT=%s  STATE=%s;
+`, v.NID, v.RACK, v.PORTS, v.ROLE, v.LPU, v.StoreWeight, v.STATE)
+	}
+	buffer := bytes.NewBufferString(str)
+
+	//fmt.Println("File created successfully.")
+	return buffer
+}
+
+// func SaveClusterConfig(clusterConfig *models.ClusterConfig, MyNID string) string {
+
+// 	str := fmt.Sprintf(`#MAX_NODES=%s MASTER_GRPS=%s  PROTOCOL='%s'  MSG_PORT_NUM=%s  MAX_SEND_WIN=%s
+// MSG_HAVE_CRC=%s MERGE_SMALL_MSG=%s MSG_SIZE=%s  TIMEOUT=%s  RPC_WINDOW=%s
+// EJE_WINDOW=%s  MAX_SHAKE_TIME=%s MY_NID=%s  CHECK_RACK=%s
+// `, clusterConfig.MaxNodes, clusterConfig.MasterGrps,
+// 		clusterConfig.Protocol, clusterConfig.MsgPortNum, clusterConfig.MaxSendWin,
+// 		clusterConfig.MsgHaveCRC, clusterConfig.MergeSmallMsg, clusterConfig.MsgSize,
+// 		clusterConfig.Timeout, clusterConfig.RPCWindow, clusterConfig.EJEWindow,
+// 		clusterConfig.MaxShakeTime, MyNID, clusterConfig.CheckRack)
+
+// 	for _, v := range clusterConfig.Nodes {
+// 		str += fmt.Sprintf(`NID=%s  RACK=%s  PORTS='%s'  ROLE='%s'  LPU=%s  STORE_WEIGHT=%s  STATE=%s;
+// `, v.NID, v.RACK, v.PORTS, v.ROLE, v.LPU, v.StoreWeight, v.STATE)
+// 	}
+
+// 	// 生成随机数种子
+// 	rand.Seed(time.Now().UnixNano())
+
+// 	// 生成随机值作为后缀
+// 	randomValue := rand.Intn(10000)
+
+// 	// 检查目录是否存在
+// 	_, err := os.Stat("file")
+// 	if err != nil {
+// 		if os.IsNotExist(err) {
+// 			// 创建目录
+// 			err = os.MkdirAll("file", os.ModePerm)
+// 			if err != nil {
+// 				fmt.Println("Error creating folder:", err)
+// 				os.Exit(0)
+// 			}
+// 			fmt.Printf("Folder '%s' created successfully.\n", "logs")
+// 			os.Exit(0)
+// 		} else {
+// 			fmt.Println("Error checking folder:", err)
+// 			os.Exit(0)
+// 		}
+// 	}
+// 	foldername := ".clusterTemp"
+
+// 	// 构建带有随机值的文件名
+// 	foldername = fmt.Sprintf("./file/%s_%d", foldername, randomValue)
+// 	err = os.Mkdir(foldername, 0755)
+// 	if err != nil {
+// 		log.Fatal("无法创建文件夹:", err)
+// 		os.Exit(0)
+// 	}
+
+// 	filename := fmt.Sprintf("%s/cluster.ini", foldername)
+// 	err = os.WriteFile(filename, []byte(str), 0644)
+// 	if err != nil {
+// 		log.Fatal(err)
+// 	}
+
+// 	//fmt.Println("File created successfully.")
+// 	return filename
+// }

+ 139 - 0
internal/config/config.go

@@ -0,0 +1,139 @@
+package config
+
+import (
+	"fmt"
+	"log"
+	"xg_auto_deploy/internal/models"
+	"xg_auto_deploy/internal/utils"
+
+	"github.com/spf13/viper"
+)
+
+type configFile struct {
+	v              *viper.Viper
+	baseNodeConfig *models.ServerNodeInfo
+	subNodeConfig  map[string]*models.ServerNodeInfo
+	xginiMap       map[string]string
+	clusterMap     map[string]string
+}
+
+func InitNodeSetting(path string) *configFile {
+
+	config := configFile{
+		v:              viper.New(),
+		baseNodeConfig: &models.ServerNodeInfo{},
+		subNodeConfig:  make(map[string]*models.ServerNodeInfo),
+		xginiMap:       make(map[string]string),
+		clusterMap:     make(map[string]string),
+	}
+
+	config.openConfigFile(path)
+	config.parseConfigfile()
+	return &config
+}
+
+func (config *configFile) parseConfigfile() {
+	selectNodeConfig := func(key, value string, serverNodeTemp *models.ServerNodeInfo) {
+		switch key {
+		case "ip_port":
+			serverNodeTemp.IpPort = value
+		case "target_file":
+			serverNodeTemp.TargetFile = value
+		case "local_file":
+			serverNodeTemp.LocalFile = value
+		case "user_password":
+			r, l := utils.SplitColon(value)
+			serverNodeTemp.User = r
+			serverNodeTemp.Password = l
+		case "xugu_addr":
+			fmt.Printf("xugu_addr: %s\n", value)
+			serverNodeTemp.XuguAddr = value
+		}
+	}
+
+	//k,v读取出来的是父节点的参数
+	for key, value := range config.v.GetStringMapString("node") {
+		//读取的是[node]的子组[node.*]
+		subNodeConfigTempMap := config.v.GetStringMapString(fmt.Sprintf("node." + key))
+		if len(subNodeConfigTempMap) != 0 {
+			//子组[node.*]参数解析
+			serverNodeTemp := models.ServerNodeInfo{}
+			for k, v := range subNodeConfigTempMap {
+				selectNodeConfig(k, v, &serverNodeTemp)
+			}
+
+			//config.subNodeConfig[fmt.Sprintf("node."+key)] = &serverNodeTemp
+			config.subNodeConfig[key] = &serverNodeTemp
+
+		}
+		//基类节点的参数解析
+		selectNodeConfig(key, value, config.baseNodeConfig)
+	}
+	//检查子节点配置信息是否为空,为空则用基节点信息替换
+	for _, serverNodeTemp := range config.subNodeConfig {
+		checkServerNodeInfoIsEmpty(serverNodeTemp, config.baseNodeConfig)
+	}
+
+	//获取配置文件里的xugu
+	for key, value := range config.v.GetStringMapString("xugu") {
+		config.xginiMap[key] = value
+	}
+
+	//获取配置文件里的cluster
+	for key, value := range config.v.GetStringMapString("cluster") {
+		config.clusterMap[key] = value
+	}
+	//输出服务器节点配置信息
+	// fmt.Printf("config.baseNodeConfig: %v\n", config.baseNodeConfig)
+	// for k, v := range config.subNodeConfig {
+	// 	fmt.Printf("subNodeConfigK: %s,subNodeConfigV: %v \n", k, *v)
+	// }
+
+}
+
+func (config *configFile) openConfigFile(path string) {
+	//读取指定config.toml配置文件
+	config.v.SetConfigType("toml")
+	config.v.SetConfigFile(path)
+	if err := config.v.ReadInConfig(); err != nil {
+		log.Fatalf("读取配置文件失败: %v", err)
+	}
+}
+
+// 检查服务器节点配置信息是否为空,为空则用基节点信息替换
+func checkServerNodeInfoIsEmpty(nodeInfo *models.ServerNodeInfo, baseNodeInfo *models.ServerNodeInfo) {
+	isEmpty := func(s string) bool {
+		return len(s) == 0
+	}
+	// if isEmpty(nodeInfo.IpPort) {
+	// 	nodeInfo.IpPort = baseNodeInfo.IpPort
+	// }
+	if isEmpty(nodeInfo.LocalFile) {
+		nodeInfo.LocalFile = baseNodeInfo.LocalFile
+	}
+	if isEmpty(nodeInfo.TargetFile) {
+		nodeInfo.TargetFile = baseNodeInfo.TargetFile
+	}
+	if isEmpty(nodeInfo.User) {
+		nodeInfo.User = baseNodeInfo.User
+	}
+	if isEmpty(nodeInfo.Password) {
+		nodeInfo.Password = baseNodeInfo.Password
+	}
+	if isEmpty(nodeInfo.XuguAddr) {
+		nodeInfo.XuguAddr = baseNodeInfo.XuguAddr
+	}
+
+}
+
+func (config *configFile) GetXuguini() map[string]string {
+	return config.xginiMap
+}
+
+func (config *configFile) GetCluster() map[string]string {
+	return config.clusterMap
+}
+
+func (config *configFile) GetNodeConfig() map[string]*models.ServerNodeInfo {
+	return config.subNodeConfig
+}

+ 51 - 0
internal/config/config_test.go

@@ -0,0 +1,51 @@
+package config
+
+import (
+	"bytes"
+	"fmt"
+	"io"
+	"os"
+	"path"
+	"runtime"
+	"testing"
+)
+
+func getCurrentPath() string {
+	_, filename, _, _ := runtime.Caller(1)
+
+	return path.Dir(filename)
+}
+
+func TestOpenFile(t *testing.T) {
+	fmt.Println(getCurrentPath())
+	config := configFile{}
+	config.openConfigFile(`C:\Program_GT\Code\Go\Work\xg_autodeploy\file\config.toml`)
+}
+
+func TestParseConfing(t *testing.T) {
+	InitNodeSetting(`C:\Program_GT\Code\Go\Work\xg_autodeploy\file\config.toml`)
+}
+
+func TestSetXuguini(t *testing.T) {
+	config := InitNodeSetting(`C:\Program_GT\Code\Go\Work\xg_autodeploy\file\config.toml`)
+	// 打开文件
+	file, err := os.Open(`C:\Program_GT\Code\Go\Work\xg_autodeploy\file\xugu.ini`)
+	if err != nil {
+		panic(err)
+	}
+	defer file.Close()
+
+	// 创建一个 bytes.Buffer
+	buf := new(bytes.Buffer)
+	// 将文件内容复制到 buf 中
+	if _, err := io.Copy(buf, file); err != nil {
+		panic(err)
+	}
+	SetXginiBuffer(buf, config.xginiMap)
+	err = os.WriteFile("output1.txt", buf.Bytes(), 0644)
+	if err != nil {
+		fmt.Println("Error writing file:", err)
+		return
+	}
+
+}

+ 168 - 0
internal/config/output1.txt

@@ -0,0 +1,168 @@
+#---------------------------------------------------------------
+# XuGu SQL Server 12.0.0
+#---------------------------------------------------------------
+
+#网络侦听设置
+    listen_port= 5120;
+    nio_timeout = 200;  网络读写超时(单位:秒)
+    login_timeout = 30;  登录超时时间(单位:秒)
+    use_std_nio = true;  是否使用标准网络监听器(标准监听使用select模型)
+    max_idle_time = 3600;  最大闲置时间(单位:秒,在此时间内若无请求,则断开连接,0表示无限制)
+    min_pass_len = 8;  口令的最短长度
+    pass_mode = 3;  口令模式 1:不重复字符或数字,2:字母+数字,3:字母+数字+符号
+    def_timezone = "GMT+08:00";  默认新建库和会话时区
+    def_timefmt = "YYYY-MM-DD HH24:MI:SS";  默认时间格式
+    def_charset = "GBK";  默认新建库和会话字符集
+    send_warning = true;  是否发送警告信息
+    conn_fail_cnt = 3;  禁止登陆的失败次数
+    max_act_conn_num = 0;  最大活动事务连接数(0表示无限制)
+    max_conn_num = 1024;  系统最大连接数(标准监听有效)
+    session_per_user = 1000;  默认用户可用连接数(0表示不限制)
+
+#系统并行度设置
+    thd_bind_mode = 0;  线程绑定cpu模式
+    task_thd_num = 16;  任务处理线程数
+    tcp_thd_num = 1;  TCP数据接收线程数
+    rsync_thd_num = 8;  远程同步处理线程数
+    rtran_thd_num = 8;  远程事务处理线程数
+    max_parallel = 1;  最大单任务并行度
+    cata_parti_num = 32;  目录分区数(建议设为CPU核数)
+    cata_hash_size = 8192;  系统对象目录速查Hash表尺度
+    lock_hash_size = 8192;  系统锁管理器Hash表尺度
+
+#系统缓冲区设置
+    data_buff_mem = 256;  数据缓冲区内存(单位:M)
+    swap_buff_mem = 64;  交换缓冲区内存(单位:M)
+    system_sga_mem = 128;  系统全局区内存(单位:M)
+    ena_share_sga = true;  是否允许缓冲区与SGA共享
+    xlog_buff_mem = 32;  事务日志缓冲区尺度(单位:M)
+    max_hash_size = 3000000;  最大Hash表槽数
+    max_hash_mem = 32;  允许单个hash节点使用的最大内存量(单位:M)
+    hash_parti_num = 16;  Hash运算在内存不够时转入分组处理的分组数
+    max_malloc_once = 512;  最大单次分配内存块大小(单位:M)
+    max_task_mem = 0;  任务线程运行最大内存(单位:M,0表示不限制)
+
+#SQL引擎设置
+    def_optimize_mode = 0;  默认优化模式(0:all rows,1:first rows,n:first n rows)
+    def_optimize_level = 3;  默认优化级别(预留暂未使用)
+    def_nulls_first = false;  默认排序时空值靠前(预留暂未使用)
+    max_prepare_num = 100;  最大prepared语句数
+    max_cursor_num = 100;  最大cursor数
+    prepare_reuse = true;  启用预处理重用
+    supple_prepare_sql = false;  补齐预处理定义语句
+    max_loop_num = 100000;  存储过程最大循环次数(0表示无限制)
+    proc_reuse_cnt = 1;  过程函数中SQL重用多少次后重解析规划(0表示不重解析)
+    delay_check_unique = false;  是否将唯一值检测延迟到事务结束时进行
+    str_trunc_warning = true;  字串超长时是否使用截断并告警
+    enable_lob_in_row = true;  是否允许将较小的大对象数据直接嵌入在行中(预留暂未使用)
+    def_empty_str_as_null = false;  是否默认将长度为0的字符串当作空值
+    auto_use_eje = false;  是否允许自动生成弹射式执行计划
+    auto_eje_cast = 10000;  自动生成弹射式执行计划的最小查询开销值(-1表示禁用并行执行)
+    auto_eje_parallel = 4;  自动生成弹射式执行计划的并行度参数
+    enable_eje_big_block = false;  是否允许弹射器堆扫描使用大块读策略
+    para_eje_seqscan_num = 2;  弹射器堆扫描器并行执行路数 
+    cata_case_sensitive = false;  系统字典大小写敏感
+    check_unique_mode = 2;  唯一值检测方式(1:不预检测 2:预检测)
+    ddl_timeout = 2000;  DDL操作加锁超时时间(ms)
+    tab_rebuild_limit = 10;  DDL表重整或复制行数限制(单位100万,0表示不限制)
+    use_index_order = false;  order by使用索引序
+    iscan_ini_cost = 200;  索引扫描初始化代价
+    seqscan_skip_err = false;  允许顺序扫描跳过847错误
+    enable_find_synonym = true;  允许查找同义词
+    support_global_tab = false;  是否支持全局临时表
+    idx_delay_del_limit = 0;  索引延迟删除量限制(不含唯一值索引,0表示不限制)
+    enable_sys_name_idx = false;  是否启用系统对象名索引(表名/视图名等)
+    enable_stream_import = false;  是否启用流导入功能
+    select_table_num = 12;  查询语句允许的最大表个数
+    def_index_row_length = 1024;  索引最大行长限制
+    week_mode = 0;  周数的计算模式(0-7)
+
+#存贮子系统参数
+    default_copy_num = 3;  存贮的默认版本个数
+    safely_copy_num = 2;  存贮的安全版本个数
+    enable_read_copy2 = false;  允许读存贮副本
+    max_hotspot_num = 256;  最大插入热点数
+    size_per_chunk = 8;  存储片大小(支持 1-64 单位:M)
+    block_size = 8192;  数据块大小
+    block_pctfree = 15;  默认新建表存储块空闲度百分比
+    init_data_space_num = 4;  初始化系统时数据表空间个数
+    init_temp_space_num = 2;  初始化系统时临时表空间个数
+    init_undo_space_num = 2;  初始化系统时回滚表空间个数
+    def_data_space_size = 256;  默认数据表空间的初始尺度(单位:M)
+    def_temp_space_size = 256;  默认临时表空间的初始尺度(单位:M)
+    def_undo_space_size = 256;  默认回滚表空间的初始尺度(单位:M)
+    def_redo_file_size = 500;  默认重做日志文件尺度(单位:M)
+    def_file_step_size = 64;  默认表空间文件的增长步长(单位:M)
+    max_temp_space_size = -1;  临时表空间的最大尺度(单位:M,-1表示不限制)
+    max_file_size = -1;  默认系统初始化数据和临时文件最大尺度(单位:M,-1表示不限制)
+    auto_extend_dfile = false;  是否允许自动扩展数据表空间文件
+    store_drop_delay = 16;  局部存贮的延迟删除时间(单位:分钟)
+    store_maint_span = 0;  存贮维护间隔时间(单位:ms,0表示不间隔)
+    enable_store_migrate = false;  是否允许自动迁移存储单元
+    ov_reuse = false;  是否允许OV存储重用
+    index_preload_cnt = 10000;  启用索引存储预加载最小个数(0表示不启用预加载)
+    data_file_append_mode = 0;  扩展文件大小时是否写实(0:写实,1:不写)
+    ioerr_report_mode = 1;  数据文件读写错时处理模式(0:block,1:space)
+
+#存贮子系统附属参数
+    datafile_use_aio = true;  是否启用异步文件IO
+    write_back_thd_num = 1;  磁盘回写线程数(同步IO有效,异步IO取固定值1)
+    max_write_back_num = 32;  脏块回写队列的最大深度
+    catalog_write_through = 2;  系统控制信息回写方式(1:立即保存 2:立即写通)
+    datafile_write_through = true;  是否要求OS对数据文件的更改立即写回磁盘
+    datafile_random_access = false;  数据文件是否以伪随机存取优化方式打开
+    redo_write_through = false;  重做日志文件是否写通方式打开
+    cache_undo_wrt = 1;  是否换缓存UNDO到REDO时写入(0:单独写,1:合并写,2:不写)
+    data_persistence = 0;  数据持久化策略
+    major_retry_num = 20;  重取主存储重试次数(50ms/次)
+    gstore_pick_mode = 1;  Gstore缓存访问并发控制模式(0:值比较,1:校验码,2:锁)
+    major_control_mode = 0;  存储主版本策略(0:轮转,1:固定到第一个存储节点)
+
+#事务子系统参数
+    strictly_commit = false;  事务日志必须写实
+    def_auto_commit = true;  事务默认为自动提交
+    def_iso_level = 1;  默认事务隔离级别(0:只读,1:读已提交,2:重复读,3:序列化)
+    max_trans_modify = 10000;  单个事务最大允许变更行数(0表示不限制)
+    dlock_check_delay = 3000;  死锁检测延迟时间(单位:ms)
+    checkpoint_delay = 15;  Checkpoint的延迟时间(单位:分钟)
+    exit_when_redo_err = true;  重做恢复失败时,系统是否退出
+    skip_boot_rollback = false;  跳过启动时回滚
+    undo_delay_free = 3000;  UNDO项延迟释放时间(单位:ms,0表示立即释放)
+    node_dead_delay = 30;  节点判死心跳次数(2秒/次)
+    enable_node_degrade = true;  是否启用节点降级
+
+#数据备份与同步复制
+    modify_log_parti_num = 8;  变更日志并行写通道数
+    modify_log_pice_len = 100;  变更日志文件分片大小(单位:M)
+    ignore_when_meta_err = 2;  变更日志元信息错误处理模式(0:抛错 1:返回NULL 2:不返回)
+    max_allow_lob_len = 10;  允许记载的最大大对象大小(单位:M)
+    log_archive_mode = 0;  重做日志归档模式(0:不归档,1:拷贝REDO,2:移动REDO)
+    log_supplement = false;  是否开启日志增补
+    enable_recycle = false;  是否启用表级回收站
+
+#系统运行(跟踪)日志参数
+    reg_command = false;  是否记录SQL命令
+    reg_ddl = false;  是否记录DDL命令
+    error_level = 3;  错误日志最低记载等级
+    errlog_size = 100;  错误日志分割长度(单位:M)
+    trace_login = true;  是否跟踪非法登录事件
+    core_dump = false;  是否在内存段错误时进行coredump
+    is_zh = false;  启用中文日志信息
+
+#安全审计参数
+    enable_audit = false;  是否允许审计
+    security_level = 0;  安全等级(0-2)
+
+#系统分析参数
+    enable_analyze = true;  是否启用定时分析功能
+    analyze_time = "02:00:00";  定时分析默认执行时间
+    analyze_threshold = 10;  默认统计分析触发阈值(1--100之间的整数)
+    analyze_mode = 1;  默认统计分析模式(1或2)
+    analyze_level = 2;  默认统计分析采样级别(1-6)
+    enable_monitor = 1;  监控信息统计设置标记位
+    debug_flag = 0;  数据库调试标记位
+
+#兼容性参数
+    def_identity_mode = 0;  自增列模式(1:NULL值自增; 2:0和NULL值自增)
+    def_group_by_mode = 0;  GROUPBY语句模式(0:标准模式; 1:MySQL方言写法)
+    def_compatible_mode = "NONE";  异构库兼容模式的默认值

+ 49 - 0
internal/config/set_xgini.go

@@ -0,0 +1,49 @@
+package config
+
+import (
+	"bufio"
+	"bytes"
+	"fmt"
+	"strings"
+)
+
+func SetXginiBuffer(configBuffer *bytes.Buffer, xginiMap map[string]string) {
+	tmpBuffer := new(bytes.Buffer)
+	writer := bufio.NewWriter(tmpBuffer)
+	scanner := bufio.NewScanner(configBuffer)
+
+	for scanner.Scan() {
+		line := scanner.Text()
+		for k, v := range xginiMap {
+			if strings.Contains(line, k) {
+				parts := strings.SplitN(line, "=", 2)
+				if len(parts) == 2 {
+					newLine := strings.TrimSpace(parts[0]) + "= " + v + ";"
+					line = fmt.Sprint("    " + newLine)
+					break // 停止继续处理该行
+				}
+			}
+		}
+		_, err := writer.WriteString(line + "\n")
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+	}
+
+	err := writer.Flush()
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	// 使用 tmpBuffer 中的内容更新 configBuffer
+	configBuffer.Reset()
+	_, err = configBuffer.ReadFrom(tmpBuffer)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	//fmt.Println("配置文件已成功更新。")
+}

+ 74 - 0
internal/global/global.go

@@ -0,0 +1,74 @@
+package global
+
+import (
+	"time"
+
+	"xg_auto_deploy/internal/config"
+	"xg_auto_deploy/internal/logger"
+	"xg_auto_deploy/internal/models"
+
+	"github.com/sirupsen/logrus"
+	"golang.org/x/crypto/ssh"
+)
+
+var ServerNodeConfigs = make(map[string]models.ServerNodeConfig)
+var XginiConfigMap map[string]string
+var ClusterConfigMap map[string]string
+var ClusterInfo = &models.ClusterConfig{}
+var Logs *logrus.Logger
+
+func InitNodeSetting() {
+	XginiConfigMap = make(map[string]string)
+	ClusterConfigMap = make(map[string]string)
+	Logs = logger.Init("./logs/xg_autodeploy.log", "info")
+	configTemp := config.InitNodeSetting(`C:\Program_GT\Code\Go\Work\xg_autodeploy\file\config.toml`)
+	//获取配置文件里的[xugu]组内容
+	XginiConfigMap = configTemp.GetXuguini()
+	ClusterConfigMap = configTemp.GetCluster()
+	//ClusterInfo = config.ReadXgClusterConfig(ClusterConfigMap["local_file"])
+	var err error
+	ClusterInfo, err = config.GetClusterConfig(ClusterConfigMap["local_file"])
+	if err != nil {
+		Logs.Fatalf("config.GetClusterConfig 失败")
+	}
+	for key, value := range configTemp.GetNodeConfig() {
+		//fmt.Println(key, value)
+		sysInfo := &models.SysInfo{
+			OsStackSize:     "未检测",
+			OsOpenFiles:     "未检测",
+			CoreWmemDefault: "未检测",
+			CoreRmemDefault: "未检测",
+			CoreRmemMax:     "未检测",
+			CoreWmemMax:     "未检测",
+		}
+		appInfo := &models.AppInfo{
+			Gcc:    "未检测",
+			Libaio: "未检测",
+			Snmpd:  "未检测",
+			Ntpd:   "未检测",
+		}
+
+		sshInfo := &models.SSHInfo{
+			SSHClient: &ssh.ClientConfig{
+				User: value.User,
+				Auth: []ssh.AuthMethod{
+					ssh.Password(value.Password),
+				},
+
+				// 设置其他字段
+				ClientVersion:   "",
+				Timeout:         10 * time.Second,
+				HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 不验证远程主机的身份,仅用于示例,请不要在生产环境中使用
+			},
+		}
+
+		nodeTemp := models.ServerNodeConfig{
+			NodeId:         key,
+			ServerNodeInfo: value,
+			SysInfo:        sysInfo,
+			AppInfo:        appInfo,
+			SSHInfo:        sshInfo,
+		}
+		ServerNodeConfigs[key] = nodeTemp
+	}
+}

+ 78 - 0
internal/logger/logs.go

@@ -0,0 +1,78 @@
+package logger
+
+import (
+	"io"
+	"log"
+	"os"
+
+	"github.com/sirupsen/logrus"
+)
+
+//var Logger *logrus.Logger
+
+type Hook struct {
+	Writer    io.Writer
+	Formatter logrus.Formatter
+	Level     []logrus.Level
+}
+
+func (h *Hook) Fire(entry *logrus.Entry) error {
+	line, err := h.Formatter.Format(entry)
+	if err != nil {
+		return err
+	}
+	h.Writer.Write(line)
+	return nil
+}
+
+func (h *Hook) Levels() []logrus.Level {
+	return h.Level
+}
+
+func newHook(writer io.Writer, formatter logrus.Formatter, level logrus.Level) *Hook {
+	var levels []logrus.Level
+	for _, l := range logrus.AllLevels {
+		if l <= level {
+			levels = append(levels, l)
+		}
+	}
+	return &Hook{
+		Writer:    writer,
+		Formatter: formatter,
+		Level:     levels,
+	}
+}
+
+func Init(logFilePath string, logLevelStr string) *logrus.Logger {
+	var Logger *logrus.Logger
+	logLevel, err := logrus.ParseLevel(logLevelStr)
+	if err != nil {
+		logLevel = logrus.InfoLevel
+		log.Printf("Invalid log level: %s. Defaulting to info", logLevelStr)
+	}
+
+	Logger = logrus.New()
+	Logger.SetOutput(io.Discard)
+
+	logFile, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
+	if err != nil {
+		log.Printf("Failed to open log file: %s", logFilePath)
+		panic(err)
+	}
+
+	Logger.AddHook(newHook(
+		logFile,
+		&logrus.JSONFormatter{},
+		logLevel,
+	))
+
+	Logger.AddHook(newHook(
+		os.Stderr,
+		&logrus.TextFormatter{
+			FullTimestamp: true,
+			ForceColors:   true,
+		},
+		logLevel,
+	))
+	return Logger
+}

+ 2 - 0
internal/logger/logs/log.txt

@@ -0,0 +1,2 @@
+{"level":"info","msg":"Hello World","time":"2024-04-26T09:27:47+08:00"}
+{"level":"info","msg":"Hello World","time":"2024-04-26T09:31:41+08:00"}

+ 10 - 0
internal/logger/logs_test.go

@@ -0,0 +1,10 @@
+package logger
+
+import (
+	"testing"
+)
+
+func TestLogs(t *testing.T) {
+	Logger := Init("./logs/log.txt", "info")
+	Logger.Println("Hello World")
+}

+ 31 - 0
internal/models/cluster.go

@@ -0,0 +1,31 @@
+package models
+
+type ClusterConfig struct {
+	FirstPart   ClusterfirstPart
+	SecondParts []ClustersecondPart
+}
+type ClusterfirstPart struct {
+	MaxNodes      string
+	MasterGrps    string
+	Protocol      string
+	MsgPortNum    string
+	MaxSendWin    string
+	MsgHaveCRC    string
+	MergeSmallMsg string
+	MsgSize       string
+	Timeout       string
+	RPCWindow     string
+	EJEWindow     string
+	MaxShakeTime  string
+	MyNID         string
+	CheckRack     string
+}
+type ClustersecondPart struct {
+	NID         string
+	RACK        string
+	PORTS       string
+	ROLE        string
+	LPU         string
+	StoreWeight string
+	STATE       string
+}

+ 40 - 0
internal/models/server_node.go

@@ -0,0 +1,40 @@
+package models
+
+import "golang.org/x/crypto/ssh"
+
+type ServerNodeConfig struct {
+	NodeId string
+	*ServerNodeInfo
+	*SSHInfo
+	*AppInfo
+	*SysInfo
+}
+
+type ServerNodeInfo struct {
+	IpPort     string
+	LocalFile  string
+	TargetFile string
+	User       string
+	Password   string
+	XuguAddr   string
+}
+
+type SSHInfo struct {
+	SSHClient *ssh.ClientConfig
+}
+
+type AppInfo struct {
+	Gcc    string
+	Libaio string
+	Snmpd  string
+	Ntpd   string
+}
+
+type SysInfo struct {
+	OsStackSize     string
+	OsOpenFiles     string
+	CoreWmemDefault string
+	CoreRmemDefault string
+	CoreRmemMax     string
+	CoreWmemMax     string
+}

+ 45 - 0
internal/remote/download.go

@@ -0,0 +1,45 @@
+package remote
+
+import (
+	"bytes"
+	"io"
+	"xg_auto_deploy/internal/global"
+	"xg_auto_deploy/internal/models"
+
+	"github.com/pkg/sftp"
+	"golang.org/x/crypto/ssh"
+)
+
+func DownloadFileBuffer(nodeConfig *models.ServerNodeConfig, targetFile string) *bytes.Buffer {
+	// 1. 建立 ssh client
+
+	client, err := ssh.Dial("tcp", nodeConfig.IpPort, nodeConfig.SSHClient)
+	if err != nil {
+		global.Logs.Fatal("DownloadFailed to dial: ", err)
+	}
+	defer client.Close()
+
+	// 2. 基于ssh client, 创建 sftp 客户端
+	sftpClient, err := sftp.NewClient(client)
+	if err != nil {
+		global.Logs.Fatal("Download Failed to init sftp client: ", err)
+	}
+	defer sftpClient.Close()
+
+	// 3. 打开远程服务器文件
+	//filename := time.Now().Format("2006-01-02") + ".global.Log"
+	source, err := sftpClient.Open(targetFile)
+	if err != nil {
+		global.Logs.Fatal("Download Failed to open remote file: ", err)
+	}
+	defer source.Close()
+
+	// 读取文件内容到内存
+	buf := new(bytes.Buffer)
+	_, err = io.Copy(buf, source)
+	if err != nil {
+		global.Logs.Fatal("Download Failed to read file: ", err)
+	}
+	//fmt.Println("buf: ", buf)
+	return buf
+}

+ 43 - 0
internal/remote/remote.go

@@ -0,0 +1,43 @@
+package remote
+
+import (
+	"bytes"
+	"errors"
+	"os"
+	"xg_auto_deploy/internal/global"
+	"xg_auto_deploy/internal/models"
+
+	"golang.org/x/crypto/ssh"
+)
+
+func SingleCmd(nodeConfig *models.ServerNodeConfig, cmd string) (string, error) {
+
+	// 作为客户端连接SSH服务器
+	client, err := ssh.Dial("tcp", nodeConfig.IpPort, nodeConfig.SSHClient)
+	if err != nil {
+		global.Logs.Fatal("ssh服务器失败 (Failed to dial): ", err)
+		os.Exit(0)
+	}
+	defer client.Close()
+
+	// 创建会话
+	session, err := client.NewSession()
+	if err != nil {
+		global.Logs.Fatal("Failed to create session: ", err)
+		os.Exit(0)
+	}
+	defer session.Close()
+
+	// 设置会话标准输出,运行命令
+	var b bytes.Buffer
+	session.Stdout = &b
+	//global.Log.Info("执行命令:", cmd)
+	if err := session.Run(cmd); err != nil {
+		// log.Errorf("Failed to run: " + cmd)
+		// log.Errorf("命令运行失败: %s", err)
+		return b.String(), errors.New("命令发送失败 (failed to run)")
+	}
+
+	//fmt.Println(b.String())
+	return b.String(), nil
+}

+ 74 - 0
internal/remote/remote_test.go

@@ -0,0 +1,74 @@
+package remote
+
+import (
+	"bytes"
+	"fmt"
+	"io"
+	"os"
+	"testing"
+	"xg_auto_deploy/internal/models"
+
+	"golang.org/x/crypto/ssh"
+)
+
+var GlobalServerNodeConfigTest = models.ServerNodeConfig{
+	ServerNodeInfo: &models.ServerNodeInfo{
+		IpPort:     "172.23.6.92:22",
+		LocalFile:  `C:\Program_GT\Code\Go\Work\xg_autodeploy\file`,
+		TargetFile: "/home/gtong/testf/",
+		User:       "your_user",
+		Password:   "your_password",
+		XuguAddr:   "your_xugu_addr",
+	},
+	SSHInfo: &models.SSHInfo{
+		SSHClient: &ssh.ClientConfig{
+			User: "gtong",
+			Auth: []ssh.AuthMethod{
+				ssh.Password("845895"),
+			},
+			// 设置其他字段
+			HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 不验证远程主机的身份,仅用于示例,请不要在生产环境中使用
+		},
+	},
+	AppInfo: &models.AppInfo{
+		Gcc:    "your_gcc",
+		Libaio: "your_libaio",
+		Snmpd:  "your_snmpd",
+		Ntpd:   "your_ntpd",
+	},
+}
+
+func TestUploadFile(t *testing.T) {
+	file, err := os.Open(`C:\Program_GT\Code\Go\Work\xg_autodeploy\file\config.toml`)
+	if err != nil {
+		fmt.Println("Error opening file:", err)
+		return
+	}
+	defer file.Close() // 确保在函数退出时关闭文件
+	var buf bytes.Buffer
+
+	// 将文件内容复制到 buf 中
+	_, err = io.Copy(&buf, file)
+	if err != nil {
+		fmt.Println("Error reading file:", err)
+		return
+	}
+
+	UploadFileBuffer(&GlobalServerNodeConfigTest, &buf, "/home/gtong/testf/")
+}
+
+func TestUploadFiles(t *testing.T) {
+	// 连接到远程主机
+	client, err := ssh.Dial("tcp", "172.23.6.92:22", GlobalServerNodeConfigTest.SSHInfo.SSHClient)
+	if err != nil {
+		panic(err)
+	}
+	defer client.Close()
+	SingleCmd(&GlobalServerNodeConfigTest, fmt.Sprintf(`[ ! -d "%s" ] && mkdir -p %s`, GlobalServerNodeConfigTest.TargetFile, GlobalServerNodeConfigTest.TargetFile))
+
+	// 递归上传文件夹内容
+	if err := UploadDir(&GlobalServerNodeConfigTest, GlobalServerNodeConfigTest.LocalFile, GlobalServerNodeConfigTest.TargetFile); err != nil {
+		panic(err)
+	}
+
+}

+ 215 - 0
internal/remote/upload.go

@@ -0,0 +1,215 @@
+package remote
+
+import (
+	"bytes"
+	"errors"
+	"fmt"
+	"io"
+	"os"
+	"path"
+	"strings"
+	"xg_auto_deploy/internal/global"
+	"xg_auto_deploy/internal/models"
+
+	"github.com/pkg/sftp"
+	"golang.org/x/crypto/ssh"
+)
+
+// 字节的单位转换 保留两位小数
+func formatFileSize(s int64) (size string) {
+	if s < 1024 {
+		return fmt.Sprintf("%.2fB", float64(s)/float64(1))
+	} else if s < (1024 * 1024) {
+		return fmt.Sprintf("%.2fKB", float64(s)/float64(1024))
+	} else if s < (1024 * 1024 * 1024) {
+		return fmt.Sprintf("%.2fMB", float64(s)/float64(1024*1024))
+	} else if s < (1024 * 1024 * 1024 * 1024) {
+		return fmt.Sprintf("%.2fGB", float64(s)/float64(1024*1024*1024))
+	} else if s < (1024 * 1024 * 1024 * 1024 * 1024) {
+		return fmt.Sprintf("%.2fTB", float64(s)/float64(1024*1024*1024*1024))
+	} else { //if s < (1024 * 1024 * 1024 * 1024 * 1024 * 1024)
+		return fmt.Sprintf("%.2fEB", float64(s)/float64(1024*1024*1024*1024*1024))
+	}
+}
+
+func UploadFile(nodeConfig *models.ServerNodeConfig, localFilePath string, targetFile string) error {
+	// 1. 建立 ssh client
+	client, err := ssh.Dial("tcp", nodeConfig.IpPort, nodeConfig.SSHClient)
+	if err != nil {
+		global.Logs.Fatal("ssh连接建立失败: ", err)
+		return err
+	}
+	defer client.Close()
+
+	// 2. 基于 ssh client 创建 sftp 客户端
+	sftpClient, err := sftp.NewClient(client)
+	if err != nil {
+		//	global.Log.Fatal("Failed to init sftp client: ", err)
+		global.Logs.Fatal("sftp建立失败: ", err)
+		return err
+	}
+	defer sftpClient.Close()
+
+	// 3. 打开本地文件
+	//取文件名字
+	var remoteFileName string
+	index := strings.LastIndex(localFilePath, "/")
+	if index != -1 && index < len(localFilePath)-1 {
+		remoteFileName = localFilePath[index+1:]
+	} else {
+		global.Logs.Fatal("获取文件名字失败无效")
+		return fmt.Errorf("获取文件名字失败无效")
+	}
+
+	localFileName := localFilePath
+	localFile, err := os.Open(localFileName)
+	if err != nil {
+		//global.Log.Fatal("Failed to open local file: ", err)
+		global.Logs.Fatal("打开文件失败,", err)
+		return err
+	}
+	defer localFile.Close()
+
+	// 4. 创建远程服务器文件
+	// 检测远端文件夹是否存在,不存在则创建 [ ! -d "/DATA2/GT/test" ] && mkdir -p /DATA2/GT/test
+	SingleCmd(nodeConfig, fmt.Sprintf(`[ ! -d "%s" ] && mkdir -p %s`, targetFile, targetFile))
+	//sftpClient.Mkdir(remotePath)
+	target, err := sftpClient.Create(targetFile + "/" + remoteFileName)
+	if err != nil {
+		global.Logs.Fatal("创建远端文件失败 ", err)
+		return err
+	}
+	defer target.Close()
+
+	// 5. 数据复制
+	n, err := io.Copy(target, localFile)
+	if err != nil {
+		global.Logs.Fatal("文件传输失败 ", err)
+		return err
+	}
+
+	//获取本地文件大小
+	localFileInfo, err := os.Stat(localFileName)
+	if err != nil {
+		global.Logs.Fatal("获取本地文件大小失败 ", err)
+		return err
+	}
+
+	global.Logs.Printf("文件上传成功[文件%s 已上传到 %s%s]本地文件大小:%s,上传文件大小:%s", localFileName, targetFile, remoteFileName, formatFileSize(localFileInfo.Size()), formatFileSize(n))
+
+	return nil
+}
+
+// 上传文件buffer到目标端
+func UploadFileBuffer(nodeConfig *models.ServerNodeConfig, localBuffer *bytes.Buffer, targetFile string) error {
+	// 1. 建立 ssh client
+	client, err := ssh.Dial("tcp", nodeConfig.IpPort, nodeConfig.SSHClient)
+	if err != nil {
+		global.Logs.Fatal("Failed to dial: ", err)
+		return errors.New("连接服务器失败 (Failed to dial)")
+	}
+	defer client.Close()
+
+	// 2. 基于 ssh client 创建 sftp 客户端
+	sftpClient, err := sftp.NewClient(client)
+	if err != nil {
+		global.Logs.Fatal("Failed to init sftp client: ", err)
+		return errors.New(" 创建 sftp 客户端失败 (Failed to init sftp client)")
+	}
+	defer sftpClient.Close()
+
+	// 4. 创建远程服务器文件
+	target, err := sftpClient.Create(targetFile)
+	if err != nil {
+		global.Logs.Fatal("Failed to create remote file: ", err)
+		return errors.New("  创建远程服务器文件失败 (Failed to create remote file)")
+	}
+	defer target.Close()
+
+	// 5. 数据复制File created successfully.
+	_, err = io.Copy(target, localBuffer)
+	if err != nil {
+		global.Logs.Fatal("Failed to copy file: ", err)
+	}
+	return nil
+}
+
+// 递归上传文件夹内容
+func UploadDir(nodeConfig *models.ServerNodeConfig, localPath, remotePath string) error {
+	// 1. 建立 ssh client
+	client, err := ssh.Dial("tcp", nodeConfig.IpPort, nodeConfig.SSHClient)
+	if err != nil {
+		global.Logs.Fatal("文件上传ssh连接建立失败: ", err)
+		return err
+	}
+	defer client.Close()
+	// 2. 基于 ssh client 创建 sftp 客户端
+	sftpClient, err := sftp.NewClient(client)
+	if err != nil {
+		global.Logs.Fatal("sftp建立失败: ", err)
+		return err
+	}
+	defer sftpClient.Close()
+
+	var dirfunc func(nodeConfig *models.ServerNodeConfig, localPath, remotePath string, localFiles []os.DirEntry) error
+
+	dirfunc = func(nodeConfig *models.ServerNodeConfig, localPath, remotePath string, localFiles []os.DirEntry) error {
+		for _, file := range localFiles {
+			localFilePath := path.Join(localPath, file.Name())
+			remoteFilePath := path.Join(remotePath, file.Name())
+
+			if file.IsDir() {
+				subLocalFiles, err := os.ReadDir(localFilePath)
+				if err != nil {
+					return err
+				}
+				//_, err = SingleCmd(nodeConfig, fmt.Sprintf(`[ ! -d "%s" ] `, remoteFilePath))
+
+				err = sftpClient.Mkdir(remoteFilePath)
+				if err != nil {
+					global.Logs.Fatal("创建文件夹失败 ( 查看目标端目录文件夹是否已存在 ): ", err)
+					return err
+				}
+
+				err = dirfunc(nodeConfig, localFilePath, remoteFilePath, subLocalFiles)
+				if err != nil {
+					return err
+				}
+
+			} else {
+
+				srcFile, err := os.Open(localFilePath)
+				if err != nil {
+					global.Logs.Fatal("打开文件失败,", err)
+					return err
+				}
+				defer srcFile.Close()
+
+				dstFile, err := sftpClient.Create(remoteFilePath)
+				if err != nil {
+					return err
+				}
+				defer dstFile.Close()
+
+				_, err = io.Copy(dstFile, srcFile)
+				if err != nil {
+					global.Logs.Fatal("文件传输失败 ", err)
+					return err
+				}
+			}
+		}
+		return nil
+	}
+
+	localFiles, err := os.ReadDir(localPath)
+	if err != nil {
+		return err
+	}
+
+	err = dirfunc(nodeConfig, localPath, remotePath, localFiles)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}

+ 40 - 0
internal/utils/utils.go

@@ -0,0 +1,40 @@
+package utils
+
+import (
+	"fmt"
+	"os"
+	"strings"
+)
+
+// 切分 :冒号前面和后面的字符串
+func SplitColon(str string) (string, string) {
+	index := strings.Index(str, ":")
+	var front, rear string
+	if index != -1 {
+		front = str[:index]
+
+		rear = str[index+1:]
+
+	} else {
+		fmt.Println("Invalid input format")
+	}
+
+	return front, rear
+}
+
+func IsFileOrFolder(path string) (string, error) {
+
+	// 获取路径的信息
+	info, err := os.Stat(path)
+	if err != nil {
+		fmt.Println("Error getting file info:", err)
+		return "", fmt.Errorf("判断是否是文件夹失败 (Error getting file info)")
+	}
+
+	// 判断是文件还是文件夹
+	if info.IsDir() {
+		return "folder", nil
+	} else {
+		return "file", nil
+	}
+}

+ 208 - 0
logs/xg_autodeploy.log

@@ -0,0 +1,208 @@
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T10:14:02+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T10:14:04+08:00"}
+{"level":"info","msg":"1节点:\n","time":"2024-04-26T10:14:05+08:00"}
+{"level":"info","msg":"1节点\u0026{1 %!s(*models.ServerNodeInfo=\u0026{10.28.20.101:22 ./file/xugu /DATA2/GT/TestA/test2/xugu root Xugu@2023 /DATA2/GT/TestA/test2/xugu}) %!s(*models.SSHInfo=\u0026{0xc00010aea0}) %!s(*models.AppInfo=\u0026{未检测 未检测 未检测 未检测}) %!s(*models.SysInfo=\u0026{已配置 已配置 已配置 已配置 已配置 已配置})}:\n","time":"2024-04-26T10:14:05+08:00"}
+{"level":"info","msg":"2节点:\n","time":"2024-04-26T10:14:05+08:00"}
+{"level":"info","msg":"2节点\u0026{2 %!s(*models.ServerNodeInfo=\u0026{10.28.20.102:22 ./file/xugu /DATA2/GT/TestA/test2/xugu root Xugu@2023 /DATA2/GT/TestA/test2/xugu}) %!s(*models.SSHInfo=\u0026{0xc00010af70}) %!s(*models.AppInfo=\u0026{未检测 未检测 未检测 未检测}) %!s(*models.SysInfo=\u0026{已配置 已配置 已配置 已配置 已配置 已配置})}:\n","time":"2024-04-26T10:14:05+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T10:32:43+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T10:32:45+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T10:42:38+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T10:42:41+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T10:44:04+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T10:44:06+08:00"}
+{"level":"info","msg":"2节点:\n","time":"2024-04-26T10:44:07+08:00"}
+{"level":"info","msg":"2节点\u0026{2 %!s(*models.ServerNodeInfo=\u0026{10.28.20.102:22 ./file/xugu /DATA2/GT/TestA/test2/xugu root Xugu@2023 /DATA2/GT/TestA/test2/xugu}) %!s(*models.SSHInfo=\u0026{0xc00001edd0}) %!s(*models.AppInfo=\u0026{未检测 未检测 未检测 未检测}) %!s(*models.SysInfo=\u0026{已配置 已配置 已配置 已配置 已配置 已配置})}:\n","time":"2024-04-26T10:44:07+08:00"}
+{"level":"info","msg":"1节点:\n","time":"2024-04-26T10:44:07+08:00"}
+{"level":"info","msg":"1节点\u0026{1 %!s(*models.ServerNodeInfo=\u0026{10.28.20.101:22 ./file/xugu /DATA2/GT/TestA/test2/xugu root Xugu@2023 /DATA2/GT/TestA/test2/xugu}) %!s(*models.SSHInfo=\u0026{0xc00001eea0}) %!s(*models.AppInfo=\u0026{未检测 未检测 未检测 未检测}) %!s(*models.SysInfo=\u0026{已配置 已配置 已配置 已配置 已配置 已配置})}:\n","time":"2024-04-26T10:44:07+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T10:44:30+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T10:44:33+08:00"}
+{"level":"info","msg":"1节点:\n","time":"2024-04-26T10:44:34+08:00"}
+{"level":"info","msg":"1节点\u0026{1 %!s(*models.ServerNodeInfo=\u0026{10.28.20.101:22 ./file/xugu /DATA2/GT/TestA/test2/xugu root Xugu@2023 /DATA2/GT/TestA/test2/xugu}) %!s(*models.SSHInfo=\u0026{0xc00001f040}) %!s(*models.AppInfo=\u0026{未检测 未检测 未检测 未检测}) %!s(*models.SysInfo=\u0026{已配置 已配置 已配置 已配置 已配置 已配置})}:\n","time":"2024-04-26T10:44:34+08:00"}
+{"level":"info","msg":"2节点:\n","time":"2024-04-26T10:44:34+08:00"}
+{"level":"info","msg":"2节点\u0026{2 %!s(*models.ServerNodeInfo=\u0026{10.28.20.102:22 ./file/xugu /DATA2/GT/TestA/test2/xugu root Xugu@2023 /DATA2/GT/TestA/test2/xugu}) %!s(*models.SSHInfo=\u0026{0xc00001ef70}) %!s(*models.AppInfo=\u0026{未检测 未检测 未检测 未检测}) %!s(*models.SysInfo=\u0026{已配置 已配置 已配置 已配置 已配置 已配置})}:\n","time":"2024-04-26T10:44:34+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T10:56:29+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T10:56:31+08:00"}
+{"level":"info","msg":"1节点:\n","time":"2024-04-26T10:56:32+08:00"}
+{"level":"info","msg":"1节点\u0026{1 %!s(*models.ServerNodeInfo=\u0026{10.28.20.101:22 ./file/xugu /DATA2/GT/TestA/test2/xugu root Xugu@2023 /DATA2/GT/TestA/test2/xugu}) %!s(*models.SSHInfo=\u0026{0xc00001eea0}) %!s(*models.AppInfo=\u0026{未检测 未检测 未检测 未检测}) %!s(*models.SysInfo=\u0026{已配置 已配置 已配置 已配置 已配置 已配置})}:\n","time":"2024-04-26T10:56:32+08:00"}
+{"level":"info","msg":"2节点:\n","time":"2024-04-26T10:56:32+08:00"}
+{"level":"info","msg":"2节点\u0026{2 %!s(*models.ServerNodeInfo=\u0026{10.28.20.102:22 ./file/xugu /DATA2/GT/TestA/test2/xugu root Xugu@2023 /DATA2/GT/TestA/test2/xugu}) %!s(*models.SSHInfo=\u0026{0xc00001edd0}) %!s(*models.AppInfo=\u0026{未检测 未检测 未检测 未检测}) %!s(*models.SysInfo=\u0026{已配置 已配置 已配置 已配置 已配置 已配置})}:\n","time":"2024-04-26T10:56:32+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T10:58:17+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T10:58:20+08:00"}
+{"level":"info","msg":"1节点:\n","time":"2024-04-26T10:58:21+08:00"}
+{"level":"info","msg":"2节点:\n","time":"2024-04-26T10:58:21+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T11:17:36+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T11:17:38+08:00"}
+{"level":"info","msg":"2节点:\n","time":"2024-04-26T11:17:39+08:00"}
+{"level":"info","msg":"1节点:\n","time":"2024-04-26T11:17:39+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T11:18:34+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T11:18:37+08:00"}
+{"level":"info","msg":"2节点:\n","time":"2024-04-26T11:18:38+08:00"}
+{"level":"info","msg":"1节点:\n","time":"2024-04-26T11:18:38+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T14:55:37+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T14:55:40+08:00"}
+{"level":"info","msg":"OsStackSize字段值为:string\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"OsOpenFiles字段值为:string\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"CoreWmemDefault字段值为:string\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"CoreRmemDefault字段值为:string\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"CoreWmemMax字段值为:string\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"1节点:\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"OsStackSize字段值为:string\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"OsOpenFiles字段值为:string\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"CoreWmemDefault字段值为:string\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"CoreRmemDefault字段值为:string\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"CoreWmemMax字段值为:string\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"2节点:\n","time":"2024-04-26T14:55:41+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:00:23+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:00:26+08:00"}
+{"level":"info","msg":"1节点:\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"系统Stack size 为:已配置\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"系统Open files 为:已配置\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"系统Wmem Default 为:已配置\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"系统Rmem Default 为:已配置\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"系统Wmem Max 为:已配置\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"2节点:\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"系统Stack size 为:已配置\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"系统Open files 为:已配置\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"系统Wmem Default 为:已配置\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"系统Rmem Default 为:已配置\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"系统Wmem Max 为:已配置\n","time":"2024-04-26T15:00:27+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:18:17+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:18:19+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n;","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n;","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n;","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n;","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n;","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n;","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n;","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n;","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n;","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n;","time":"2024-04-26T15:18:20+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:19:21+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:19:24+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:19:25+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:21:27+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:21:29+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:21:30+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:38:36+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:38:39+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:38:40+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:40:01+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:40:04+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:40:05+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:42:35+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:42:38+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:42:39+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:42:39+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:42:39+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:42:39+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:43:06+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:43:09+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:43:09+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:43:09+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:43:09+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:43:09+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:44:08+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:44:11+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:44:12+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:44:12+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:44:12+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:44:12+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:45:31+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:45:33+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:45:34+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:45:34+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:45:34+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:45:34+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:50:14+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:50:17+08:00"}
+{"level":"info","msg":"1节点上传文件成功\n","time":"2024-04-26T15:51:01+08:00"}
+{"level":"info","msg":"2节点上传文件成功\n","time":"2024-04-26T15:51:04+08:00"}
+{"level":"info","msg":"--------------------1节点--------------------------------------:\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"基础包 GCC :未检测\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"基础包 Libaio :未检测\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"基础包 Snmpd :未检测\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"基础包 Ntpd :未检测\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"--------------------2节点--------------------------------------:\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"系统环境Stack size :已配置\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"系统环境Open files :已配置\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"系统环境Wmem Default :已配置\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"系统环境Rmem Default :已配置\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"系统环境Wmem Max :已配置\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"基础包 GCC :未检测\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"基础包 Libaio :未检测\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"基础包 Snmpd :未检测\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"基础包 Ntpd :未检测\n","time":"2024-04-26T15:51:05+08:00"}
+{"level":"info","msg":"--------------------------------------------------------------:\n","time":"2024-04-26T15:51:05+08:00"}

+ 12 - 0
main.go

@@ -0,0 +1,12 @@
+package main
+
+import (
+	"xg_auto_deploy/internal/auto"
+	"xg_auto_deploy/internal/global"
+)
+
+func main() {
+	global.InitNodeSetting()
+	auto.AutoDeployALL()
+
+}