DMDRS定义了部分内部数据类型,并提供变量属性、变量函数等方法来实现特定需求。
<dml> DRS.DML
描述同步表的DML操作,主要用于数据清洗转换。
| 序号 | 语法 | 类型 | 说明 | 附加说明 |
|---|---|---|---|---|
| 1 | <dml> . #OP | VARCHAR(16) | 当前操作,如'INSERT','UPDATE','DELETE'。 | 可修改 |
| 2 | <dml> . #TRXID | BIGINT | 当前操作的事务ID。 | - |
| 3 | <dml> . #LSN | BIGINT | 当前操作的日志LSN。 | - |
| 4 | <dml> . #LFS | BIGINT | 当前操作的日志LFS。 | - |
| 5 | <dml> . #EPOCH | TIMESTAMP(0) | 当前操作的日志时间戳。 | - |
| 6 | <dml> . #SCH | VARCHAR(128) | 当前操作所属的模式名。 | 可修改 |
| 7 | <dml> . #TAB | VARCHAR(128) | 当前操作所属的表名。 | 可修改 |
| 8 | <dml> . #ROWID | VARCHAR(32) | 当前操作对应的ROWID。 | - |
| 9 | <dml> . #SQL | VARCHAR | 当前操作对应的SQL语句。 | - |
| 10 | <dml> . #HINT | VARCHAR(128) | 用于指定当前DML操作的HINT子句,初始为空,根据需要设置。 | 可修改 |
| 11 | <dml> [:NEW|:OLD] . #COLS | INT | 返回当前操作的列数。UPDATE可以指定新列或旧列,默认为新列数。 | - |
| 12 | <dml> . #OBJID | BIGINT | 当前操作归属的对象ID。 | - |
| 13 | <dml> . #OPID | BIGINT | 当前操作的日志OP_ID。 | - |
| 14 | <dml> . #KEY | VARBINARY | 用于指定当前DML操作的KEY值,根据需要设置。 | 可修改 |
示例
TABLE SYSDBA."*" --省略输入参数(op DRS.DML)
BEGIN
DRS_SYS.PUT_LINE('OP is: ' || op.#OP);
IF op.#OP = 'UPDATE' THEN
DRS_SYS.PUT_LINE('NEW COLS NUM is: ' || op:NEW.#COLS);
DRS_SYS.PUT_LINE('OLD COLS NUM is: ' || op:OLD.#COLS);
ELSE
DRS_SYS.PUT_LINE('COLS NUM is: ' || op.#COLS);
END IF;
DRS_SYS.PUT_LINE('TRXID is: ' || op.#TRXID);
DRS_SYS.PUT_LINE('LSN is: ' || op.#LSN);
DRS_SYS.PUT_LINE('LFS is: ' || op.#LFS);
DRS_SYS.PUT_LINE('EPOCH is: ' || op.#EPOCH);
DRS_SYS.PUT_LINE('SCH is: ' || op.#SCH);
DRS_SYS.PUT_LINE('TAB is: ' || op.#TAB);
DRS_SYS.PUT_LINE('ROWID is: ' || op.#ROWID);
DRS_SYS.PUT_LINE('SQL is: ' || op.#SQL);
op.exec();
END;
获取DML操作中的列,用于读取、修改列名或列值。
| 序号 | 语法 | 类型 | 说明 |
|---|---|---|---|
| 1 | <dml> [:NEW|:OLD] . <列名> | DRS.DML_COL | 通过列名获取操作的指定列。 |
| 2 | <dml> . [NEW|OLD] COL ( <列号> INT ) | DRS.DML_COL | 通过列号获取操作的指定列,列号从1开始,表示第几列。 |
说明
- UPDATE操作可以指定新列或旧列,若不指定优先返回新列,不存在才会返回旧列。
- 如果访问的列不存在,会报错。
- 获取到的列并非列值,而是DML列类型的变量,具体使用方法参考下一节或示例。
- 通过列名访问列时,如果存在空格或者与关键词、伪列名冲突,需要使用双引号包含,如op."#OP"。
示例
TABLE SYSDBA."*" --省略输入参数(op DRS.DML)
DECLARE
i INT;
BEGIN
IF op.#OP = 'UPDATE' THEN
DRS_SYS.PUT_LINE('NEW COLS NUM is: ' || op:NEW.#COLS);
DRS_SYS.PUT_LINE('OLD COLS NUM is: ' || op:OLD.#COLS);
ELSE
DRS_SYS.PUT_LINE('COLS NUM is: ' || op.#COLS);
END IF;
FOR i IN 1..op:NEW.#COLS LOOP
DRS_SYS.PUT_LINE('NEW COL: ' || op.NEWCOL(i).NAME || ', VALUE: ' || op.NEWCOL(i).VALUE);
END LOOP;
FOR i IN 1..op:OLD.#COLS LOOP
DRS_SYS.PUT_LINE('OLD COL: ' || op.OLDCOL(i).NAME || ', VALUE: ' || op.OLDCOL(i).VALUE);
END LOOP;
RETURN;
END;
功能
当前DML操作添加列。
说明
对于UPDATE操作,未指定新旧列时优先添加新列,已存在同名的新列时再添加旧列。
语法
<dml> . ADD_[NEW|OLD]COL(name, val) RETURN VOID
| 参数名 | 类型 | 说明 |
|---|---|---|
| name | VARCHAR(128) | 要添加的列名。 |
| val | VARCHAR | 要添加的列值。 |
示例
TABLE SYSDBA.T1 --省略输入参数(op DRS.DML)
BEGIN
DRS_SYS.PUT_LINE('INPUT SQL is: ' || op.#SQL);
op.exec(); --正常同步T1表的操作
IF op.#OP = 'INSERT' THEN
op.ADD_COL('DRS_COL', 'MY DATA'); --对于INSERT, 增加一列"DRS_COL", 并且值为'MY_DATA'
DRS_SYS.PUT_LINE('NEW SQL is: ' || op.#SQL);
END IF;
op.exec('T1_TMP'); --将转换后的操作在表T1_TMP上执行
END;
功能
添加占位符。部分功能使用。
语法
<dml> . ADD_PLACEHOLDER(name, val) RETURN VOID
| 参数名 | 类型 | 说明 |
|---|---|---|
| name | VARCHAR(128) | 要添加的占位符名称。在与JSON模板搭配使用的场景下,名称需要取为模板中声明的变量参数名中#PLACEHOLDER前缀以外的部分。 |
| val | VARCHAR | 要添加的占位符值。 |
功能
指定模式名、表名执行当前DML操作。
语法
<dml> . EXEC([[sch, ]tab]) RETURN VOID
| 参数名 | 类型 | 说明 |
|---|---|---|
| sch | VARCHAR(128) | 可选参数,输出执行的模式名。 |
| tab | VARCHAR(128) | 可选参数,输出执行的表名。 |
功能
获取列的数组,便于批量处理DML操作的列。
说明
对于UPDATE操作,未指定新旧列时优先返回新列数组。
语法
<dml> . GET_[NEW|OLD]COLS() RETURN DRS.DML_COL_ARR
功能
判断当前DML操作中是否存在指定名称的列。返回值为1或0,表示存在或不存在。
说明
未指定新旧列时优先查找新列,不存在时再查找旧列。
语法
<dml> . HAS_[NEW|OLD]COL(name) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| name | VARCHAR(128) | 指定的列名。 |
功能
当前DML操作移除列。
说明
对于UPDATE操作,未指定新旧列时优先移除新列,不存在指定名称的新列时再移除旧列。
语法
<dml> . REMOVE_[NEW|OLD]COL(name) RETURN VOID
| 参数名 | 类型 | 说明 |
|---|---|---|
| name | VARCHAR(128) | 要移除的列名。 |
功能
通过指定列的数组,批量设置DML操作的列。
说明
对于UPDATE操作,未指定新旧列时优先设置新列数组。
语法
<dml> . SET_[NEW|OLD]COLS(cols) RETURN VOID
| 参数名 | 类型 | 说明 |
|---|---|---|
| cols | DRS.DML_COL_ARR | 要移除的列名。 |
功能
通过指定需要同步的列,将其他不在指定范围内的列移除。
说明
该方法通常不能多次调用,因为列的移除是不可逆的,如果有需要,可以在调用前使用COPY方法保留副本,在副本上进行二次调用。
语法
<dml> . USE_COLS(...) RETURN VOID
| 参数名 | 类型 | 说明 |
|---|---|---|
| 可变参数 | VARCHAR | 需要同步的列名。 |
示例
op.USE_COLS('C1', 'C4', 'C5');
功能
生成一个DML操作的副本。
语法
<dml> . COPY() RETURN DRS.DML
示例
op.COPY();
<dml_col> DRS.DML_COL
描述同步表的DML操作列,可以对该列数据进行读取或者修改,主要用于数据清洗转换。
| 序号 | 语法 | 类型 | 说明 | 附加说明 |
|---|---|---|---|---|
| 1 | <dml_col> . NAME | VARCHAR(256) | 当前列的名称。 | 可修改 |
| 2 | <dml_col> . VALUE | VARCHAR | 当前列的值。 | 可修改 |
| 3 | <dml_col> . IS_KEY | BOOL | 当前列在源库是否为主键列。 | - |
示例
TABLE SYSDBA.T1 --省略输入参数(op DRS.DML)
BEGIN
DRS_SYS.PUT_LINE('INPUT SQL is: ' || op.#SQL);
IF op.#COLS > 0 THEN
op.COL(1).NAME := 'DRS_COL_NEW';--修改第一列的名称为"DRS_COL_NEW"
op.DRS_COL_NEW.VALUE := NULL; --修改名称为"DRS_COL_NEW"的列值为空值
DRS_SYS.PUT_LINE('NEW SQL is: ' || op.#SQL);
END IF;
END;
<dml_col_arr> DRS.DML_COL_ARR
描述一组操作的列,用于批量处理。实际隐式添加了下列语句:
TYPE DRS.DML_COL_ARR IS ARRAY DRS.DML_COL[];
示例1
TABLE "*"."*" --省略输入参数(op DRS.DML)
DECLARE
new_cols DRS.DML_COL_ARR;
old_cols DRS.DML_COL_ARR;
i INT;
BEGIN
new_cols := op.GET_NEWCOLS();
old_cols := op.GET_OLDCOLS();
FOR i IN 1..new_cols.SIZE LOOP
DRS_SYS.PUT_LINE('NEW COL: ' || new_cols[i].NAME || ' VALUE: ' || new_cols[i].VALUE);
END LOOP;
FOR i IN 1..old_cols.SIZE LOOP
DRS_SYS.PUT_LINE('OLD COL: ' || old_cols[i].NAME || ' VALUE: ' || old_cols[i].VALUE);
END LOOP;
op.exec();
END;
示例2
TABLE "*"."*" --省略输入参数(op DRS.DML)
DECLARE
new_cols DRS.COL_ARR;
BEGIN
DRS_SYS.PUT_LINE('INPUT SQL is: ' || op.#SQL);
--将INSERT转为DELETE
IF op.#OP = 'INSERT' THEN
new_cols := op.GET_COLS(); --INSERT操作获取的是新列
op.#OP := 'DELETE'; --将INSERT转为DELETE
op.SET_COLS(new_cols); --DELETE操作设置的是旧列
DRS_SYS.PUT_LINE('NEW SQL is: ' || op.#SQL);
END IF;
op.exec(); --执行转换后的DML操作
END;
<ddl> DRS.DDL
描述同步表的DDL操作,主要用于数据清洗转换。
| 序号 | 语法 | 类型 | 说明 | 附加说明 |
|---|---|---|---|---|
| 1 | <ddl> . #OP | VARCHAR(32) | 当前操作,如'CREATE_TABLE'。 | - |
| 2 | <ddl> . #TRXID | BIGINT | 当前操作的事务ID。 | - |
| 3 | <ddl> . #LSN | BIGINT | 当前操作的日志LSN。 | - |
| 4 | <ddl> . #LFS | BIGINT | 当前操作的日志LFS。 | - |
| 5 | <ddl> . #EPOCH | TIMESTAMP(0) | 当前操作的日志时间戳。 | - |
| 6 | <ddl> . #SCH | VARCHAR(128) | 当前操作所属的模式名。 | - |
| 7 | <ddl> . #OBJ | VARCHAR(128) | 当前操作所属的对象名。 | - |
| 8 | <ddl> . #SQL | VARCHAR | 当前操作对应的SQL语句。 | - |
| 9 | <ddl> . #OBJID | BIGINT | 当前操作归属的对象ID。 | - |
| 10 | <ddl> . #OPID | BIGINT | 当前操作的日志OP_ID。 | - |
| 11 | <ddl> . #KEY | VARBINARY | 用于指定当前DDL操作的KEY值,根据需要设置。 | 可修改 |
功能
为表相关DDL操作添加新的列定义。
说明
- 不能是已经存在的列名,否则会报错。
- 新添加的列默认允许为NULL,可见,无默认值。添加后,可以通过列属性进行修改。
语法
<ddl> . ADD_COL(name, dtype) RETURN VOID
| 参数名 | 类型 | 说明 |
|---|---|---|
| name | VARCHAR(128) | 添加列的名称。 |
| dtype | VARCHAR(128) | 添加列的类型。 |
示例
OBJECT SYSDBA.T1 --省略输入参数(op DRS.DDL)
BEGIN
DRS_SYS.PUT_LINE('INPUT SQL is: ' || op.#SQL);
--建表时如果不存在C1列, 添加列C1 VARCHAR(100), 添加的列默认可以为NULL, 可见,无默认值
IF op.#OP = 'CREATE_TABLE' AND op.HAS_COL('C1') = 0 THEN
op.ADD_COL('C1', 'VARCHAR(100)');
END IF;
DRS_SYS.PUT_LINE('OUTPUT SQL is: ' || op.#SQL);
op.EXEC();
END;
功能
指定模式名、对象名执行当前DDL操作。
语法
<ddl> . EXEC([[sch, ]obj]) RETURN VOID
| 参数名 | 类型 | 说明 |
|---|---|---|
| sch | VARCHAR(128) | 可选参数,输出执行的模式名。 |
| obj | VARCHAR(128) | 可选参数,输出执行的对象名。 |
功能
判断当前表相关DDL操作中是否存在指定名称的列。返回值为1或0,表示存在或不存在。
说明要求DDL对象必须是表,并且是创建或修改表操作,否则会报错。
语法
<ddl> . HAS_COL(name) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| name | VARCHAR(128) | 指定的列名。 |
功能
移除表相关DDL操作的指定列定义。
语法
<ddl> . REMOVE_COL(name) RETURN VOID
| 参数名 | 类型 | 说明 |
|---|---|---|
| name | VARCHAR(128) | 需要移除列的名称。 |
示例
OBJECT SYSDBA.T1 --省略输入参数(op DRS.DDL)
BEGIN
DRS_SYS.PUT_LINE('INPUT SQL is: ' || op.#SQL);
--建表时如果存在C1列, 移除列C1
IF op.#OP='CREATE_TABLE' AND op.HAS_COL('C1') THEN
op.REMOVE_COL('C1');
END IF;
DRS_SYS.PUT_LINE('OUTPUT SQL is: ' || op.#SQL);
op.EXEC();
END;
功能
添加占位符。部分功能使用。
语法
<ddl> . ADD_PLACEHOLDER(name, val) RETURN VOID
| 参数名 | 类型 | 说明 |
|---|---|---|
| name | VARCHAR(128) | 要添加的占位符名称。在与JSON模板搭配使用的场景下,名称需要取为模板中声明的变量参数名中#PLACEHOLDER前缀以外的部分。 |
| val | VARCHAR | 要添加的占位符值。 |
<ddl_col> DRS.DDL_COL
描述同步表的DDL操作列,可以对该列数据进行读取或者修改,主要用于数据清洗转换。
| 序号 | 语法 | 类型 | 说明 | 附加说明 |
|---|---|---|---|---|
| 1 | <ddl_col> . NAME | VARCHAR(256) | 当前列的名称。 | 可修改 |
| 2 | <ddl_col> . NULLABLE | BOOL | 当前列是否可以为NULL。 | 可修改 |
| 3 | <ddl_col> . VISIBLE | BOOL | 当前列是否可见。 | 可修改 |
| 4 | <ddl_col> . DEFAULT | VARCHAR | 当前列的默认值。 | 可修改 |
示例
OBJECT SYSDBA.T1 --省略输入参数(op DRS.DDL)
BEGIN
DRS_SYS.PUT_LINE('INPUT SQL is: ' || op.#SQL);
--建表时修改C1列为C1_NEW, 并设置非空属性
IF op.#OP='CREATE_TABLE' AND op.HAS_COL('C1') THEN
op.C1.NAME := 'C1_NEW';--修改第一列的名称为"C1_NEW"
op.C1_NEW.NULLABLE := 0;--修改C1_NEW为非空属性列
op.C1_NEW.VISIBLE := 0;--修改C1_NEW为不可见
op.C1_NEW.DEFAULT := '''MY DATA''';--设置默认值为'MY_DATA'
DRS_SYS.PUT_LINE('NEW SQL is: ' || op.#SQL);
END IF;
op.EXEC();
END;
<xrec> DRS.XREC
用于DMNCDB-REDIS的同步,描述源DMDRS的操作。
| 序号 | 语法 | 类型 | 说明 | 附加说明 |
|---|---|---|---|---|
| 1 | <xrec> . #OP | VARCHAR(16) | 操作类型。包括'INSERT'、'UPDATE'和'DELETE'。 | - |
| 2 | <xrec> . #TYPE | VARCHAR(16) | 操作对象的类型。包括'STRING'、 'HASH'、'LIST'、 'SET'和'ZSET'。 | - |
| 3 | <xrec> . #DBID | BIGINT | 操作对象所在的DB号。 | - |
| 4 | <xrec> . #KEY | VARBINARY | 当前操作元素的KEY值。所有的操作类型都有KEY值。 | - |
| 5 | <xrec> . #SUBKEY | VARBINARY | 当前操作元素的SUBKEY值。'HASH'、'LIST'、'SET'和'ZSET'类型有SUBKEY值。 | - |
| 6 | <xrec> . #VALUE | VARBINARY | 当前操作元素的VALUE值。'KEY'、'HASH'、'LIST'和'ZSET'类型有VALUE值。 | - |
| 7 | <xrec> . #VERSION | BIGINT | 'LIST'类型操作的VERSION值。 | - |
| 8 | <xrec> . #FROM_SYNC | BOOL | 这条日志操作是否来源于其它站点的数据同步。 | - |
下表说明了各类型日志XREC操作持有的属性。
| 操作类型 | 对象类型 | 持有属性 | 说明 |
|---|---|---|---|
| INSERT/UPDATE | STRING | KEY | - |
| VALUE | - | ||
| HASH | KEY | - | |
| SUBKEY | 操作元素所在FIELD值。 | ||
| VALUE | - | ||
| LIST | KEY | - | |
| SUBKEY | 操作元素所在INDEX值。 | ||
| VALUE | - | ||
| VERSION | - | ||
| SET | KEY | - | |
| SUBKEY | 操作元素的MEMBER值。 | ||
| ZSET | KEY | - | |
| SUBKEY | 操作元素的MEMBER值。 | ||
| VALUE | 操作元素的SCORE值。 | ||
| DELETE | STRING | KEY | - |
| HASH | KEY | - | |
| SUBKEY | 操作元素所在FIELD值。 | ||
| LIST | KEY | - | |
| SUBKEY | 操作元素所在INDEX值。 | ||
| VALUE | - | ||
| VERSION | - | ||
| SET | KEY | - | |
| SUBKEY | 操作元素的MEMBER值。 | ||
| ZSET | KEY | - | |
| SUBKEY | 操作元素的MEMBER值。 | ||
| VALUE | 操作元素的SCORE值。 |
说明
- DEL命令对应的日志操作只有KEY值。
- INDEX值和SCORE值的实际类型为字符串。
- 日志中的INDEX值为历史值。同一个元素的INDEX值可能因其它元素的插入/删除而改变。
<dbx> DRS.DBX
用来与指定数据库建立连接,达到执行特定语句的目的。
功能
提交当前连接的事务。返回值为1或0,表示成功或失败。
语法
<dbx> . COMMIT() RETURN BOOL
功能
连接指定的数据库。返回值为1或0,表示成功或失败。
语法
<dbx> . CONNECT(dbtype, server[[, driver], dbname], port, user, password) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| dbtype | VARCHAR(128) | 连接的数据库类型。如DM8、DSC和ORACLE11G。 |
| server | VARCHAR(128) | 连接的数据库服务名或IP。 |
| driver | VARCHAR(128) | 可选参数,连接数据库使用的驱动。 |
| dbname | VARCHAR(128) | 可选参数,数据库名。 |
| port | INT | 连接的数据库端口号。 |
| user | VARCHAR(128) | 连接数据库的用户名。 |
| password | VARCHAR(32) | 连接数据库的密码。 |
功能
关闭数据库连接。返回值为1或0,表示成功或失败。
语法
<dbx> . CLOSE() RETURN BOOL
功能
单行或批量绑定执行指定的SQL语句。返回值为1或0,表示成功或失败。
说明
批量绑定时,可变参数均为数组,并且数组大小一致。
语法
<dbx> . EXEC_BIND(sql, ...) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| sql | VARCHAR | 指定的SQL语句。 |
| 可变参数 | 基本数据类型 | 绑定值,如果是数组则表示批量绑定。 |
功能
执行指定的SQL语句。返回值为1或0,表示成功或失败。
语法
<dbx> . EXEC_DDL(sql) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| sql | VARCHAR | 指定的SQL语句。 |
功能
执行指定的SQL语句,不提交。返回值为1或0,表示成功或失败。
语法
<dbx> . EXEC_DML(sql) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| sql | VARCHAR | 指定的SQL语句。 |
功能
执行指定的SQL语句,可选择是否返回错误。返回值为1或0,表示成功或失败。
语法
<dbx> . EXEC_NORMAL(sql[, ret_err]) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| sql | VARCHAR | 指定的SQL语句。 |
| ret_err | BOOL | 可选参数,是否返回错误。默认返回。 |
功能
查询指定SQL语句,根据返回的结果集计算MD5值。
语法
<dbx> . GET_RES_MD5(sql) RETURN VARBINARY(16)
| 参数名 | 类型 | 说明 |
|---|---|---|
| sql | VARCHAR | 指定的查询SQL语句。 |
功能
回滚当前连接的事务。返回值为1或0,表示成功或失败。
语法
<dbx> . ROLLBACK() RETURN BOOL
示例
DECLARE
TYPE num_arr IS ARRAY NUMBER(32,0)[]; --数组类型1声明, 用于批量绑定执行
TYPE str_arr IS ARRAY VARCHAR(10)[]; --数组类型2声明, 用于批量绑定执行
db DRS.DBX; --数据库连接
c1 num_arr; --C1列数组
c2 num_arr; --C2列数组
c3 num_arr; --C3列数组
c4 str_arr; --C4列数组
bind_rows INT; --绑定的行数, 等于数组大小
i INT;
select_sql STRING;
res_md5 VARBINARY(16);
BEGIN
--连接数据库
db.CONNECT('DM8', '127.0.0.1', 5236, 'SYSDBA', 'SYSDBA');
--创建表SYSDBA.T1
db.EXEC_DDL('DROP TABLE IF EXISTS SYSDBA.T1');
db.EXEC_DDL('CREATE TABLE SYSDBA.T1 (
C1 NUMBER(32,0) NOT NULL,
C2 NUMBER(32,0),
C3 NUMBER(32,0),
C4 VARCHAR(10))');
--构造批量行数据
bind_rows := 10;
c1 := NEW NUMBER[bind_rows];
c2 := NEW NUMBER[bind_rows];
c3 := NEW NUMBER[bind_rows];
c4 := NEW VARCHAR[bind_rows];
FOR i IN 1..bind_rows LOOP
c1[i] := 10000 + i;
c2[i] := i * 10;
c3[i] := 4000 + i;
c4[i] := 'BIND:' || i;
END LOOP;
--批量绑定执行
db.EXEC_BIND('INSERT INTO SYSDBA.T1 VALUES(:1, :2, :3, :4)', c1, c2, c3, c4);
db.COMMIT();
--计算查询结果集的MD5值
select_sql := 'SELECT * FROM SYSDBA.T1';
res_md5 := db.GET_RES_MD5(select_sql);
DRS_SYS.PUT_LINE(select_sql);
DRS_SYS.PUT_LINE('result md5 is : 0x' || res_md5);
--关闭数据库连接
db.CLOSE();
END;
<res> DRS.RESULT
用来查询数据库结果集。
| 序号 | 语法 | 类型 | 说明 | 附加说明 |
|---|---|---|---|---|
| 1 | <res> . COLS | INT | 当前返回结果集的列数。 | - |
| 2 | <res> . <列名> | VARCHAR | 当前行结果集中,指定列名的值。 | - |
说明如果列名存在空格或者与关键词、属性名冲突,需要使用双引号包含。
功能
通过列号获取指定结果集列位置的列名。
语法
<res> . COL_NAME(ind) RETURN VARCHAR(256)
| 参数名 | 类型 | 说明 |
|---|---|---|
| ind | INT | 列位置,从1开始,不超过结果集列数。 |
功能
通过列号获取指定结果集列位置的列类型。
语法
<res> . COL_TYPE(ind) RETURN VARCHAR(256)
| 参数名 | 类型 | 说明 |
|---|---|---|
| ind | INT | 列位置,从1开始,不超过结果集列数。 |
功能
通过列号获取指定结果集列位置的列值,均已转字符串。
语法
<res> . COL_VAL(ind) RETURN VARCHAR
| 参数名 | 类型 | 说明 |
|---|---|---|
| ind | INT | 列位置,从1开始,不超过结果集列数。 |
功能
初始化,创建结果集。返回值为1或0,表示成功或失败。
语法
<res> . CREATE(dbx) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| dbx | DRS.DBX | 指定已经连接成功的数据库连接,用于查询结果集。 |
功能
查询结果集,获取第一行数据,支持参数绑定。返回值为1或0,表示有数据或无数据。
语法
<res> . FETCH(sql, ...) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| sql | VARCHAR | 指定的查询SQL语句。 |
| 可变参数 | 基本数据类型 | 绑定值。 |
功能
提取下一行数据,需要先调用FETCH。返回值为1或0,表示有数据或无数据。
语法
<res> . FETCH_NEXT() RETURN BOOL
功能
释放结果集。返回值为1或0,表示成功或失败。
语法
<res> . FREE() RETURN BOOL
示例
--自定义函数, 用于打印当前行信息
FUNCTION PRINT_RESULT_ROW (row_num INT, db_res DRS.RESULT)
DECLARE
i INT;
BEGIN
DRS_SYS.PUT_LINE('[ROW] ' || row_num);
FOR i IN 1..db_res.COLS LOOP
DRS_SYS.PUT_LINE('[', db_res.NAME(i), '] ', db_res.VALUE(i));
END LOOP;
END;
DECLARE
db DRS.DBX;
db_res DRS.RESULT;
row_num INT;
BEGIN
--DB CONNECT/RES CREATE/MAKE SQL
db.CONNECT('DM8', '127.0.0.1', 5236, 'SYSDBA', 'SYSDBA');
db_res.CREATE(db);
row_num := 0;
--FETCH ALL ROWS
IF db_res.FETCH('SELECT * FROM TEST.T1') THEN
row_num := row_num + 1;
PRINT_RESULT_ROW(row_num, db_res);
WHILE db_res.FETCH_NEXT() LOOP
row_num := row_num + 1;
PRINT_RESULT_ROW(row_num, db_res);
END LOOP;
END IF;
--RES FREE/DB CLOSE
db_res.FREE();
db.CLOSE();
END;
<csl> DRS.CONSOLE
通过控制台连接DMDRS服务,用于查看监控消息或者发送命令。
| 序号 | 语法 | 类型 | 说明 | 附加说明 |
|---|---|---|---|---|
| 1 | <csl> . ROWS | INT | 监控命令返回表格数据的行数。 | - |
| 2 | <csl> . COLS | INT | 监控命令返回表格数据的列数。 | - |
功能
断开控制台连接。返回值为1或0,表示成功或失败。
语法
<csl> . CLOSE() RETURN BOOL
功能
发送指令到DMDRS服务。返回值为1或0,表示成功或失败。
说明
监控命令执行成功后,监控数据将保存于内存中。如果执行新的监控命令,旧的数据将被覆盖。
语法
<csl> . CMD(cmd) RETURN BOOL
<csl> . COMMAND(cmd) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| cmd | VARCHAR | 命令。参考《DMDRS参考手册》。 |
功能
连接DMDRS服务。返回值为1或0,表示成功或失败。
语法
<csl> . CONNECT(server, port) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| server | VARCHAR(128) | DMDRS服务所在的IP地址。 |
| port | INT | DMDRS服务所使用的端口号。 |
功能
指定行列,获取监控的表格数据,以字符串形式返回。
语法
<csl> . GET_VAL(row, col) RETURN VARCHAR
<csl> . GET_VALUE(row, col) RETURN VARCHAR
| 参数名 | 类型 | 说明 |
|---|---|---|
| row | INT | 指定的行。 |
| col | INT | 指定的列。 |
示例
--自定义函数:打印指定列
FUNCTION PRINT_SHOW_COL (col_num INT, csl DRS.CONSOLE)
DECLARE
i INT;
BEGIN
FOR i IN 1..csl.ROWS LOOP
DRS_SYS.PUT_LINE('[ROW(', i, ')][COL(', col_num, ')] ', csl.GET_VAL(i, col_num));
END LOOP;
END;
--自定义函数:打印指定行
FUNCTION PRINT_SHOW_ROW (row_num INT, csl DRS.CONSOLE)
DECLARE
j INT;
BEGIN
FOR j IN 1..csl.COLS LOOP
DRS_SYS.PUT_LINE('[ROW(', row_num, ')][COL(', j, ')] ', csl.GET_VAL(row_num, j));
END LOOP;
END;
--自定义函数:在监控表格数据中查找指定str并打印所在行
FUNCTION SEARCH_AND_SHOW_COL (str VARCHAR, csl DRS.CONSOLE)
DECLARE
i INT;
j INT;
BEGIN
FOR i IN 1..csl.ROWS LOOP
FOR j IN 1..csl.COLS LOOP
IF str = csl.GET_VAL(i, j) THEN
PRINT_SHOW_ROW(i, csl);
END IF;
END LOOP;
END LOOP;
END;
--自定义函数:在监控表格数据中查找指定str并打印所在列
FUNCTION SEARCH_AND_SHOW_ROW (str STRING, csl DRS.CONSOLE)
DECLARE
i INT;
j INT;
BEGIN
FOR i IN 1..csl.ROWS LOOP
FOR j IN 1..csl.COLS LOOP
IF str = csl.GET_VAL(i, j) THEN
PRINT_SHOW_COL(j, csl);
END IF;
END LOOP;
END LOOP;
END;
<mtx> DRS.MUTEX
主要用于多线程情景下,对全局变量的访问和修改。
功能
释放互斥锁。
语法
<mtx> . DESTROY() RETURN VOID
功能
初始化互斥锁。
语法
<mtx> . INIT() RETURN VOID
功能
上锁。
语法
<mtx> . LOCK() RETURN VOID
功能
解锁。
语法
<mtx> . UNLOCK() RETURN VOID
<file> DRS.FILE
用于对本地文件的读写。
| 序号 | 语法 | 类型 | 说明 | 附加说明 |
|---|---|---|---|---|
| 1 | <file> . SIZE | BIGINT | 当前打开文件的大小。 | - |
功能
关闭文件。返回值为1或0,表示成功或失败。
语法
<file> . CLOSE() RETURN BOOL
功能
打开或创建文件。返回值为1或0,表示成功或失败。
说明
文件打开后,内部将维护读写偏移位置,每次读写都将更新对应偏移。写偏移初始为文件末尾,读偏移初始为文件开头。
语法
<file> . OPEN(path[, mod]) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| path | VARCHAR(256) | 文件所在路径。 |
| mod | VARCHAR(32) | 可选参数,文件打开方式,具体值如下: 'CREATE':打开文件,如果不存在则创建。 'TRUNC':打开文件并清空内容,如果不存在则创建。 未指定时,打开已存在的文件。 |
功能
在文件末尾追加写入字符串。返回值为1或0,表示成功或失败。
说明
写入成功后,内部读偏移位置更新至写入数据末尾。
语法
<file> . PUT(str) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| str | VARCHAR | 要写入的字符串。 |
功能
在文件末尾追加写入字符串,并补充换行符“\r\n”。返回值为1或0,表示成功或失败。
说明
写入成功后,内部读偏移位置更新至写入数据末尾。
语法
<file> . PUT_LINE(str) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| str | VARCHAR | 要写入的字符串。 |
功能
读取指定大小的二进制数据,可指定文件偏移位置。
说明
读取成功后,内部读偏移位置更新至读取数据末尾。
语法
<file> . READ(size[, offset]) RETURN VARBINARY
| 参数名 | 类型 | 说明 |
|---|---|---|
| size | INT | 要读取的数据字节数,实际读取大小不会超过文件大小。 |
| offset | BIGINT | 可选参数,读取的文件偏移位置,默认为当前读偏移位置。 |
功能
写入二进制数据,可指定文件偏移位置。返回值为1或0,表示成功或失败。
说明
写入成功后,内部写偏移位置更新至写入数据末尾。
语法
<file> . WRITE(data[, offset]) RETURN BOOL
| 参数名 | 类型 | 说明 |
|---|---|---|
| data | VARBINARY | 要写入的二进制数据。 |
| offset | BIGINT | 可选参数,写入的文件偏移位置,默认为当前写偏移位置。 |
文章
阅读量
获赞
