经济文库 - 千万精品文档,你想要的都能搜到,下载即用。

KingbaseES_PLSQL系统包和类型参考手册.pdf

INjure191 页 528.232 KB 访问 632.97下载文档
KingbaseES_PLSQL系统包和类型参考手册.pdfKingbaseES_PLSQL系统包和类型参考手册.pdfKingbaseES_PLSQL系统包和类型参考手册.pdfKingbaseES_PLSQL系统包和类型参考手册.pdfKingbaseES_PLSQL系统包和类型参考手册.pdfKingbaseES_PLSQL系统包和类型参考手册.pdf
当前文档共191页 2.97
下载后继续阅读

KingbaseES_PLSQL系统包和类型参考手册.pdf

KingbaseES PL/SQL 系统包和类型参考手册 金仓数据库管理系统 KingbaseES 文档版本:V9(V009R001C001B0024) 发布日期:2023 年 10 月 12 日 北京人大金仓信息技术股份有限公司 目 目 录 录 第 1 章 前言 1 1.1 读者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 关联文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3 手册约定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 第 2 章 PL/SQL 系统包和类型简介 3 第 3 章 DBMS_DDL 5 3.1 DBMS_DDL 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.2 DBMS_DDL 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.2.1 WRAP 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.2.2 CREATE_WRAPPED 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 第 4 章 DBMS_JOB 9 4.1 DBMS_JOB 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 4.2 DBMS_JOB 使用限制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 4.3 DBMS_JOB 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 4.3.1 BROKEN 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 4.3.2 CHANGE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.3.3 INSTANCE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4.3.4 INTERVAL 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 4.3.5 NEXT_DATE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.3.6 REMOVE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.3.7 RUN 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.3.8 SUBMIT 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.3.9 WHAT 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 第 5 章 DBMS_LOB 16 5.1 DBMS_LOB 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 5.2 DBMS_LOB 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 5.2.1 APPEND 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 5.2.2 COMPARE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 I 目 录 5.2.3 COPY 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.2.4 CREATETEMPORARY 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5.2.5 ERASE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 5.2.6 FREETEMPORARY 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5.2.7 GETLENGTH 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5.2.8 INSTR 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5.2.9 ISTEMPORARY 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 5.2.10 READ 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 5.2.11 SUBSTR 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.2.12 TRIM 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.2.13 WRITEAPPEND 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 第 6 章 DBMS_METADATA 31 6.1 DBMS_METADATA 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 6.2 DBMS_METADATA 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 GET_DDL 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 6.2.1 第 7 章 DBMS_MVIEW 35 7.1 DBMS_MVIEW 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 7.2 DBMS_MVIEW 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 REFRESH 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 7.2.1 第 8 章 DBMS_OBFUSCATION_TOOLKIT 37 8.1 DBMS_OBFUSCATION_TOOLKIT 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 8.2 DBMS_OBFUSCATION_TOOLKIT 使用限制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 8.3 DBMS_OBFUSCATION_TOOLKIT 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 8.3.1 DES3ENCRYPT 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 8.3.2 DES3DECRYPT 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 8.3.3 DESENCRYPT 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 8.3.4 DESDECRYPT 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 8.3.5 MD5 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 第 9 章 DBMS_OUTPUT 42 9.1 DBMS_OUTPUT 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 9.2 DBMS_OUTPUT 使用限制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 9.3 DBMS_OUTPUT 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 9.3.1 ENABLE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 9.3.2 DISABLE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 9.3.3 PUT 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 9.3.4 PUT_LINE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 9.3.5 NEW_LINE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 9.3.6 GET_LINE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 9.3.7 GET_LINES 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 II 9.4 目 录 DBMS_OUTPUT 客户端命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 9.4.1 set serverout on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 9.4.2 set serverout off . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 第 10 章 DBMS_RANDOM 52 10.1 DBMS_RANDOM 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 10.2 DBMS_RANDOM 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 10.2.1 INITIALIZE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 10.2.2 NORMAL 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 10.2.3 RANDOM 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 10.2.4 SEED 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 10.2.5 STRING 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 10.2.6 TERMINATE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 10.2.7 VALUE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 第 11 章 DBMS_SCHEDULER 57 11.1 DBMS_SCHEDULER 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 11.2 DBMS_SCHEDULER 使用限制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 11.3 DBMS_SCHEDULER 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 11.3.1 CREATE_PROGRAM 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 11.3.2 DROP_PROGRAM 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 11.3.3 CREATE_SCHEDULE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 11.3.4 DROP_SCHEDULE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 11.3.5 EVALUATE_CALENDAR_STRING 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . 61 11.3.6 CREATE_JOB 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 11.3.7 DROP_JOB 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 11.3.8 RUN_JOB 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 11.3.9 DISABLE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 11.3.10 ENABLE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 第 12 章 DBMS_SESSION 66 12.1 DBMS_SESSION 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 12.2 DBMS_SESSION 系统包子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 12.2.1 CLEAR_ALL_CONTEXT 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 12.2.2 CLEAR_CONTEXT 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 12.2.3 LIST_CONTEXT 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 12.2.4 SET_CONTEXT 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 第 13 章 DBMS_SQL 73 13.1 DBMS_SQL 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 13.2 DBMS_SQL 预定义类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 13.2.1 DBMS_SQL 常量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 13.2.2 DBMS_SQL 集合类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 III 目 录 13.3 DBMS_SQL 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 13.3.1 OPEN_CURSOR 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 13.3.2 PARSE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 13.3.3 BIND_VARIABLE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 13.3.4 BIND_VARIABLE_CHAR 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 13.3.5 BIND_ARRAY 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 13.3.6 BIND_VARIABLE_PKG 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 13.3.7 DEFINE_COLUMN 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 13.3.8 DEFINE_COLUMN_CHAR 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 13.3.9 DEFINE_ARRAY 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 13.3.10 EXECUTE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 13.3.11 FETCH_ROWS 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 13.3.12 EXECUTE_AND_FETCH 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 13.3.13 COLUMN_VALUE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 13.3.14 COLUMN_VALUE 存储过程 (关联数组类型) . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 13.3.15 COLUMN_VALUE_CHAR 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 13.3.16 VARIABLE_VALUE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 13.3.17 VARIABLE_VALUE 存储过程 (关联数组类型) . . . . . . . . . . . . . . . . . . . . . . . . . . 101 13.3.18 VARIABLE_VALUE_CHAR 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 13.3.19 VARIABLE_VALUE_PKG 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 13.3.20 DESCRIBE_COLUMNS 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 13.3.21 CLOSE_CURSOR 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 13.3.22 IS_OPEN 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 13.3.23 LAST_ROW_COUNT 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 13.3.24 TO_CURSOR_NUMBER 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 13.3.25 TO_REFCURSOR 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 13.3.26 RETURN_RESULT 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 13.3.27 GET_NEXT_RESULT 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 13.3.28 LAST_ERROR_POSITION 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 13.3.29 LAST_SQL_FUNCTION_CODE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 13.4 其他示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 第 14 章 DBMS_UTILITY 122 14.1 DBMS_UTILITY 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 14.2 DBMS_UTILITY 系统包子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 14.2.1 FORMAT_CALL_STACK 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 14.2.2 FORMAT_ERROR_BACKTRACE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 14.2.3 FORMAT_ERROR_STACK 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 14.2.4 GET_TIME 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 14.2.5 GET_HASH_VALUE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 第 15 章 DBMS_SQL_MONITOR 129 15.1 DBMS_SQL_MONITOR 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 IV 目 录 15.2 DBMS_SQL_MONITOR 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 15.2.1 SQL_MONITOR_RESET 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 15.2.2 REPORT_SQL_MONITOR 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 15.2.3 REPORT_SQL_MONITOR_LIST 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 15.2.4 REPORT_SQL_MONITOR_TO_FILE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 15.2.5 REPORT_SQL_MONITOR_LIST_TO_FILE 函数 . . . . . . . . . . . . . . . . . . . . . . . 135 第 16 章 OWA_UTIL 137 16.1 OWA_UTIL 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 16.2 OWA_UTIL 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 16.2.1 WHO_CALLED_ME 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 第 17 章 UTL_ENCODE 140 17.1 UTL_ENCODE 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 17.2 UTL_ENCODE 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 17.2.1 BASE64_DECODE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 17.2.2 BASE64_ENCODE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 17.2.3 QUOTED_PRINTABLE_DECODE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 17.2.4 QUOTED_PRINTABLE_ENCODE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 第 18 章 UTL_HTTP 144 18.1 UTL_HTTP 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 18.2 UTL_HTTP 数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 18.2.1 REQ 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 18.2.2 RESP 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 18.3 UTL_HTTP 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 18.3.1 BEGIN_REQUEST 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 18.3.2 SET_HEADER 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 18.3.3 GET_RESPONSE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 18.3.4 READ_LINE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 18.3.5 READ_TEXT 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 18.3.6 END_RESPONSE 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 18.3.7 END_REQUEST 存储过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 第 19 章 UTL_I18N 152 19.1 UTL_I18N 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 19.2 UTL_I18N 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 19.2.1 RAW_TO_CHAR 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 19.2.2 STRING_TO_RAW 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 第 20 章 UTL_RAW 155 20.1 UTL_RAW 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 20.2 UTL_RAW 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 20.2.1 BIT_AND 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 V 目 录 20.2.2 BIT_COMPLEMENT 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 20.2.3 BIT_OR 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 20.2.4 BIT_XOR 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 20.2.5 CAST_FROM_BINARY_DOUBLE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 20.2.6 CAST_FROM_BINARY_FLOAT 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 20.2.7 CAST_FROM_BINARY_INTEGER 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 20.2.8 CAST_FROM_NUMBER 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 20.2.9 CAST_TO_BINARY_DOUBLE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 20.2.10 CAST_TO_BINARY_FLOAT 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 20.2.11 CAST_TO_BINARY_INTEGER 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 20.2.12 CAST_TO_NUMBER 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 20.2.13 CAST_TO_RAW 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 20.2.14 CAST_TO_VARCHAR2 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 20.2.15 COMPARE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 20.2.16 CONCAT 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 20.2.17 CONVER 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 20.2.18 COPIES 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 20.2.19 LENGTH 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 20.2.20 OVERLAY 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 20.2.21 REVERSE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 20.2.22 SUBSTR 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 20.2.23 TRANSLATE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 20.2.24 TRANSLITERATE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 20.2.25 XRANGE 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 第 21 章 XMLTYPE 178 21.1 XMLTYPE 使用说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 21.2 XMLTYPE 子程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 21.2.1 CREATEXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 21.2.2 EXISTSNODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 21.2.3 EXTRACT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 21.2.4 GETCLOBVAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 21.2.5 GETNUMBERVAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 21.2.6 GETSTRINGVAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 版权声明 182 服务周期承诺 183 VI 第 1 章 前言 1 第 章 前言 PL/SQL 系统包和类型参考手册描述 KingbaseES 提供的所有系统包和类型信息。 1.1 读者 PL/SQL 系统包和类型参考手册适用于基于 PL/SQL 应用程序在 KingbaseES 上做开发的任何人,包括: • 程序员 • 系统分析师 • 项目经理 • 数据库管理员 要有效地使用本文档,需要具备以下方面的工作知识: • KingbaseES 数据库 • 结构化查询语言 (SQL) • 基本编程概念,如 IF-THEN 语句、循环、过程和函数 1.2 关联文档 有关详细信息,请参阅 KingbaseES 数据库文档库中的以下文档: • 《KingbaseES SQL 语言参考手册》 • 《KingbaseES PL/SQL 过程语言参考手册》 • 《KingbaseES 数据库插件手册》 • 《KingbaseES 数据库开发指南》 1 第 1 章 前言 1.3 手册约定 本文档中可能出现“注意、提示、警告、另请参阅”等标志,它们所代表的含义如下: 注意: 用于突出重要/关键信息、最佳实践等。 提示: 用于突出小窍门、捷径等。 警告: 用于传递设备或环境安全警示信息,若不避免,可能会导致设备损坏、数据丢失、设备性能降低或其 它不可预知的结果。 另请参阅: 用于突出参考、参阅等。 以下程序代码书写约定适用于本文档: 符号 说明 [] 表示包含一个或多个可选项。不需要输入中括号本身。 {} 表示包含两个以上(含两个)的候选,必须在其中选取一个。不需要输入花括号本身。 | 分割中括号或者花括号中的两个或两个以上选项。不需要输入“|”本身。 ... 表示其之前的元素可以被重复。 斜体 表示占位符或者需要提供特定值的变量。 大写 表示系统提供的元素,以便与用户定义的元素相互区分。除出现在方括号中的元素外,应当按 照顺序逐字输入。当然,部分元素在系统中是大小写不敏感的,因此用户可以根据系统说明以 小写形式输入。 小写 表示由用户提供的元素。 2 第 2 章 PL/SQL 系统包和类型简介 2 第 章 PL/SQL 系统包和类型简介 KingbaseES 数据库提供多种系统包和类型,以扩展数据库功能。用户可以通过应用程序直接调用系统包和类 型,也可以在创建自定义的 PL/SQL 模块时调用系统包和类型的子程序。 PL/ SQL 包对象定义包括包规范和包体两个部分,分别使用 CREATE PACKAGE 和 CREATE PACKAGE BODY 来定义。包规范是应用程序的接口,它声明了可供使用的子程序、类型、变量和异常等。包体则是子程序定 义的主体。用户可调用包规范中声明的类型和子程序,例如: package_name.type_name package_name.fuction_name package_name.procedure_name KingbaseES 还提供一些系统内置的类型对象,内置类型包含成员函数,用户可以直接调用。但从输入和输出来 看,类型也可作为简单类型使用。 更多包和类型的语法定义信息参考《KingbaseES SQL 语言参考手册》和《KingbaseES PL/SQL 过程语言参考 手册》。 此外,KingbaseES 的系统包和类型基本都是通过创建插件来实现,更多插件内容可以参考《KingbaseES 插件参 考手册》。 下表列出了 KingbaseES 所提供的系统包和类型。本文后续章节详细介绍每个系统包和类型的具体内容。 表 2.1: 系统包和类型 包名 说明 DBMS_DDL 包体、函数、过程等 DDL 语句的创建加密 DBMS_JOB 调度和管理作业任务 DBMS_LOB 对 CLOB/BLOB 大对象的读取、修改等操作 DBMS_METADATA 以 XML 或者 DDL 语句形式检索元数据 DBMS_MVIEW 可以对物化视图进行一些功能操作 见续表 3 第 2 章 PL/SQL 系统包和类型简介 表 2.1 – 续表 包名 说明 DBMS_OBFUSCATION_TOOLKIT DES 或 3DES 算法数据加密/解密,MD5 加密 DBMS_OUTPUT 文本打印和输出功能 DBMS_RANDOM 产生随机数和随机字符 DBMS_SCHEDULER 调度和管理作业任务 DBMS_SESSION 访问或者设置会话信息 DBMS_SQL 动态 SQL 语句操作 DBMS_SQL_MONITOR SQL 监控功能 DBMS_UTILITY 查看错误堆栈、时间等信息 OWA_UTIL 提供调用 PL/SQL 代码单元的信息 UTL_ENCODE RAW 类型的编码转换操作 UTL_HTTP 提供 KingbaseES 的 http 客户端,允许在数据库内检索网页 UTL_I18N RAW 类型的编码转换操作 UTL_RAW RAW 类型数据操作 XMLTYPE 处理 XML 数据的系统内置类型 4 第 3 章 DBMS_DDL 3 第 章 DBMS_DDL DBMS_DDL 系统包支持对支持包体、函数、过程 DDL 语句的加密操作,可以在存储过程、函数、触发器等 PL/SQL 命名块和匿名块中执行 DDL 语句。 3.1 DBMS_DDL 使用说明 使用 DBMS_DDL 系统包依赖 dbms_ddl 插件,dbms_ddl 插件为初始化数据库实例时默认创建。更多 dbms_ddl 插件信息参考《KingbaseES 插件参考手册》中的 dbms_ddl 章节。 3.2 DBMS_DDL 子程序 表DBMS_DDL 子程序 列出了系统包 DBMS_DDL 所提供的子程序。 表 3.2.1: DBMS_DDL 子程序 子程序名称 说明 WRAP 函数 加密过程对象的 DDL 语句,但不执行语句 CREATE_WRAPPED 存储过程 加密并执行过程对象的 DDL 语句 3.2.1 WRAP 函数 WRAP 函数加密过程对象(包体、函数、过程)的 DDL 语句,但不执行语句。 函数 WRAP 以 CREATE [ OR REPLACE ] 语句作为输入,指定创建包体、函数、过程。并返回 CREATE [ OR REPLACE ] 语句的加密语句。 语法 5 第 3 章 DBMS_DDL DBMS_DDL.WRAP (ddl VARCHAR2) RETURN VARCHAR2; 参数说明 ddl 指定用于创建一个包体、函数、过程的 CREATE [ OR REPLACE ] 语句。 返回值说明 返回 32k 字节以内已加密的字符串。 注意事项 • 任何试图调用该子程序的语句都应使用标准的包名 SYS.DBMS_DDL 或者直接调用 DBMS_DDL.WRAP,以 避免与本地定义的 DBMS_DDL 同义。 • 不能对 trigger 进行加密,如果需要对 trigger 进行加密请直接加密函数,然后通过触发器去调用该函数即可。 • 支持 $$...$$ 的 pg 语法加密。可以加密使用 $$..$$ 的 PG 语法的 PLSQL 对象。 • 通过 DBMS_DDL.WRAP 加密的 PL/SQL 语句会一直保留注释。注释方式为:’--’或者’/.../’ 异常说明 如果不是 CREATE [ OR REPLACE ] 指定的语句,则报错“向 DBMS_DDL.WRAP 输入的内容不是合法的 PL/SQL 单元”。 示例 为 PL/SQL 语句和 PL/pgSQL 语句加密,用例如下。 \set SQLTERM / SELECT DBMS_DDL.WRAP( 'create or replace function func4 RETURN int is BEGIN NULL; RETURN 3; END;'); / wrap -------------------------------------------------------------create or replace function func4 RETURN int is WRAPPED+ htpt6DqPHq8uEHewSse+kc8myKyoI7I9f5mTI2Ob72I= + END; (1 row) \set SQLTERM / SELECT DBMS_DDL.WRAP( 'CREATE OR replace function func_test() RETURNs int AS $$ 6 第 3 章 DBMS_DDL BEGIN RETURN 1; END $$language plpgsql;'); / wrap -----------------------------------------------------------------CREATE OR replace function func_test() RETURNs int AS $$ WRAPPED+ EmUKDO9/8ueGxdvzZRYwU3o6X3YY9jZ6FeYIauqV+oM= + END; + $$language plpgsql; (1 row) 3.2.2 CREATE_WRAPPED 存储过程 CREATE_WRAPPED 存储过程用于加密并执行过程对象(包体、函数、过程)的 DDL 语句。它的实现流程 是将输入参数的 CREATE [ OR REPLACE ] 语句转换为加密后的 CREATE [ OR REPLACE ] 语句,并执行转换后 语句。实际上,该过程将加密与创建语句合为一体。 语法 DBMS_DDL.CREATE_WRAPPED (ddl VARCHAR2); 参数说明 ddl 指定用于创建一个 PL/SQL 包体、函数、过程的 CREATE [ OR REPLACE ] 语句。 注意事项 • 任何试图调用这些 PL/SQL 代码都应使用标准的包名 SYS.DBMS_DDL 以避免与本地定义的 DBMS_DDL 同 义。 • CREATE_WRAPPED 过程与 WRAP 函数一次只能输入单条 PL/SQL 或 PL/pgSQL 语句。 • 不能对 trigger 进行加密,如果需要对 trigger 进行加密请先加密函数,然后通过触发器去调用该函数。 • 支持 $$...$$ 的 pg 语法加密。可以加密使用 $$..$$ 的 pg 语法的 PL/SQL 对象。 异常说明 如果不是 CREATE [ OR REPLACE ] 指定的 PL/SQL 语句,则报错“向 DBMS_DDL.WRAP 输入的内容不是 合法的 PL/SQL 单元”。 示例 以下用例为使用 CREATE_WRAPPED 子程序创建加密的 PL/SQL 语句和 PL/pgSQL 语句。 7 第 3 章 DBMS_DDL \set SQLTERM / EXEC DBMS_DDL.CREATE_WRAPPED( 'CREATE OR REPLACE FUNCTION func4 RETURN INT IS BEGIN NULL; RETURN 3; END;'); / \set SQLTERM / EXEC DBMS_DDL.CREATE_WRAPPED( 'CREATE OR REPLACE FUNCTION func_test() RETURNS INT AS $$ BEGIN RETURN 1; END $$language plpgsql;'); / 8 第 4 章 DBMS_JOB 4 第 章 DBMS_JOB DBMS_JOB 系统包提供调度和管理作业任务的功能。该包功能可以由 DBMS_SCHDULE 包替代。 4.1 DBMS_JOB 使用说明 使用 DBMS_JOB 系统包依赖 kdb_schedule 插件,需要在 kdb_schedule 插件加载之后才可以使用 DBMS_JOB 系统包。将 kdb_schedule 添加到 kingbase.conf 文件的 shared_preload_libraries 中,并重启数据库,再创建 kdb_schedule 扩展: shared_preload_libraries = 'kdb_schedule' # (change requires restart) CREATE EXTENSION kdb_schedule; 更多 kdb_schedule 插件信息参考《KingbaseES 插件参考手册》中的 kdb_schedule 章节。 4.2 DBMS_JOB 使用限制 DBMS_JOB 具有如下使用限制: 1. 仅支持 PL/SQL 类型的任务; 2. 仅支持本地任务; 3. 间隔时间采用日历表示法,详细信息参见《KingbaseES 插件参考手册》中的 kdb_schedule 章节的 日历表示 法。 4.3 DBMS_JOB 子程序 表DBMS_JOB 子程序 列出了系统包 DBMS_JOB 所提供的子程序。 9 第 4 章 DBMS_JOB 表 4.3.1: DBMS_JOB 子程序 子程序名称 说明 BROKEN 存储过程 中止一个处于可执行状态的 job CHANGE 存储过程 更改 job 的运行参数 INSTANCE 存储过程 增加 job 执行的连接串信息。 INTERVAL 存储过程 更改 job 运行的时间 NEXT_DATE 存储过程 更改 job 下一次的运行时间 REMOVE 存储过程 删除一个 job RUN 存储过程 立即运行指定的 job SUBMIT 存储过程 创建一个 job WHAT 存储过程 更改 job 执行的动作 4.3.1 BROKEN 存储过程 BROKEN 存储过程将 job 设置为中止。设置为中止的 job 不会再运行。 语法 DBMS_JOB.BROKEN( job INTEGER, broken BOOLEAN, next_date TIMESTAMP DEFAULT now()); 参数说明 job 由系统分配的 job 的 ID。 broken 将 job 设置为 enable 或者 disable。true 为 disable,false 为 enable。 next_date job 运行的下一个日期。 示例 10 第 4 章 DBMS_JOB CALL DBMS_JOB.SUBMIT(1, 'CREATE TABLE T1(A int)', now(), 'Freq=daily;BYHOUR=10;BYMINUTE=10;BYSECOND=10', false, 0, false); CALL DBMS_JOB.INSTANCE(1, 'user=system dbname=test port=54321 password=123456'); CALL DBMS_JOB.BROKEN(1,TRUE,now()); 4.3.2 CHANGE 存储过程 CHANGE 存储过程用于更改 job 中的属性信息。 语法 DBMS_JOB.CHANGE( job INTEGER, what TEXT, next_date TIMESTAMP, interva TEXT, instance INTEGER DEFAULT 0, force BOOLEAN DEFAULT FALSE); 参数说明 job 由系统分配的 job 的 ID。 what job 要运行的 PL/SQL。 next_date job 运行的下一个日期。 interva job 运行的间隔时间。 instance 默认固定置为 0。 force 暂不支持,默认固定置为 FALSE。 示例 CALL DBMS_JOB.CHANGE(1, 'CREATE TABLE T1(a INT);', now(), 'Freq=daily;BYHOUR=10;BYMINUTE=10;BYSECOND=10', 0, false); 11 第 4 章 DBMS_JOB 4.3.3 INSTANCE 存储过程 INSTANCE 存储过程用于增加 job 执行的连接串信息。 语法 DBMS_JOB.INSTANCE( job INTEGER, instance TEXT); 参数说明 job 由系统分配的 job 的 ID。 instance job 要运行数据库的连接串。 示例 CALL DBMS_JOB.INSTANCE(1, 'user=system dbname=test port=54321 password=123456'); 4.3.4 INTERVAL 存储过程 INTERVAL 存储过程用于更改 job 中的间隔时间属性。 语法 DBMS_JOB.INTERVAL( job INTEGER, interva TEXT); 参数说明 job 由系统分配的 job 的 ID。 interva job 运行的间隔时间。 示例 CALL DBMS_JOB.INTERVAL(1, 'Freq=daily;BYHOUR=10;BYMINUTE=10;BYSECOND=10'); 12 第 4 章 DBMS_JOB 4.3.5 NEXT_DATE 存储过程 NEXT_DATE 存储过程用于更改 job 中的下次运行时间信息。 语法 DBMS_JOB.NEXT_DATE( job INTEGER, next_date TIMESTAMP); 参数说明 job 由系统分配的 job 的 ID。 next_date job 运行的下一个日期。 示例 CALL DBMS_JOB.NEXT_DATE(1, now()); 4.3.6 REMOVE 存储过程 REMOVE 存储过程用于删除 job。 语法 DBMS_JOB.REMOVE( job INTEGER); 参数说明 job 由系统分配的 job 的 ID。 示例 CALL DBMS_JOB.REMOVE(1); 4.3.7 RUN 存储过程 RUN 存储过程用于 job 的运行。 语法 13 第 4 章 DBMS_JOB DBMS_JOB.RUN( job INTEGER); 参数说明 job 由系统分配的 job 的 ID。 示例 CALL DBMS_JOB.SUBMIT(1, 'CREATE TABLE T1(A int)', now(), 'Freq=daily;BYHOUR=10;BYMINUTE=10;BYSECOND=10', false, 0, false); CALL DBMS_JOB.INSTANCE(1, 'user=system dbname=test port=54321 password=123456'); CALL DBMS_JOB.RUN(1); 4.3.8 SUBMIT 存储过程 SUBMIT 存储过程用于创建 job。 语法 DBMS_JOB.SUBMIT( OUT job INTEGER, what text, next_date TIMESTAMP DEFAULT now(), interva text DEFAULT NULL, no_parse BOOLEAN DEFAULT FALSE, instance INTEGER DEFAULT 0, force BOOLEAN DEFAULT FALSE); 参数说明 job 由系统分配的 job 的 ID。 what job 要运行的 PL/SQL。 next_date job 运行的下一个日期。 interva job 运行的间隔时间。 no_parse 14 第 4 章 DBMS_JOB 默认固定置为 FALSE。 instance 默认固定置为 0。 force 默认固定置为 FALSE。 示例 \set SQLTERM / DECLARE JOBID INT; BEGIN DBMS_JOB.SUBMIT(jobid, 'CREATE TABLE T1(A int)', now(), 'Freq=daily;BYHOUR=10;BYMINUTE=10;BYSECOND=10', false, 0, false); END; / \set SQLTERM ; 4.3.9 WHAT 存储过程 WHAT 存储过程用于更改 job 执行的行为信息。 语法 DBMS_JOB.WHAT( job INTEGER, what TEXT); 参数说明 job 由系统分配的 job 的 ID。 what job 要运行的 PL/SQL。 示例 CALL DBMS_JOB.WHAT(1, 'CREATE TABLE T1(a INT);'); 15 第 5 章 DBMS_LOB 5 第 章 DBMS_LOB DBMS_LOB 系统包支持对 CLOB/BLOB 大对象进行读取、修改等操作。 5.1 DBMS_LOB 使用说明 使用 DBMS_DDL 系统包依赖 dbms_lob 插件,需要在 dbms_lob 插件加载之后才可以使用 DBMS_DDL 系统 包。将 dbms_lob 添加到 kingbase.conf 文件的 shared_preload_libraries 中,并重启数据库,再创建 dbms_lob 扩 展: shared_preload_libraries = 'dbms_lob' # (change requires restart) CREATE EXTENSION dbms_lob; 更多 dbms_lob 插件信息参考《KingbaseES 插件参考手册》中的 dbms_lob 章节。 5.2 DBMS_LOB 子程序 表DBMS_LOB 子程序 列出了系统包 DBMS_DDL 所提供的子程序。 表 5.2.1: DBMS_LOB 子程序 子程序名称 说明 APPEND 存储过程 将一个 CLOB/BLOB 大对象的内容追加到另一个大对象上 COMPARE 函数 对两个 CLOB 对象进行比较 COPY 存储过程 拷贝 CLOB/BLOB 大对象 CREATETEMPORARY 存储过程 创建一个空的 CLOB 或者 BLOB 见续表 16 第 5 章 DBMS_LOB 表 5.2.1 – 续表 子程序名称 说明 ERASE 存储过程 移除 CLOB 或 BLOB 对象中指定长度的子串 FREETEMPORARY 存储过程 释放临时的 CLOB/BLOB 大对象 GETLENGTH 函数 返回 CLOB/BLOB 对象包含的字符或字节长度 INSTR 函数 返回给定字符子串在 CLOB 对象中出现的位置 ISTEMPORARY 函数 判断一个 CLOB/BLOB 对象是否是临时的 READ 存储过程 读取 CLOB 或 BLOB 对象中指定部分到缓冲区对象 SUBSTR 函数 从一个 CLOB 对象中截取一个子串 TRIM 存储过程 截取 CLOB 或 BLOB 对象指定长度的子串 WRITEAPPEND 函数 将缓冲区对象中的字符/字节串追加到 CLOB/BLOB 大对象上 5.2.1 APPEND 存储过程 APPEND 存储过程将两个 CLOB/BLOB 大对象的内容结合,给出两个大对象 dest_lob 和 src_lob,把 src_lob 的内容追加到 dest_lob 中。 语法 APPEND( dest_lob IN OUT CLOB, src_lob IN CLOB ); APPEND( dest_lob IN OUT NOCOPY BLOB, src_lob IN BLOB ); 参数说明 dest_lob 该参数是一个传入的 CLOB/BLOB 大对象,要把另外一个大对象 src_lob 的内容追加到其后。 src_lob 该参数是一个传入的 CLOB/BLOB 大对象,要把该对象内容追加到 dest_lob。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0060() RETURN CLOB AS DECLARE myclob CLOB; BEGIN DBMS_LOB.CREATETEMPORARY( myclob, true); 17 第 5 章 DBMS_LOB DBMS_LOB.APPEND(myclob,'hello'::CLOB ); RETURN myclob; END; / \set SQLTERM ; SELECT test0060(); test0060 ---------hello 5.2.2 COMPARE 函数 COMPARE 函数对给定的两个 CLOB 对象进行比较,并且是从指定的起始字符位置,对指定数量的字符进行比 较。 语法 compare(lob_loc1 CLOB, lob_loc2 CLOB, amount INT, offset1 INT DEFAULT 1, offset2 INT DEFAULT 1) RETURN INTEGER; 参数说明 lob_loc 传入的两个 CLOB 大对象。 amount 指定需要比较的字符数量。 offset 指定比较的起始字符位置,offset1 和 offset2 分别是 lob_loc1 和 lob_loc2 的起始字符位置。默认值为 1, 1 表示从第 1 个字符开始比较。 返回值说明 返回整数 0 表示相等,非 0 表示不相等。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0090() RETURNS INT AS DECLARE v1 CLOB := '你好'; DECLARE v2 CLOB := '你好吗'; DECLARE v3 INT :=1 ; BEGIN 18 第 5 章 DBMS_LOB v3=DBMS_LOB.COMPARE(v2,v1,1,1,1); RETURN v3; END; / \set SQLTERM ; SELECT * FROM test0090(); test0090 ---------0 (1 row) 5.2.3 COPY 存储过程 COPY 存储过程用于拷贝源 CLOB 或 BLOB 对象中指定的部分子串,到目标 CLOB 或 BLOB 对象的指定位 置,替换目标对象起始位置和长度指定的子串部分。如果目标对象指定拷贝的起始位置超出其原始长度,则在目标对 象之后的起始位置附加源对象子串。原目标对象结尾和附加子串起始位置之间 CLOB 用空格填充,BLOB 用 0 填 充。 语法 COPY(dest_lob IN OUT CLOB, src_lob IN CLOB, amount IN INT, dest_offset IN INT DEFAULT 1, src_offset IN INT DEFAULT 1); COPY(dest_lob IN OUT BLOB, src_lob IN BLOB, amount IN INT, dest_offset IN INT DEFAULT 1, src_offset IN INT DEFAULT 1); 参数说明 dest_lob 目标 CLOB 或 BLOB 大对象。 src_lob 源 CLOB 或 BLOB 大对象。 amount 要拷贝的字符或字节长度。 dest_offset 目标对象要开始拷贝替换的起始位置,默认值为 1。开头位置以 1 开始计数。 src_offset 源对象要开始拷贝读取的起始位置,默认值为 1。开头位置以 1 开始计数。 返回值说明 19 第 5 章 DBMS_LOB 1. 如果 dest_lob, src_lob amout, dest_offset, src_offset 任一输入为 NULL,抛出异常; 2. 如果 amount 小于 1 或大于 MAXLOBSIZE(1073741824),抛出异常; 3. 如果 dest_offset 小于 1 或大于 MAXLOBSIZE(1073741824),抛出异常; 4. 如果 src_offset 小于 1 或大于 MAXLOBSIZE(1073741824),抛出异常; 5. 否则 dest_lob 返回复制后的 CLOB 或 BLOB 对象。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0130() RETURNS CLOB AS DECLARE v1 CLOB := '一二三四'; DECLARE v2 CLOB := 'abcd'; DECLARE v3 INT :=1 ; DECLARE v4 INT :=2 ; DECLARE v5 INT :=1 ; BEGIN dbms_lob.copy(v2,v1,v4,v3,v5); RETURN v2; END; / \set SQLTERM ; SELECT * FROM test0130(); test0130 ---------一二 cd (1 row) 5.2.4 CREATETEMPORARY 存储过程 CREATETEMPORARY 存储过程用于创建一个空的 CLOB 或者 BLOB。 语法 CREATETEMPORARY(lob_loc IN OUT CLOB, cache IN BOOLEAN, dur IN INTEGER DEFAULT 1); CREATETEMPORARY(lob_loc IN OUT BLOB, cache IN BOOLEAN, dur IN INTEGER DEFAULT 1); 参数说明 lob_loc 目前该参数是 OUT。 cache 20 第 5 章 DBMS_LOB 所有的临时大对象都在内存中。 dur 目前都是 SESSION 级别的。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0010() RETURN CLOB AS DECLARE myclob CLOB ; BEGIN DBMS_LOB.CREATETEMPORARY( myclob, true, DBMS_LOB.SESSION); RETURN myclob; END; / \set SQLTERM ; SELECT test0010(); test0010 ---------(1 row) 5.2.5 ERASE 存储过程 ERASE 存储过程用于移除 CLOB 或 BLOB 对象中指定长度的子串。其中,CLOB 对象移除部分用空格填充, BLOB 对象移除部分用 0 填充。如果指定长度超出了 CLOB 或 BLOB 对象结尾,则移除字符截止到 CLOB 或 BLOB 对象结尾,实际移除长度通过 amount 参数返回。 语法 ERASE(lob_loc IN OUT CLOB, amount IN OUT INT, start_offset IN INT DEFAULT 1); ERASE(lob_loc IN OUT BLOB, amount IN OUT INT, start_offset IN INT DEFAULT 1); 参数说明 lob_loc 传入的 CLOB 或 BLOB 大对象。 amount 输入要移除的子串长度。 start_offset 要移除字符的起始位置,默认值为 1,1 代表从第 1 个字符开始。 21 第 5 章 DBMS_LOB 返回值说明 1. 如果 lob_loc,amount,start_offset 任一输入为 NULL,抛出异常; 2. 如果 amount 小于 1 或大于 MAXLOBSIZE(1073741824),抛出异常; 3. 如果 start_offset 小于 1 或大于 MAXLOBSIZE(1073741824),抛出异常; 4. 否则 lob_loc 返回移除后的 CLOB/BLOB 对象,amount 返回实际移除的字节长度。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0120() RETURNS CLOB AS DECLARE v1 CLOB := 'abcd'; DECLARE v2 INT :=1 ; DECLARE v3 INT :=2 ; BEGIN DBMS_LOB.ERASE(v1,v2,v3); RETURN v1; END; / \set SQLTERM ; SELECT * FROM test0120(); test0120 ---------a cd (1 row) 5.2.6 FREETEMPORARY 存储过程 FREETEMPORARY 存储过程用于释放临时的 CLOB/BLOB 大对象。 语法 FREETEMPORARY(lob_loc IN CLOB); FREETEMPORARY(lob_loc IN BLOB); 参数说明 lob_loc 该参数是一个传入的 CLOB/BLOB 大对象。 示例 22 第 5 章 DBMS_LOB -- dbms_lob.substr \set SQLTERM / CREATE OR REPLACE FUNCTION test0050() RETURNS VARCHAR AS DECLARE v1 CLOB; DECLARE v3 VARCHAR; DECLARE INTEGER; i BEGIN DBMS_LOB.CREATETEMPORARY(v1,true); DBMS_LOB.APPEND(v1,'hello world'::CLOB); v3= dbms_lob.substr(v1); DBMS_LOB.FREETEMPORARY(v1); RETURN v3; END; / \set SQLTERM ; SELECT * FROM test0050(); test0050 ------------hello world (1 row) 5.2.7 GETLENGTH 函数 GETLENGTH 函数返回给定的 CLOB 或 BLOB 对象包含的字符长度或字节长度。 语法 GETLENGTH(lob_loc CLOB) RETURN INT4; GETLENGTH(lob_loc BLOB) RETURN INT4; 参数说明 lob_loc 传入的 CLOB 或 BLOB 大对象。 返回值说明 返回整数,表示 CLOB 中字符长度或 BLOB 中的字节长度。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0100() RETURNS INT AS 23 第 5 章 DBMS_LOB DECLARE v1 CLOB := 'abcd 1234'; DECLARE v3 INT :=1 ; BEGIN SELECT DBMS_LOB.GETLENGTH(v1) INTO v3; RETURN v3; END; / \set SQLTERM ; SELECT * FROM test0100(); test0100 ---------9 (1 row) 5.2.8 INSTR 函数 INSTR 函数返回给定字符子串在 CLOB 对象中出现的位置,并且可以指定从第几个字符开始匹配和匹配第几次 出现的子串。 语法 INSTR(lob_loc CLOB, pattern VARCHAR, offsets INT DEFAULT 1, nth INT DEFAULT 1) RE- TURN INTEGER; 参数说明 lob_loc 该参数是一个传入的 CLOB 大对象,要在这个 CLOB 中查找给定的子串。 pattern 需要匹配的字符子串。 offset 指定 lob_loc 中的第几个字符开始搜索子串,默认为 1,1 表示从第 1 个字符开始搜索。 nth 在 lob_loc 中查找第几次出现的子串 pattern, 默认为 1,1 表示第 1 次出现。 返回值说明 返回整数,表示第 nth 个匹配的字符位置。如果匹配子串没有找到,则返回 0。 示例 24 第 5 章 DBMS_LOB \set SQLTERM / CREATE OR REPLACE FUNCTION test0080() RETURNS INT AS DECLARE v1 CLOB := 'hello world world'; DECLARE v2 VARCHAR := 'world'; DECLARE v3 INT :=1 ; BEGIN v3 = DBMS_LOB.INSTR(v1,v2,1,3); RETURN v3; END; / \set SQLTERM ; SELECT * FROM test0080(); test0080 ---------0 (1 row) 5.2.9 ISTEMPORARY 函数 ISTEMPORARY 函数用于判断一个 CLOB/BLOB 对象是否是临时的。 语法 ISTEMPORARY(lob_loc IN CLOB) RETURN BOOLEAN; ISTEMPORARY(lob_loc IN BLOB) RETURN BOOLEAN; 参数说明 lob_loc 该参数是一个传入的 CLOB/BLOB 大对象。 返回值说明 如果传入参数是 NULL 则返回 NULL 如果入参大对象是临时的则返回 TRUE 否则返回 FALSE。 示例 \set SQLTERM / create or replace function test0020() RETURN BOOL AS DECLARE myclob CLOB ; DECLARE bval BOOL; BEGIN dbms_lob.createtemporary( myclob, true, dbms_lob.SESSION); 25 第 5 章 DBMS_LOB bval = dbms_lob.istemporary( myclob ); RETURN bval; END; / \set SQLTERM ; SELECT test0020(); test0020 ---------f (1 row) 5.2.10 READ 存储过程 READ 存储过程用于读取 CLOB 或 BLOB 对象中指定部分到缓冲区对象。 语法 READ(lob_loc IN CLOB, amount IN OUT INT, start_offset IN INT, buffer OUT VARCHAR2); READ(lob_loc IN BLOB, amount IN OUT INT, start_offset IN INT, buffer OUT RAW); 参数说明 lob_loc 传入的 CLOB 或 BLOB 对象。 amount 输入要读取字符串的字节长度。 start_offset 要读取字符的起始位置。开头位置以 1 开始计数。 返回值说明 1. 如果 lob_loc,amount,start_offset 任一输入为 NULL,抛出异常; 2. 如果 amount 小于 1 或大于 32767,抛出异常; 3. 如果 start_offset 小于 1 或大于 MAXLOBSIZE(1073741824),抛出异常; 4. 否则 buffer 返回读取的 BLOB 子串;amount 返回实际读取的子串长度,如果 start_offset 超出原对象长度, 则 amount 返回 0。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0140() 26 第 5 章 DBMS_LOB RETURNS VARCHAR2 AS DECLARE v2 CLOB := 'abcd'; DECLARE v3 INT :=1 ; DECLARE v5 INT :=1 ; DECLARE buffer VARCHAR2; BEGIN DBMS_LOB.READ(v2,v3,v5,buffer); RETURN buffer; END; / \set SQLTERM ; SELECT * FROM test0140(); test0140 ---------a (1 row) 5.2.11 SUBSTR 函数 SUBSTR 函数从一个 CLOB 对象中截取一个子串,并用子串构建且返回一个新的 VARCHAR 字符串。 语法 DBMS_LOB.SUBSTR(lob_loc CLOB, amount INT DEFAULT 32767 , offsets INT DEFAULT 1 ) RETURNS VARCHAR; 参数说明 lob_loc 该参数是一个传入的 CLOB 大对象,要从这个 CLOB 对象中截取子串。 amount 指定从 lob_loc 提取字符个数,默认值是 32767。 offsets 指定从 dest_lob 的第几个字符开始提取子串,默认值是 1,1 表示第一个字符。 返回值说明 返回截取出来的子串。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0051() RETURNS INTEGER AS 27 第 5 章 DBMS_LOB DECLARE v1 CLOB := 'hello 人大金仓 database'; DECLARE v3 CLOB; BEGIN v3= DBMS_LOB.SUBSTR(v1,0, 7); RETURN DBMS_LOB.GETLENGTH(v3); END; / \set SQLTERM ; SELECT * FROM test0051(); test0051 ---------(1 row) 5.2.12 TRIM 存储过程 TRIM 存储过程截取 CLOB 或 BLOB 对象指定长度的子串。 语法 TRIM(lob_loc IN OUT CLOB, newlen INT); TRIM(lob_loc IN OUT BLOB, newlen INT); 参数说明 lob_loc 传入的 CLOB 或 BLOB 大对象。 newlen 截取后长度。 返回值说明 1. 如果 lob_loc 为 NULL,抛出异常;� 2. 如果 newlen 小于 1 或大于 MAXLOBSIZE(1073741824),抛出异 常; 3. 否则 lob_loc 返回截取后的 CLOB 或 BLOB 对象。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0110() RETURNS CLOB AS DECLARE v1 CLOB := 'abcd'; DECLARE v3 INT :=1 ; 28 第 5 章 DBMS_LOB BEGIN DBMS_LOB.TRIM(v1,v3); RETURN v1; END; / \set SQLTERM ; SELECT * FROM test0110(); test0110 ---------a (1 row) 5.2.13 WRITEAPPEND 函数 WRITEAPPEND 函数把 VARCHAR 或 RAW 类型 buffer 中一定数量的字符串或字节串,追加到 CLOB 或 BLOB 对象中。 语法 WRITEAPPEND(lob_loc IN OUT CLOB, amount IN INTEGER, buffer IN VARCHAR); WRITEAPPEND(lob_loc IN OUT BLOB, amount IN INTEGER, buffer IN RAW); 参数说明 lob_loc 该参数是一个传入的 CLOB 或 BLOB 大对象,要向这个 CLOB 或 BLOB 对象追加字符串或字节串。 amount 向 lob_loc 追加的字符数或字节数。 offsets 把 buffer 中一定数量的字符串或字节串追加到 lob_loc 中。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0070() RETURNS CLOB AS DECLARE v1 CLOB := 'hello'; DECLARE v2 VARCHAR := 'world'; BEGIN DBMS_LOB.WRITEAPPEND(v1,2,v2); RETURN v1; END; 29 第 5 章 DBMS_LOB / \set SQLTERM ; SELECT test0070(); test0070 ---------hellowo (1 row) 30 第 6 章 DBMS_METADATA 6 第 章 DBMS_METADATA DBMS_METADATA 系统包提供的从数据库字典中以 XML 或者 DDL 语句形式检索元数据的一系列函数和过 程。 6.1 DBMS_METADATA 使用说明 使用 DBMS_METADATA 系统包依赖 dbms_metadata 插件,需要创建 dbms_metadata 扩展后才可以使用 DBMS_METADATA 系统包: CREATE EXTENSION dbms_metadata; 更多 dbms_metadata 插件信息参考《KingbaseES 插件参考手册》中的 dbms_metadata 章节。 6.2 DBMS_METADATA 子程序 表DBMS_METADATA 子程序 列出了系统包 DBMS_METADATA 所提供的子程序。 表 6.2.1: DBMS_METADATA 子程序 子程序名称 说明 GET_DDL 函数 获取创建特定类型对象的 DDL 语句 6.2.1 GET_DDL 函数 GET_DDL 函数用于获取创建特定类型对象的 DDL 语 句。 兼 容 ORACLE 的 DBMS_METADATA.GET_DDL() 函数。目前可支持获取以下类型对象的 DDL: • TABLE 31 第 6 章 DBMS_METADATA • VIEW • INDEX • FUNCTION • PROCEDURE • TRIGGER • SEQUENCE • DBLINK • SYNONYM • PACKAGE • OBJECT TYPE 语法 DBMS_METADATA.GET_DDL( objtype VARCHAR2(63), objname VARCHAR2(63), schema VARCHAR2(63) DEFAULT NULL, version VARCHAR2(63) DEFAULT NULL, model VARCHAR2(63) DEFAULT NULL, transform VARCHAR2(63) DEFAULT NULL); 参数说明 objtype 指定对象的数据类型。 objname 指定对象名。 schema 指定对象的模式名,默认值是 null。 version 指定元数据的版本,默认值是 null。 model 指定要使用的对象的模型,默认值是 null。 transform 指定输出转换的名称,默认值是 null。 32 第 6 章 DBMS_METADATA 注意: 1. version,model,transform 这三个参数值在目前的 KingbaseES 中暂时不做处理。 2. 参数内容大小写不敏感。 返回值说明 TEXT 类型,返回指定对象的 DDL 语句。暂不支持指定输出转换类型。 1. 对于 TABLE 类型的对象,该函数的返回值包含以下内容: • SCHEMA 名; • TABLE 名; • 列名,列的数据类型,默认值,约束; • FOREIGN KEY;(如果存在) • PARTITION 类型和字段;(如果存在) 2. 返回的 TEXT 对象内容全为大写。 示例 --TABLE CREATE TABLE test_tab1( a SMALLSERIAL, b INT, c TEXT, d TEXT DEFAULT 'KB', e TEXT ) PARTITION BY HASH(a,c,e); SELECT DBMS_METADATA.GET_DDL('table', 'test_tab1'); get_ddl --------------------------------CREATE TABLE PUBLIC.TEST_TAB1( + A SMALLSERIAL NOT NULL, + B INTEGER, + C TEXT, + D TEXT DEFAULT 'KB'::TEXT, + E TEXT + ) + PARTITION BY HASH (A, C, E) + --FUNCTION CREATE FUNCTION test_func1(text, date) RETURNS bool LANGUAGE 'sql' AS 'SELECT $1 = ''abcd'' AND $2 > ''200101-01'''; 33 第 6 章 DBMS_METADATA SELECT DBMS_METADATA.GET_DDL('FUNCTION', 'TEST_FUNC1'); get_ddl --------------------------------------------------------------------CREATE OR REPLACE FUNCTION PUBLIC.TEST_FUNC1(TEXT, PG_CATALOG.DATE)+ RETURNS BOOLEAN + LANGUAGE SQL + AS $FUNCTION$SELECT $1 = 'ABCD' AND $2 > '2001-01-01'$FUNCTION$ + --INDEX CREATE TABLE test_tab5(a VARCHAR(32), b VARCHAR(32)); CREATE INDEX idx5 ON test_tab5((a||' '||b)); SELECT DBMS_METADATA.GET_DDL('INDEX', 'idx5'); get_ddl ---------------------------------------------------------------------------------------------------CREATE INDEX IDX5 ON PUBLIC.TEST_TAB5 USING BTREE (((((A)::TEXT || ' '::TEXT) || (B) ::TEXT))) + 34 第 7 章 DBMS_MVIEW 7 第 章 DBMS_MVIEW DBMS_MVIEW 系统包可以对物化视图进行一些功能操作。 7.1 DBMS_MVIEW 使用说明 使用 DBMS_MVIEW 系统包依赖 dbms_mview 插 件, 需 要 创 建 dbms_mview 扩展后才可以使用 DBMS_MVIEW 系统包: CREATE EXTENSION dbms_mview; 更多 dbms_mview 插件信息参考《KingbaseES 插件参考手册》中的 dbms_mview 章节。 7.2 DBMS_MVIEW 子程序 表DBMS_MVIEW 子程序 列出了系统包 DBMS_MVIEW 所提供的子程序。 表 7.2.1: DBMS_MVIEW 子程序 子程序名称 说明 REFRESH 存储过程 刷新不是同一刷新组的一或多个物化视图 7.2.1 REFRESH 存储过程 REFRESH 存储过程刷新不是同一刷新组的一或多个物化视图。 语法 35 第 7 章 DBMS_MVIEW DBMS_MVIEW.REFRESH ( list IN method VARCHAR2, IN VARCHAR2 DEFAULT NULL,, rollback_seg IN VARCHAR2 push_deferred_rpc IN refresh_after_errors DEFAULT NULL, BOOLEAN IN DEFAULT TRUE, BOOLEAN DEFAULT FALSE, purge_option IN INTEGER DEFAULT 1, parallelism IN INTEGER DEFAULT 0, heap_size IN BINTEGER DEFAULT 0, atomic_refresh nested IN IN BOOLEAN DEFAULT TRUE, out_of_place BOOLEAN IN DEFAULT FALSE, BOOLEAN DEFAULT FALSE); 参数说明 list VARCHAR2 类型,待刷新的物化视图名称。 method VARCHAR2 类型,默认值为 null 。刷新物化视图的方式 c(只支持完全刷新),否则会报错。 注意: 目前实现 “list“ 和 method 参数功能,其他参数暂时只支持语法。 示例 CREATE TABLE matview (id INT,name TEXT); CREATE MATERIALIZED VIEW mymatview AS SELECT * FROM matview; CALL DBMS_MVIEW.REFRESH ('mymatview', 'c'); 36 第 8 章 DBMS_OBFUSCATION_TOOLKIT 8 第 章 DBMS_OBFUSCATION_TOOLKIT DBMS_OBFUSCATION_TOOLKIT 系统包提供 DES 或 3DES 算法进行数据的加解密。同时,该包也提供了 数据的 MD5 计算接口。 8.1 DBMS_OBFUSCATION_TOOLKIT 使用说明 使用 dbms_obfuscation_toolkit 系统包依赖 dbms_obfuscation_toolkit 插 件, 需 要 创 建 dbms_obfuscation_toolkit 扩展后才可以使用 dbms_obfuscation_toolkit 系统包: CREATE EXTENSION dbms_obfuscation_toolkit; 更多 dbms_obfuscation_toolkit 插件信息参考《KingbaseES 插件参考手册》中的 dbms_obfuscation_toolkit 章 节。 8.2 DBMS_OBFUSCATION_TOOLKIT 使用限制 1. DBMS_OBFUSCATION_TOOLKIT 包函数目前支持 bytea 格式数据输入。对于带有转义字符的数据源,解 析时会按转义字符进行处理,使用时需要注意数据的实际长度。 2. DES/3DES 加解密接口对于数据和密钥长度有限制。 a)输入的数据或密钥长度为空时,报错 28231 - ”Invalid input to Obfuscation toolkit” b)输入的数据长度必须为 8 的倍数,否则报错 28232 - ”Invalid input size for Obfuscation toolkit.” c)密钥长度缺失或者小于 8 时,报错 28234 - ”Key length too short.” d)3DES 加解密接口的 which 参数目前支持取值 1,否则报错 28236 - ”Invalid Triple DES mode” 37 第 8 章 DBMS_OBFUSCATION_TOOLKIT 8.3 DBMS_OBFUSCATION_TOOLKIT 子程序 表DBMS_OBFUSCATION_TOOLKIT 子程序 列出了系统包 DBMS_OBFUSCATION_TOOLKIT 所提供的 子程序。 表 8.3.1: DBMS_OBFUSCATION_TOOLKIT 子程序 子程序名称 说明 DES3ENCRYPT 函数 使用 3DES 算法对数据进行加密 DES3DECRYPT 函数 使用 3DES 算法对数据进行解密 DESENCRYPT 函数 使用 DES 算法对数据进行加密 DESDECRYPT 函数 使用 DES 算法对数据进行解密 MD5 函数 实现数据的 MD5 哈希值计算 8.3.1 DES3ENCRYPT 函数 DES3ENCRYPT 函数使用 3DES 算法对数据进行加密。 语法 DES3ENCRYPT(input_string IN BYTEA, key_string IN BYTEA, which IN INTEGER) RETURNS BYTEA; DES3ENCRYPT(input_string IN BYTEA, key_string IN BYTEA, which IN INTEGER, iv_string IN BYTEA) RETURNS BYTEA; 参数说明 input_string 待加密数据。 key_string 用于加密数据的密钥。 which 使用的加解密密钥方式。取值 1,表示 3DES 密钥。 iv_string 仅当使用 CBC 加密方式时使用,初始 IV 值。 返回值说明 返回加密后的数据。 示例 38 第 8 章 DBMS_OBFUSCATION_TOOLKIT 参见DES3DECRYPT 函数 的示例 。 8.3.2 DES3DECRYPT 函数 DES3DECRYPT 函数使用 3DES 算法对数据进行解密。 语法 DES3DECRYPT(input_string IN BYTEA, key_string IN BYTEA, which IN INTEGER) RETURNS BYTEA; DES3DECRYPT(input_string IN BYTEA, key_string IN BYTEA, which IN INTEGER, iv_string IN BYTEA) RETURNS BYTEA; 参数说明 input_string 待解密数据。 key_string 用于解密数据的密钥。 which 使用的加解密密钥方式。取值 1,表示 3DES 密钥。 iv_string 仅当使用 CBC 加密方式时使用,初始 IV 值。 返回值说明 返回解密后的数据。 示例 \c - system set BYTEA_OUTPUT to escape; SELECT DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT(DBMS_OBFUSCATION_TOOLKIT.DES3ENCRYPT('0123456789abcdef', '0123456789abcdef87654321', 1), '0123456789abcdef87654321', 1); des3decrypt -----------------0123456789abcdef (1 行记录) SELECT DBMS_OBFUSCATION_TOOLKIT.DES3DECRYPT(DBMS_OBFUSCATION_TOOLKIT.DES3ENCRYPT('0123456789abcdef', '0123456789abcdef87654321', 1, '12345678'), '0123456789abcdef87654321', 1, '12345678'); des3decrypt -----------------0123456789abcdef (1 行记录) 39 第 8 章 DBMS_OBFUSCATION_TOOLKIT 8.3.3 DESENCRYPT 函数 DESENCRYPT 函数使用 DES 算法对数据进行加密。 语法 DESENCRYPT(input_string IN BYTEA, key_string IN BYTEA) RETURNS BYTEA; 参数说明 input_string 待加密数据。 key_string 用于加密数据的密钥。 返回值说明 返回加密后的数据。 示例 参见DESDECRYPT 函数 的示例 。 8.3.4 DESDECRYPT 函数 DESDECRYPT 函数使用 DES 算法对数据进行解密。 语法 DESDECRYPT(input_string IN BYTEA, key_string IN BYTEA) RETURNS BYTEA 参数说明 input_string 待解密数据。 key_string 用于解密数据的密钥。 返回值说明 返回解密后的数据。 示例 SELECT DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT(DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT('0123456789abcdef', '012345678'), '012345678'); desdecrypt 40 第 8 章 DBMS_OBFUSCATION_TOOLKIT -----------------0123456789abcdef (1 行记录) 8.3.5 MD5 函数 MD5 函数实现数据的 MD5 哈希值计算,生成的哈希值为 128-bits 的数据摘要。 语法 MD5(input_string IN BYTEA) RETURNS BYTEA; 参数说明 input_string 待计算 hash 的数据。 返回值说明 返回生成的 hash 值。 示例 \c - system set BYTEA_OUTPUT to hex; SELECT DBMS_OBFUSCATION_TOOLKIT.MD5('123456#$'); md5 -----------------------------------\xd9aa3f4d907b5d633b78e9e1d699cf96 (1 行记录) 41 第 9 章 DBMS_OUTPUT 9 第 章 DBMS_OUTPUT DBMS_OUTPUT 系统包可以将提供的文本行写入缓冲区,供以后提取和显示的功能。主要用于调试 PL/SQL 程序,或者在 Ksql 客户端命令中显示信息和报表,例如可以写一个简单的匿名 pl/sql 程序块,而该块出于某种目的 可以使用此包来显示一些信息。 9.1 DBMS_OUTPUT 使用说明 使用 dbms_output 系统包依赖 dbms_output 插件,该插件为初始化数据库实例时默认创建。 更多 dbms_output 插件信息参考《KingbaseES 插件参考手册》中的 dbms_output 章节。 9.2 DBMS_OUTPUT 使用限制 DBMS_OUTPUT 行和缓冲区大小的限制如下: 1. 最大行大小为 32767 字节。 2. 默认缓冲区大小为 20000 字节。最小为 2000 字节,最大是无限的。 9.3 DBMS_OUTPUT 子程序 表DBMS_OUTPUT 子程序 列出了系统包 DBMS_OUTPUT 所提供的子程序。 42 第 9 章 DBMS_OUTPUT 表 9.3.1: DBMS_OUTPUT 子程序 子程序名称 说明 ENABLE 存储过程 启用过程 DISABLE 存储过程 禁用过程的调用 PUT 存储过程 向缓冲区中追加内容 PUT_LINE 存储过程 向缓冲区追加单行信息 NEW_LINE 存储过程 向缓冲区追加新行 GET_LINE 存储过程 从缓冲区获取首行信息 GET_LINES 存储过程 从缓冲区获取多行信息 9.3.1 ENABLE 存储过程 ENABLE 存储过程允许调用 PUT、PUT_LINE、NEW_LINE、GET_LINE 和 GET_LINES 等过程。 语法 DBMS_OUTPUT.ENABLE(buffer_size IN INTEGER DEFAULT 20000); 参数说明 buffer_size 缓冲区最大尺寸为 1000000 字节,最小为 2000 字节,默认为 20000 字节。将 buffer_size 设置为 null,缓 冲区大小将没有限制。 使用说明 1. 如果没有激活 DBMS_OUTPUT 包,对这些过程的调用将被忽略。 2. 如果有多个调用要启用,那么 buffer_size 是最后调用者指定的值。 3. 当 set serveroutput on 开启时可以不用调用 enable 和 disable 过程。 4. 缓冲区设定大小的范围为 2000 至 1000000,如果 buffer_size 的值小于 2000,则为 2000;如果 buffer_size 的 值超过 1000000,则为 1000000;如果输入缓冲区的数据大小超过缓冲区设定的最大值,将直接报错。 示例 输入参数不同,启用缓冲区大小也不同,示例如下: CALL DBMS_OUTPUT.ENABLE(); CALL DBMS_OUTPUT.ENABLE(NULL); CALL DBMS_OUTPUT.ENABLE(3000); 43 第 9 章 DBMS_OUTPUT 9.3.2 DISABLE 存储过程 DISABLE 存储过程禁用对 PUT、PUT_LINE、NEW_LINE、GET_LINE 和 GET_LINES 等过程的调用,并 清空缓冲区。 语法 DBMS_OUTPUT.DISABLE(); 使用说明 1. 如果该 DBMS_OUTPUT 包被禁用了,那么所有对其子程序 (subprogram) 的调用都将被忽略。这样用户可以 设计应用程序,仅在客户端程序能够处理这些信息的时候启用这些子程序。 2. 如果 set serveroutput off 时调用了 disable 过程,下次调用其他过程前,必须先调用 enable 过程。 示例 \set SQLTERM / BEGIN DBMS_OUTPUT.DISABLE(); DBMS_OUTPUT.PUT_LINE('line one'); END; / 9.3.3 PUT 存储过程 PUT 存储过程用来追加部分内容到 Buffer(缓冲区)中的最后一行。 语法 DBMS_OUTPUT.PUT(item IN VARCHAR2); 参数说明 item 追加的字符串。 使用说明 1. 当追加内容时可以使用 put 过程输入,如需整行方式输入最好使用 put_line 过程。 2. 若单行长度超过限制那么将报错,或输入数据超过缓冲区设定值将报错。 3. 注意在调用 PUT 或 PUT_LINE 的 PL/SQL 程序单元结束之前,对 PUT 或 PUT_LINE 指定的内容不会输 出。 4. 当调用 PUT_LINE 过程时将自动加入换行符,若使用 PUT 来构建行,那么必须手动使用 NEW_LINE 过程 来加入换行符。GET_LINE 和 GET_LINES 过程不会返回没有以换行符终结的一行。 44 第 9 章 DBMS_OUTPUT 示例 向缓冲区追加内容,示例如下: set serverout on \set SQLTERM / BEGIN DBMS_OUTPUT.PUT('test1'); DBMS_OUTPUT.NEW_LINE(); DBMS_OUTPUT.PUT('test2'); END; / ---打印结果如下: test1 test2 9.3.4 PUT_LINE 存储过程 PUT_LINE 存储过程用来向 Buffer(缓冲区)中新添一行信息。 语法 DBMS_OUTPUT.PUT_LINE(item IN VARCHAR2); 参数说明 item 追加的字符串。 使用说明 1. 输入数据超过缓冲区设定值将报错。 2. GET_LINE 和 GET_LINES 不返回未使用换行符终止的行。 示例 向缓冲区追加单行信息,示例如下: set serverout on \set SQLTERM / CALL DBMS_OUTPUT.PUT_LINE('hi' || chr(10) || 'hello'||chr(10) || ' world'); / ---打印结果如下: hi hello 45 第 9 章 DBMS_OUTPUT world 9.3.5 NEW_LINE 存储过程 NEW_LINE 存储过程向缓冲区添加一个换行符,产生新一行。每调用一次生成一次新行 语法 DBMS_OUTPUT.NEW_LINE(); 示例 向缓冲区追加新行,示例如下: set serverout on \set SQLTERM / BEGIN DBMS_OUTPUT.PUT('test1'); DBMS_OUTPUT.NEW_LINE(); DBMS_OUTPUT.PUT('test2'); DBMS_OUTPUT.NEW_LINE(); DBMS_OUTPUT.NEW_LINE(); DBMS_OUTPUT.PUT_LINE('test3'); END; / ---打印结果如下: test1 test2 test3 9.3.6 GET_LINE 存储过程 GET_LINE 存储过程从 buffer(缓冲区)中获取单行信息,先加入的信息先获取,获取后 buffer(缓冲区)中 的此信息将被删除。 语法 DBMS_OUTPUT.GET_LINE(line OUT VARCHAR2, status OUT INTEGER); 参数说明 line 46 第 9 章 DBMS_OUTPUT 将获取 buffer 中的一行信息,但不包括最后的换行符。 status 若调用成功则返回 0,调用失败则返回 1。 使用说明 调用 GET_LINE 成功获取内容后,在下一次调用 PUT,PUT_LINE 或 NEW_LINE 过程前没有被获取的缓存 都将被丢弃。 示例 获取首行信息,示例如下: set serverout on \set SQLTERM / DECLARE line VARCHAR2(120); status INTEGER; BEGIN DBMS_OUTPUT.PUT('hello'); DBMS_OUTPUT.PUT_LINE('world'); DBMS_OUTPUT.GET_LINE(line, status); DBMS_OUTPUT.PUT_LINE(line || status); END; / ---打印结果如下: helloworld0 9.3.7 GET_LINES 存储过程 GET_LINES 存储过程用以从 Buffer(缓冲区)中获取一个多行的数组,获取后 buffer 中的此信息将被删除。 语法 DBMS_OUTPUT.GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER); DBMS_OUTPUT.GET_LINES(lines OUT DBMSOUTPUT_LINESARRAY, numlines IN OUT INTEGER); 参数说明 CHARARR(包内类型) 类型定义为 TYPE CHARARR IS TABLE OF VARCHAR2(32767) INDEX BY INT; DBMSOUTPUT_LINESARRAY(包外类型) 类型定义为 TYPE DBMSOUTPUT_LINESARRAY IS VARRAY(2147483647) OF VARCHAR2(32767); 47 第 9 章 DBMS_OUTPUT lines 返回缓冲信息的行数组。数组中每一行的最大长度为 32767 字节。 numlines 当缓冲区行数多于或等于检索的行数时,返回检索行数;当缓冲区行数少于检索的行数时,返回缓冲区行 数。 使用说明 1. 在获取信息之后,若下次调用输入过程,则没有检索到的任何行都将被丢弃,以避免与下一条消息混淆。 2. CHARARR 类型 numlines 参数当不指定参数或此参数小于等于 0,不获取内容,并返回 numlines 为 0;当此 参数大于 0,如果缓冲区行数多于或等于检索的行数时,返回检索行数;如果缓冲区行数少于检索的行数时, 返回缓冲区行数。 3. DBMSOUTPUT_LINESARRAY 类型 numlines 参数当不指定参数,默认获取全部内容,并返回 numlines 为 获取行数;当此参数小于 0,将报错;当参数大于等于 0 时,如果缓冲区行数多于或等于检索的行数时,返回 检索行数,当缓冲区行数少于检索的行数时,返回缓冲区行数。 示例 get_lines 有多种重载方式,示例如下: set serverout on \set SQLTERM / DECLARE v_data DBMS_OUTPUT.CHARARR; numlines INTEGER := 2; BEGIN DBMS_OUTPUT.PUT_LINE('TEST 1'); DBMS_OUTPUT.PUT_LINE('TEST 2'); DBMS_OUTPUT.PUT_LINE('TEST 3'); DBMS_OUTPUT.GET_LINES(v_data, numlines); DBMS_OUTPUT.PUT_LINE(v_data(1)); DBMS_OUTPUT.PUT_LINE(v_data(2)); END; / ---打印结果如下: TEST 1 TEST 2 DECLARE v_data DBMSOUTPUT_LINESARRAY; numlines INTEGER := 2; BEGIN DBMS_OUTPUT.PUT_LINE('TEST 1'); DBMS_OUTPUT.PUT_LINE('TEST 2'); DBMS_OUTPUT.GET_LINES(v_data, numlines); 48 第 9 章 DBMS_OUTPUT DBMS_OUTPUT.PUT_LINE(numlines); DBMS_OUTPUT.PUT_LINE(v_data(1)); DBMS_OUTPUT.PUT_LINE(v_data(2)); END; / ---打印结果如下: 2 TEST 1 TEST 2 9.4 DBMS_OUTPUT 客户端命令 表DBMS_OUTPUT 客户端命令 列出了系统包 dbms_output 所提供的子程序。 表 9.4.1: DBMS_OUTPUT 客户端命令 客户端命令名称 说明 set serverout on 客户端命令启动输出功能 set serverout off 客户端命令禁用输出功能 9.4.1 set serverout on set serverout on 客户端命令启动输出功能。 语法 set serverout[put] on[;] 参数说明 set serverout[put] 跟‘on’或‘on;’,当输入无关命令时会提示命令错误。 使用说明 1. 启用 DBMS_OUTPUT 系统包功能。 2. 缓存大小设为不限制大小。 3. 能代替ENABLE 存储过程 ,即可以不需要 enable 过程。 4. 客户端输出缓冲区消息。 示例 49 第 9 章 DBMS_OUTPUT 通过在 ksql 客户端设置 set serveroutput on 命令,即可显示缓冲区信息,示例如下: set serverout on \set SQLTERM / CREATE OR REPLACE PROCEDURE protest_A_1 IS BEGIN DBMS_OUTPUT.PUT_LINE('....test1'); DBMS_OUTPUT.PUT_LINE('....test2'); END; / DECLARE v_status INTEGER := 0; v_data VARCHAR2(100); BEGIN protest_A_1(); DBMS_OUTPUT.PUT_LINE('test3'); DBMS_OUTPUT.GET_LINE(v_data, v_status); DBMS_OUTPUT.PUT_LINE('v_data: ' ||v_data || 'v_status: ' ||v_status); DBMS_OUTPUT.PUT_LINE('test4'); END; / ---打印结果如下: v_data: ....test1v_status: 0 test4 9.4.2 set serverout off set serverout off 客户端命令禁用输出功能。 语法 set serverout[put] off[;] 参数说明 set serverout[put] 跟‘off’或‘off;’,当输入无关命令时会提示命令错误。 使用说明 1. 禁用 DBMS_OUTPUT 系统包功能。 2. 清除缓存。 3. 能代替DISABLE 存储过程 ,即可以不需要 disable 过程。 示例 通过在 ksql 客户端工具设置 set serveroutput off 命令,即可禁用 dbms_output 输出功能。示例如下: 50 第 9 章 DBMS_OUTPUT set serverout off \set SQLTERM / CALL DBMS_OUTPUT.PUT_LINE('hi' || chr(10) || 'hello'||chr(10) || ' world'); / 51 第 10 章 DBMS_RANDOM 10章 DBMS_RANDOM 第 DBMS_RANDOM 系统包提供用于产生随机数或者随机字符的一组子程序。 10.1 DBMS_RANDOM 使用说明 使用 DBMS_RANDOM 系统包依赖 DBMS_RANDOM 插件,需要创建 dbms_random 扩展后才可以使用 DBMS_RANDOM 系统包: CREATE EXTENSION dbms_random; 更多 dbms_random 插件信息参考《KingbaseES 插件参考手册》中的 dbms_random 章节。 10.2 DBMS_RANDOM 子程序 表DBMS_RANDOM 子程序 列出了系统包 DBMS_RANDOM 所提供的子程序。 表 10.2.1: DBMS_RANDOM 子程序 子程序名称 说明 INITIALIZE 存储过程 使用一个种子值来初始化包 NORMAL 函数 产生标准的正态分布函数 RANDOM 函数 产生一个随机整数 SEED 存储过程 重置随机数种子 STRING 函数 产生一个随机字符串 见续表 52 第 10 章 DBMS_RANDOM 表 10.2.1 – 续表 子程序名称 说明 TERMINATE 存储过程 提供语法上的兼容不执行任何操作 VALUE 函数 产生指定范围的随机数 10.2.1 INITIALIZE 存储过程 使用一个种子值来初始化 dbms_random 包,默认情况下,dbms_random 包是根据用户、时间、会话来初始 化。Initialize 这个函数已经过时,虽然目前受到支持,但考虑历史遗留原因和兼容性保留此初始化方式。 语法 DBMS_RANDOM.INITIALIZE(init INTEGER); 参数说明 init 随机数种子值。 示例 CALL DBMS_RANDOM.INITIALIZE(8); 10.2.2 NORMAL 函数 产生标准的正态分布函数,此正态分布的标准差为 1,期望值为 0。 语法 DBMS_RANDOM.NORMAL() RETURN DOUBLE; 返回值说明 DOUBLE 类型,随机标准正态分布值。 示例 SELECT DBMS_RANDOM.NORMAL(); 10.2.3 RANDOM 函数 产生一个随机整数,这个函数已经过时,虽然目前还支持,但不应该使用它,考虑兼容性保留此函数。 53 第 10 章 DBMS_RANDOM 语法 DBMS_RANDOM.RANDOM() RETURN INTEGER; 返回值说明 INTEGER 类型,随机整数。 示例 CALL DBMS_RANDOM.RANDOM(); 10.2.4 SEED 存储过程 重置种子,功能类似于 INITIALIZE 存储过程,INITIALIZE 函数已经被淘汰。SEED 存储过程同时支持数值和 字符作为种子值,而 INITIALIZE 只支持数值。 语法 DBMS_RANDOM.SEED(i INTEGER); DBMS_RANDOM.SEED(t TEXT); 参数说明 i 随机数种子值。 t 随机数字符种子值。 示例 CALL DBMS_RANDOM.SEED(8); CALL DBMS_RANDOM.SEED('test'); 10.2.5 STRING 函数 获取一个随机字符串 语法 DBMS_RANDOM.STRING(type TEXT,len INTEGER) RETURN TEXT; 参数说明 type 54 第 10 章 DBMS_RANDOM 产生字符串的类型。 表 10.2.2: type 参数对应含义 值 描述 ’u’,’U’ 返回大写字母的字符串 ’l’,’L’ 返回小写字母的字符串 ’a’,’A’ 返回大小写字母混合的字符串 ’x’,’X’ 返回大写字母和数字的字符串 ’p’,’P’ 返回任何可打印字符的字符串 len 产生字符串的长度。 使用说明 第一个参数是字符串的格式,第二个参数是指字符串的长度。长度最大为 5000,参数如果超过 5000 会自动以 5000 处理。 返回值说明 TEXT 类型,随机字符串。 示例 SELECT DBMS_RANDOM.STRING('U',5); SELECT DBMS_RANDOM.STRING('P',2); SELECT DBMS_RANDOM.STRING('x',4); SELECT DBMS_RANDOM.STRING('a',2); SELECT DBMS_RANDOM.STRING('l',3); 10.2.6 TERMINATE 存储过程 原功能为使用完 DBMS_RANDOM 包的时候执行此函数,但是现在此函数不执行任何功能,为了语法兼容保 留。 语法 DBMS_RANDOM.TERMINATE(); 示例 55 第 10 章 DBMS_RANDOM CALL DBMS_RANDOM.TERMINATE(); 10.2.7 VALUE 函数 产生指定范围的随机数。 语法 DBMS_RANDOM.VALUE() RETURN DOUBLE; DBMS_RANDOM.VALUE(low INTEGER,high INTEGER) RETURN DOUBLE; 参数说明 low 产生的随机数最小值。 high 产生的随机数最大值。 使用说明 1. 第一种无参的使用方式是获取一个大于或者等于 0 且小于 1 的随机数,精度为 16 位的小数。 2. 第二种使用方式可以指定最小值和最大值,返回值的范围大于或者等于 low,小于 high,精度同为 16 位小数。 返回值说明 DOUBLE 类型,随机数。 示例 SELECT DBMS_RANDOM.VALUE(); SELECT DBMS_RANDOM.VALUE(10,15); 56 第 11 章 DBMS_SCHEDULER 11章 DBMS_SCHEDULER 第 DBMS_SCHEDULER 系统包提供调度和管理作业任务的功能。该包提供了DBMS_JOB 的功能,并有所增强。 11.1 DBMS_SCHEDULER 使用说明 使用 DBMS_SCHEDULER 系统包依赖 kdb_schedule 插件,需要在 kdb_schedule 插件加载之后才可以使用 DBMS_SCHEDULER 系统包。将 kdb_schedule 添加到 kingbase.conf 文件的 shared_preload_libraries 中,并重启 数据库,再创建 kdb_schedule 扩展: shared_preload_libraries = 'kdb_schedule' # (change requires restart) CREATE EXTENSION kdb_schedule; 更多 kdb_schedule 插件信息参考《KingbaseES 插件参考手册》中的 kdb_schedule 章节。 11.2 DBMS_SCHEDULER 使用限制 DBMS_SCHEDULER 具有如下使用限制: 1. 需要创建 kdb_schedule 扩展; 2. 间隔时间采用日历表示法,详细信息参见《KingbaseES 插件参考手册》中的 kdb_schedule 章节的 日历表示 法。 11.3 DBMS_SCHEDULER 子程序 表 DBMS_SCHEDULER_Subprograms 列出了系统包 DBMS_SCHEDULER 所提供的子程序。 57 第 11 章 DBMS_SCHEDULER 表 11.3.1: DBMS_SCHEDULER 子 程 序:name: DBMS_SCHEDULER_Subprograms :class: longtable 子程序名称 说明 CREATE_PROGRAM 存储过程 创建一个程序 DROP_PROGRAM 存储过程 删除一个程序 CREATE_SCHEDULE 存储过程 创建一个调度程序 DROP_SCHEDULE 存储过程 删除一个调度程序 EVALUATE_CALENDAR_STRING 存储过程 计算符合规则的下一个日期 CREATE_JOB 存储过程 创建一个 job 任务 DROP_JOB 存储过程 删除一个 job 任务 RUN_JOB 存储过程 运行一个 job 任务 DISABLE 存储过程 将一个 job 任务状态设置为 DISABLE ENABLE 存储过程 将一个 job 任务状态设置为 ENABLE 11.3.1 CREATE_PROGRAM 存储过程 CREATE_PROGRAM 存储过程用于创建一个 job 任务的程序。 语法 DBMS_SCHEDULER.CREATE_PROGRAM( program_name TEXT, program_type TEXT, program_action TEXT, acconnstr TEXT, acdbname TEXT, number_of_arguments INTEGER DEFAULT 0, enabled BOOLEAN DEFAULT FALSE, comments TEXT DEFAULT NULL); 参数说明 58 第 11 章 DBMS_SCHEDULER 表 11.3.2: CREATE_PROGRAM 参数 参数 描述 program_name 程序的名字 program_type 程 序 的 类 型。 有 下 列 类 型:PLSQL_BLOCK、STORED_ 过 存 储 程、SQL_SCRIPT、EXECUTABLE、EXTERNAL_SCRIPT、 BACKUP_SCRIPT program_action 程序的动作 acconnstr 数据库连接串 acdbname 数据库名称 number_of_arguments 程序动作的参数,暂不支持, 0 为默认值 enabled 程序的状态,true 启动状态,false 禁用状态 comments 程序的注释信息 示例 CALL DBMS_SCHEDULER.CREATE_PROGRAM('program1', 'PLSQL_BLOCK', 'create table t2(A int)', 'user=system dbname=test port=54321 password=123456', 'test', 0, true, 'this is test program'); 11.3.2 DROP_PROGRAM 存储过程 DROP_PROGRAM 存储过程用于删除一个 job 任务的程序。 语法 DBMS_SCHEDULER.DROP_PROGRAM( program_name TEXT, force BOOLEAN DEFAULT FALSE); 参数说明 program_name 程序的名字。 force 暂不支持,默认值为 false。 示例 59 第 11 章 DBMS_SCHEDULER CALL DBMS_SCHEDULER.DROP_PROGRAM('program1', true); 11.3.3 CREATE_SCHEDULE 存储过程 CREATE_SCHEDULE 存储过程用于创建一个 job 任务的调度程序。 语法 DBMS_SCHEDULER.CREATE_SCHEDULE( schedule_name TEXT, start_date TIMESTAMP WITH TIME ZONE DEFAULT NULL, repeat_interval TEXT DEFAULT NULL, end_date TIMESTAMP WITH TIME ZONE DEFAULT NULL, comments TEXT DEFAULT NULL); 参数说明 表 11.3.3: CREATE_SCHEDULE 参数 参数 描述 schedule_name 调度程序的名字 start_date 调度程序的开始时间 repeat_interval 调度程序的间隔时间 end_date 调度程序的结束时间 comment 调度程序的注释信息 示例 CALL DBMS_SCHEDULER.CREATE_SCHEDULE('schedule1', now(), 'Freq=daily;BYHOUR=10; BYMINUTE=10;BYSECOND=10', NULL, 'this is test schedule'); 11.3.4 DROP_SCHEDULE 存储过程 DROP_SCHEDULE 存储过程用于删除一个 job 任务的调度程序。 语法 DBMS_SCHEDULER.DROP_SCHEDULE( schedule_name TEXT, force BOOLEAN DEFAULT FALSE); 60 第 11 章 DBMS_SCHEDULER 参数说明 schedule_name 调度程序的名字。 force 暂不支持,默认值为 false。 示例 CALL DBMS_SCHEDULER.DROP_SCHEDULE('schedule1', true); 11.3.5 EVALUATE_CALENDAR_STRING 存储过程 EVALUATE_CALENDAR_STRING 存储过程计算符合规则的下一个日期。 语法 DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING( calendar_string TEXT, start_date TIMESTAMP WITH TIME ZONE, return_date_after TIMESTAMP WITH TIME ZONE, OUT next_run_date TIMESTAMP WITH TIME ZONE); 参数说明 calendar_string 调度规则。 start_date 开始时间。 return_date_after 最近一次的执行时间。 next_run_date 下一次运行的时间。返回参数。 示例 \set SQLTERM / DECLARE next_run_date TIMESTAMP; BEGIN DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING('freq=yearly;interval=5;bymonth=10; bymonthday=10;byhour=10;byminute=10;bysecond=10','','',next_run_date); DBMS_OUTPUT.PUT_LINE(next_run_date); 61 第 11 章 DBMS_SCHEDULER END; / \set SQLTERM ; 11.3.6 CREATE_JOB 存储过程 CREATE_JOB 存储过程用于创建一个 job 任务。 语法 DBMS_SCHEDULER.CREATE_JOB( job_name TEXT, program_name TEXT, schedule_name TEXT, job_class TEXT DEFAULT 'Routine Maintenance', enabled BOOLEAN DEFAULT FALSE, auto_drop BOOLEAN DEFAULT TRUE, comments TEXT DEFAULT NULL, credentail_name TEXT DEFAULT NULL, destination_name TEXT DEFAULT NULL); 参数说明 表 11.3.4: CREATE_JOB 参数 参数 描述 job_name job 的名字 program_name 程序的名字 schedule_name 调度程序的名字 job_class job 的类型,默认 Routine Maintenance enabled job 的状态。true 启用,false 禁用 auto_drop job 完成后自动删除,暂不支持,默认 true comment job 的注释信息 credentail_name 暂不支持,默认为 NULL destination_name 暂不支持,默认为 NULL 示例 62 第 11 章 DBMS_SCHEDULER CALL DBMS_SCHEDULER.CREATE_PROGRAM('program1', 'PLSQL_BLOCK', 'create table t2(A int)', 'user=system dbname=test port=54321 password=123456', 'kingbase', 0, true, 'this is test program'); CALL DBMS_SCHEDULER.CREATE_SCHEDULE('schedule1', now(), 'Freq=daily;BYHOUR=10; BYMINUTE=10;BYSECOND=10', NULL, 'this is test schedule'); CALL DBMS_SCHEDULER.CREATE_JOB('job', 'program1', 'schedule1', 'Routine Maintenance', false, true, 'this is test job'); 11.3.7 DROP_JOB 存储过程 DROP_JOB 存储过程用于删除一个 job 任务。 语法 DBMS_SCHEDULER.DROP_JOB( job_name TEXT, force BOOLEAN DEFAULT FALSE, defer BOOLEAN DEFAULT FALSE, commit_semantics TEXT DEFAULT 'STOP_ON_FIRST_ERROR'); 参数说明 表 11.3.5: DROP_JOB 参数 参数 描述 job_name job 的名字。 force 暂不支持,默认值为 false。 defer 暂不支持,默认值为 false。 commit_semantice 暂不支持,默认值为 STOP_ON_FIRST_ERROR。 示例 CALL DBMS_SCHEDULER.DROP_JOB('job', false, false, 'STOP_ON_FIRST_ERROR'); 11.3.8 RUN_JOB 存储过程 RUN_JOB 存储过程运行一个 job 任务。 语法 63 第 11 章 DBMS_SCHEDULER DBMS_SCHEDULER.RUN_JOB( job_name TEXT, use_current_session BOOLEAN DEFAULT TRUE); 参数说明 job_name job 的名字。 use_current_session 暂不支持,默认值为 true。 示例 CALL DBMS_SCHEDULER.CREATE_PROGRAM('program2', 'PLSQL_BLOCK', 'create table t2(A int)', 'user=system dbname=test port=54321 password=123456', 'kingbase', 0, true, 'this is test program'); CALL DBMS_SCHEDULER.CREATE_SCHEDULE('schedule2', now(), 'Freq=daily;BYHOUR=10; BYMINUTE=10;BYSECOND=10', NULL, 'this is test schedule'); CALL DBMS_SCHEDULER.CREATE_JOB('job1', 'program2', 'schedule2', 'Routine Maintenance', false, true, 'this is test job'); CALL DBMS_SCHEDULER.RUN_JOB('job1', true); 11.3.9 DISABLE 存储过程 DISABLE 存储过程用于禁用一个 job 任务。 语法 DBMS_SCHEDULER.DISABLE( name TEXT, force BOOLEAN DEFAULT FALSE, commit_semantics TEXT DEFAULT 'STOP_ON_FIRST_ERROR'); 参数说明 name job 的名字。 force 暂不支持,默认值为 false。 commit_semantics 暂不支持,默认值为 STOP_ON_FIRST_ERROR。 示例 64 第 11 章 DBMS_SCHEDULER CALL DBMS_SCHEDULER.DISABLE('job1', false, 'STOP_ON_FIRST_ERROR'); 11.3.10 ENABLE 存储过程 ENABLE 存储过程用于启用一个 job 任务。 语法 DBMS_SCHEDULER.ENABLE( name TEXT, commit_semantics TEXT DEFAULT 'STOP_ON_FIRST_ERROR'); 参数说明 name job 的名字。 commit_semantics 暂不支持,默认值为 STOP_ON_FIRST_ERROR。 示例 CALL DBMS_SCHEDULER.ENABLE('job1', 'STOP_ON_FIRST_ERROR'); 65 第 12 章 DBMS_SESSION 12章 DBMS_SESSION 第 DBMS_SESSION 系统包可以用来访问或者设置会话信息,定义对于 session 的一套操作。 12.1 DBMS_SESSION 使用说明 使用 DBMS_SESSION 系统包依赖 dbms_session 插件,需要在 dbms_session 插件加载之后才可以使用 DBMS_SESSION 系统包。将 dbms_session 添加到 kingbase.conf 文件的 shared_preload_libraries 中,并重启数 据库,再创建 dbms_session 扩展: shared_preload_libraries = 'dbms_session' # (change requires restart) CREATE EXTENSION dbms_session; 更多 dbms_session 插件信息参考《KingbaseES 插件参考手册》中的 dbms_session 章节。 12.2 DBMS_SESSION 系统包子程序 表DBMS_SESSION 子程序 列出了系统包 DBMS_SESSION 所提供的子程序。 表 12.2.1: DBMS_SESSION 子程序 子程序名称 说明 CLEAR_ALL_CONTEXT 存储过程 清理当前会话的指定 namespace 的所有上下文 CLEAR_CONTEXT 存储过程 清除 namespace 中的 attribute 值 LIST_CONTEXT 存储过程 返回当前会话所有上下文属性和值 SET_CONTEXT 存储过程 设置上下文 namespace 的属性和值 66 第 12 章 DBMS_SESSION 12.2.1 CLEAR_ALL_CONTEXT 存储过程 清理当前会话的指定 namespace 的所有上下文。该过程需通过 namespace 关联的 package 调用。 语法 DBMS_SESSION.CLEAR_ALL_CONTEXT(namespace VARCHAR2(63)); 参数说明 namespace 应用程序上下文信息的名称。最大长度 63bytes。 示例 参见SET_CONTEXT 存储过程 的示例 。 12.2.2 CLEAR_CONTEXT 存储过程 清除 namespace 中的 attribute 值。该过程需通过上下文 namespace 关联的 package 调用。 语法 DBMS_SESSION.CLEAR_CONTEXT(namespace VARCHAR2(63),client_identifier VARCHAR2(30),attribute VARCHAR2(128)); 参数说明 namespace 要清除上下文信息的名称。最大长度 63bytes,不区分大小写。 client_identifier 用于全局访问的 client 标识,不起作用,如果指定,则忽略。 attribute 要清除的上下文的属性名,不区分大小写。若为 null,则清除 namespace 下所有 key-value。 示例 参见SET_CONTEXT 存储过程 的示例 。 12.2.3 LIST_CONTEXT 存储过程 返回当前会话所有上下文属性和值。 语法 67 第 12 章 DBMS_SESSION TYPE AppCtxRecTyp IS RECORD( namespace VARCHAR2(63), attribute VARCHAR2(128), value VARCHAR2(4000) ); TYPE AppCtxTabTyp IS TABLE OF AppCtxRecTyp INDEX BY BINARY_INTEGER; DBMS_SESSION.LIST_CONTEXT( list OUT AppCtxTabTyp, size OUT NUMBER ); 参数说明 表 12.2.2: LIST_CONTEXT 参数 参数名称 描述 list 输出参数,类型为索引表。 size 输出参数,该索引表中元素的总数。 示例 \set SQLTERM / DECLARE lcontext DBMS_SESSION.APPCTXTABTYP; lsize NUMBER; BEGIN DBMS_SESSION.LIST_CONTEXT (lcontext, lsize); FOR k IN 1 .. (lcontext.COUNT) LOOP DBMS_OUTPUT.PUT_LINE('Namespace: ' || lcontext(k).namespace || ' Attribute: ' || lcontext(k). attribute || ' Value: ' || lcontext(k).value); END LOOP; DBMS_OUTPUT.PUT_LINE('num: '|| lsize); END; / \set SQLTERM ; 12.2.4 SET_CONTEXT 存储过程 设置上下文 namespace 的属性和值。此过程必须由受信任包直接或间接调用。 语法 68 第 12 章 DBMS_SESSION DBMS_SESSION.SET_CONTEXT ( namespace VARCHAR(63), attribute VARCHAR(128), value VARCHAR(4000), username VARCHAR(128), client_id VARCHAR(64) ); 参数说明 namespace 要设置的 context 名。 attribute 要设置的 context 属性名。 value 要设置的 context 属性值。 username 不起作用,如果指定,则忽略。 client_id 不起作用,如果指定,则忽略。 注意: attribute 不可为空,value 可以为空,需要设置 set ora_input_emptystr_isnull=off; 示例 --第一步 创建 package CREATE EXTENSION dbms_session; set ora_input_emptystr_isnull=off; CREATE SCHEMA context_schema1; GRANT USAGE ON SCHEMA context_schema1 TO PUBLIC; GRANT ALL ON SCHEMA context_schema1 TO PUBLIC; CREATE OR REPLACE CONTEXT context1 USING context_schema1.test_package; \set SQLTERM / 69 第 12 章 DBMS_SESSION CREATE OR REPLACE PACKAGE context_schema1.test_package AS PROCEDURE SET_CONTEXT(ts_name VARCHAR, key VARCHAR, value VARCHAR); PROCEDURE CLEAR_CONTEXT(ts_name VARCHAR,client_identifier VARCHAR, key VARCHAR); PROCEDURE CLEAR_ALL_CONTEXT(ts_name VARCHAR); END test_package; / CREATE OR REPLACE PACKAGE BODY context_schema1.test_package AS PROCEDURE set_context(ts_name VARCHAR, key VARCHAR, value VARCHAR) AS BEGIN DBMS_SESSION.SET_CONTEXT(ts_name, key,value); END; PROCEDURE CLEAR_CONTEXT(ts_name VARCHAR,client_identifier VARCHAR, key VARCHAR) AS BEGIN DBMS_SESSION.CLEAR_CONTEXT(ts_name,client_identifier, key); END; PROCEDURE CLEAR_ALL_CONTEXT(ts_name VARCHAR) AS BEGIN DBMS_SESSION.CLEAR_ALL_CONTEXT(ts_name); END; END test_package; / \set SQLTERM ; 70 第 12 章 DBMS_SESSION --第二步 创建 context CREATE OR REPLACE CONTEXT c_user01 USING context_schema1.test_package; --第三步 设置 namespace 的 key-value CALL context_schema1.test_package.set_context('c_user01', 'u_k2', 'u_v2'); --第四步 查询 SELECT SYS_CONTEXT('c_user01', 'u_k2'); sys_context --------------------------------------------------u_v2 --第五步 修改 u_k2 的值并查询 CALL context_schema1.test_package.set_context('c_user01', 'u_k2', 'u_v2222'); SELECT SYS_CONTEXT('c_user01', 'u_k2'); sys_context --------------------------------------------------u_v2222 --第六步 增加新的属性值 u_k3 并查询 CALL context_schema1.test_package.set_context('c_user01', 'u_k3', 'u_v3'); SELECT SYS_CONTEXT('c_user01', 'u_k3'); sys_context ------------------------------------------------u_v3 --第七步 清除上下文 c_user01 属性 u_k2 的值并再次查询 CALL context_schema1.test_package.clear_context('c_user01', null,'u_k2'); SELECT SYS_CONTEXT('c_user01', 'u_k2'); sys_context ------------(1 行记录) SELECT SYS_CONTEXT('c_user01', 'u_k3'); sys_context 71 第 12 章 DBMS_SESSION ------------u_v3 (1 行记录) --第八步 清除上下文 c_user01 CALL context_schema1.test_package.clear_all_context('c_user01'); SELECT SYS_CONTEXT('c_user01', 'u_k3'); sys_context ------------(1 行记录) 72 第 13 章 DBMS_SQL 13章 DBMS_SQL 第 DBMS_SQL 系统包包内定义了一系列的过程和函数,专门用于动态 SQL 语句的操作。 13.1 DBMS_SQL 使用说明 使用 DBMS_SQL 系统包依赖 plsql 插件,plsql 插件为初始化数据库实例时默认创建。更多 DBMS_SQL 插件 信息参考《KingbaseES 插件参考手册》中的 dbms_sql 章节。 13.2 DBMS_SQL 预定义类型 13.2.1 DBMS_SQL 常量 DBMS_SQL 系统包包含的数据常量如下表所示: 表 13.2.1: DBMS_SQL 常量 名称 类型 值 描述 NATIVE INTEGER 1 兼容性常量,仅语法兼容 V6 INTEGER 0 兼容性常量,仅语法兼容 V7 INTEGER 2 兼容性常量,仅语法兼容 FOREIGN_SYNTAX INTEGER -1 兼容性常量,仅语法兼容 13.2.2 DBMS_SQL 集合类型 DBMS_SQL 系统包提供的集合类型如下所示: 73 第 13 章 DBMS_SQL TYPE bfile_table IS TABLE OF BFILE INDEX BY BINARY_INTEGER; TYPE desc_tab IS TABLE OF desc_rec INDEX BY BINARY_INTEGER; TYPE binary_double_table IS TABLE OF BINARY_DOUBLE INDEX BY BINARY_INTEGER; TYPE binary_float_table IS TABLE OF BINARY_FLOAT INDEX BY BINARY_INTEGER; TYPE blob_table IS TABLE OF BLOB INDEX BY BINARY_INTEGER; TYPE clob_table IS TABLE OF CLOB INDEX BY BINARY_INTEGER; TYPE date_table IS TABLE OF DATE INDEX BY BINARY_INTEGER; TYPE number_table IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; TYPE time_table IS TABLE OF TIME_UNCONSTRAINED INDEX BY BINARY_INTEGER; TYPE time_with_time_zone_table IS TABLE OF TIME_TZ_UNCONSTRAINED INDEX BY BINARY_INTEGER; TYPE timestamp_table IS TABLE OF TIMESTAMP_UNCONSTRAINED INDEX BY BINARY_INTEGER; TYPE timestamp_with_ltz_table IS TABLE OF TIMESTAMP_LTZ_UNCONSTRAINED INDEX BY BINARY_INTEGER; TYPE timestamp_with_time_zone_table IS TABLE OF TIMESTAMP_TZ_UNCONSTRAINED INDEX BY BINARY_INTEGER; TYPE varchar2_table IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER; TYPE VARCHAR2a IS TABLE OF VARCHAR2(32767) INDEX BY BINARY_INTEGER; TYPE VARCHAR2s IS TABLE OF VARCHAR2(256) INDEX BY BINARY_INTEGER; 13.3 DBMS_SQL 子程序 表DBMS_SQL 子程序 列出了系统包 DBMS_SQL 所提供的子程序。 74 第 13 章 DBMS_SQL 表 13.3.1: DBMS_SQL 子程序 子程序名称 说明 OPEN_CURSOR 函数 打开游标 PARSE 存储过程 解析语句 BIND_VARIABLE 存储过程 绑定基本数据类型的变量到游标 BIND_VARIABLE_CHAR 存储过程 绑定到游标的 CHAR 类型 BIND_ARRAY 存储过程 绑定到游标的关联数组类型 BIND_VARIABLE_PKG 存储过程 绑定到游标的包中类型 DEFINE_COLUMN 存储过程 定义基本数据类型接收单行列值 DEFINE_COLUMN_CHAR 存储过程 定义 CHAR 类型接收单行列值 DEFINE_ARRAY 存储过程 定义关联数组类型接收单行列值 EXECUTE 函数 执行游标 FETCH_ROWS 函数 检索游标 EXECUTE_AND_FETCH 函数 执行游标,并检索游标 COLUMN_VALUE 存储过程 返回游标基础数据类型的列值 COLUMN_VALUE 存储过程 (关联数组类型) 返回游标关联数组类型的列值 COLUMN_VALUE_CHAR 存储过程 返回游标 CHAR 类型的列值 VARIABLE_VALUE 存储过程 返回游标基础数据类型的变量值 VARIABLE_VALUE 存储过程 (关联数组类型) 返回游标关联数组类型的变量值 VARIABLE_VALUE_CHAR 存储过程 返回游标 CHAR 类型的变量值 VARIABLE_VALUE_PKG 存储过程 返回游标包中类型的变量值 DESCRIBE_COLUMNS 存储过程 获取查询项的描述信息,为 DESC_TAB 类型 CLOSE_CURSOR 存储过程 关闭游标 IS_OPEN 函数 判断游标是否打开 LAST_ROW_COUNT 函数 返回累计检索出来的行的数量 TO_CURSOR_NUMBER 函数 将游标变量转换为 DBMS_SQL 包内部游标 见续表 75 第 13 章 DBMS_SQL 表 13.3.1 – 续表 子程序名称 说明 TO_REFCURSOR 函数 将 DBMS_SQL 包内的游标转换为本地动态 SQL 游标 RETURN_RESULT 存储过程 返回语句结果集 GET_NEXT_RESULT 存储过程 接收语句结果,并返回给客户端应用程序 LAST_ERROR_POSITION 函数 返回 SQL 语句错误发生处的字节偏移量 LAST_SQL_FUNCTION_CODE 函数 返回该语句的 SQL 函数代码 13.3.1 OPEN_CURSOR 函数 OPEN_CURSOR 函数打开一个新游标,并返回游标的 ID。 语法 DBMS_SQL.OPEN_CURSOR(treat_as_client BOOL DEFAULT FALSE) RETURN INTEGER; 参数说明 treat_as_client 如果为 TRUE,则允许过程将自己设置为客户端;如果为 FALSE,将返回结果返回给客户端应 用程序。该语句的执行结果可以通过 GET_NEXT_RESULT 方法获取。 使用说明 当不再需要此游标时,必须通过调用CLOSE_CURSOR 存储过程 来显式关闭它。可以使用游标来重复运行相同 的 SQL 语句。当重用游标时,在解析新的 SQL 语句时重用相应的游标数据区域的内容。在重用游标之前,没有必要 关闭和重新打开它。 返回值说明 返回新游标的游标 ID 号。 示例 \set SQLTERM / DECLARE c INTEGER; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.CLOSE_CURSOR(c); END; / -----------------ANONYMOUS BLOCK 76 第 13 章 DBMS_SQL 13.3.2 PARSE 存储过程 PARSE 存储过程对游标中的语句进行解析。DDL 语句在解析的同时立即执行。 语法 DBMS_SQL.PARSE ( handle INTEGER, query TEXT, flag INTEGER); DBMS_SQL.PARSE ( handle INTEGER, query CLOB, flag INTEGER); DBMS_SQL.PARSE ( handle INTEGER, query VARCHAR2A, lb INTEGER, ub INTEGER, lfflag BOOLEAN, flag INTEGER); DBMS_SQL.PARSE ( handle INTEGER, query VARCHAR2S, lb INTEGER, ub INTEGER, lfflag BOOLEAN, flag INTEGER); 参数说明 handle 解析语句的游标 ID。 query 要进行解析的 SQL 语句。 flag 指定 SQL 语句的行为。 使用说明 使用 DBMS_SQL 动态运行 DDL 语句可能会导致程序停止响应。例如,对包中的过程的调用会导致包被锁定, 直到执行返回到用户端为止。任何导致锁冲突的操作(例如在第一个锁被释放之前动态的尝试删除包)都会停止程序 77 第 13 章 DBMS_SQL 的运行。 使用不同 flag 参数,则存在不同的数据库行为。 query 的类型可以是 TEXT,CLOB,VARCHAR2A,VARCHAR2S(参考DBMS_SQL 集合类型 ) 。 示例 PARSE 接口函数有多个重载方式,如可传入 TEXT 或集合,示例如下: \set SQLTERM / DECLARE c INTEGER; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'CREATE TABLE IF NOT EXISTS dbmssql_table1(i INT, J TEXT)', DBMS_SQL.NATIVE); DBMS_SQL.CLOSE_CURSOR(c); END; / SELECT COUNT(*) FROM sys_class WHERE relname='dbmssql_table1'; / -------------------ANONYMOUS BLOCK count ------1 (1 row) \set SQLTERM / DECLARE c INTEGER; SQL_STRING DBMS_SQL.VARCHAR2S; BEGIN c := DBMS_SQL.OPEN_CURSOR(); sql_string(1) := 'CREATE TABLE IF NOT EXISTS '; sql_string(2) := 'dbmssql_table2(i INT, J TEXT)'; DBMS_SQL.PARSE(c, sql_string, 1 ,2, true, DBMS_SQL.NATIVE); DBMS_SQL.CLOSE_CURSOR(c); END; / SELECT COUNT(*) FROM sys_class WHERE relname='dbmssql_table2'; / -------------------ANONYMOUS BLOCK 78 第 13 章 DBMS_SQL count ------1 (1 row) 13.3.3 BIND_VARIABLE 存储过程 BIND_VARIABLE 存储过程将一个值或一个集合与游标定义中的占位符绑定,可以通过占位符的位置绑定,也 可以通过占位符的名称绑定。 语法 DBMS_SQL.BIND_VARIABLE ( handle INTEGER, pos INTEGER, val ANYELEMENT [,out_value_size IN INTEGER]); DBMS_SQL.BIND_VARIABLE ( handle placeholder val INTEGER, TEXT, ANYELEMENT [,out_value_size IN INTEGER]); 参数说明 使用说明 如果变量是 IN 或 IN/OUT 变量或 IN 集合,则给定的绑定值必须对该变量或数组类型有效。OUT 变量的值将 被忽略。 SQL 语句的绑定变量或集合由它们的名称标识。当将值绑定到变量或绑定数组时,语句中标识它的字符串必须 包含一个前导冒号,如下所示: SELECT emp_name FROM emp WHERE sal > :x; 对于本例,对应的 bind 调用类似于: BIND_VARIABLE(cursor_name, ':1', 3500); OR BIND_VARIABLE(cursor_name, 1, 3500); 示例 通过参数位置和参数名称两种绑定方式,来对一个 DML 语句做动态 sql 操作,示例如下: 79 第 13 章 DBMS_SQL \set SQLTERM / CREATE TABLE IF NOT EXISTS dbmssql_table1(i INT, J TEXT); / INSERT INTO dbmssql_table1 VALUES (1, 'bbbb'); / DECLARE c INTEGER; r INT; x INT := 1; y VARCHAR2(100) := 'bbbb'; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'delete from dbmssql_table1 WHERE i = :xx and j = :yy', DBMS_SQL.NATIVE); --通过参数位置绑定 DBMS_SQL.BIND_VARIABLE(c, 1, x); DBMS_SQL.BIND_VARIABLE(c, 2, y); r := DBMS_SQL.EXECUTE(c); DBMS_SQL.CLOSE_CURSOR(c); RAISE NOTICE 'd%', c; END; / ---------------------------NOTICE: d ANONYMOUS BLOCK \set SQLTERM / CREATE TABLE IF NOT EXISTS dbmssql_table1(i INT, J TEXT); / INSERT INTO dbmssql_table1 VALUES (1, 'bbbb'); / DECLARE c INTEGER; r INT; x INT := 1; y VARCHAR2(100) := 'bbbb'; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'delete from dbmssql_table1 WHERE i = :xx and j = :yy', DBMS_SQL.NATIVE); --通过参数名称绑定 (可以加':',也可以不加) DBMS_SQL.BIND_VARIABLE(c, 'xx', x); DBMS_SQL.BIND_VARIABLE(c, ':yy', y); r := DBMS_SQL.EXECUTE(c); DBMS_SQL.CLOSE_CURSOR(c); RAISE NOTICE 'd%', c; END; 80 第 13 章 DBMS_SQL / ---------------------------NOTICE: d ANONYMOUS BLOCK 13.3.4 BIND_VARIABLE_CHAR 存储过程 BIND_VARIABLE_CHAR 存储过程将字符串类型的一个值或一个集合与游标定义中的占位符绑定,可以通过 占位符的位置绑定,也可以通过占位符的名称绑定。 语法 DBMS_SQL.BIND_VARIABLE_CHAR ( handle INTEGER, pos INTEGER, val ANYELEMENT, out_value_size IN INTEGER); DBMS_SQL.BIND_VARIABLE_CHAR ( handle placeholder val INTEGER, TEXT, ANYELEMENT, out_value_size IN INTEGER); 参数说明 81 第 13 章 参数 描述 handle 游标 ID pos 绑定变量的位置 val 与游标中的变量绑定的值或本地变量。 DBMS_SQL ADT (user-defined object types) BINARY_DOUBLE BINARY_FLOAT BFILE BLOB BOOLEAN CLOB DATE DSINTERVAL_UNCONSTRAINED NESTED table NUMBER OPAQUE types REF TIME_UNCONSTRAINED TIME_TZ_UNCONSTRAINED TIMESTAMP_LTZ_UNCONSTRAINED TIMESTAMP_TZ_UNCONSTRAINED TIMESTAMP_UNCONSTRAINED UROWID VARCHAR2 VARRAY YMINTERVAL_UNCONSTRAINED out_value_size 如果没有给定大小,则使用当前值的长度。只有当 val 类型为 char,varchar,TEXT 时能指定该参数。 使用说明 该函数只能绑定字符串类型的变量,且必须指定长度;如果指定长度大于实际长度,则取实际长度,否则取指定 长度。 示例 调用 BIND_VARIABLE_CHAR 子程序,且指定字符串长度的示例如下: \set SQLTERM / CREATE TABLE IF NOT EXISTS dbmssql_table1(i INT, J TEXT); 82 第 13 章 DBMS_SQL / INSERT INTO dbmssql_table1 VALUES (1, 'bbbb'); / DECLARE c INTEGER; r INT; x INT := 1; y VARCHAR2(100) := 'bbbbaaaa'; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'delete from dbmssql_table1 WHERE i = :xx and j = :yy', DBMS_SQL.NATIVE); --通过参数位置绑定 DBMS_SQL.BIND_VARIABLE(c, 1, x); DBMS_SQL.BIND_VARIABLE_CHAR(c, 2, y, 4); r := DBMS_SQL.EXECUTE(c); RAISE NOTICE 'r = % ', 1; DBMS_SQL.CLOSE_CURSOR(c); RAISE NOTICE 'd%', c; END; / ---------------------------NOTICE: r = 1 NOTICE: d ANONYMOUS BLOCK \set SQLTERM / CREATE TABLE IF NOT EXISTS dbmssql_table1(i INT, J TEXT); / INSERT INTO dbmssql_table1 VALUES (1, 'bbbb'); / DECLARE c INTEGER; r INT; x INT := 1; y VARCHAR2(100) := 'bbbbaaaa'; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'delete from dbmssql_table1 WHERE i = :xx and j = :yy', DBMS_SQL.NATIVE); --通过参数名称绑定 (可以加':',也可以不加) DBMS_SQL.BIND_VARIABLE(c, 'xx', x); DBMS_SQL.BIND_VARIABLE_CHAR(c, ':yy', y, 4); r := DBMS_SQL.EXECUTE(c); DBMS_SQL.CLOSE_CURSOR(c); RAISE NOTICE 'd%', c; END; 83 第 13 章 DBMS_SQL / ---------------------------NOTICE: d ANONYMOUS BLOCK 13.3.5 BIND_ARRAY 存储过程 BIND_ARRAY 存储过程将 DBMS_SQL 预定义类型的关联数组与游标定义中的占位符绑定,可以通过占位符 的位置绑定,也可以通过占位符的名称绑定。 dbms_sql 将拆分出关联数组中的元素,以所有元素的值作为参数批量执行 dml 语句。 语法 DBMS_SQL.BIND_ARRAY ( handle INTEGER, pos INTEGER, val ANYELEMENT); DBMS_SQL.BIND_ARRAY ( handle placeholder val INTEGER, TEXT, ANYELEMENT); 参数说明 84 第 13 章 参数 描述 handle 游标 ID pos 绑定变量的位置 val 与游标中的变量绑定的值或本地变量。 DBMS_SQL datatype clob_table binary_float_table binary_double_table blob_table bfile_table date_table number_table varchar2_table time_table time_with_time_zone_table timestamp_table timestamp_with_ltz_table timestamp_with_time_zone_table index1 集合元素索引值的下限 index2 集合元素索引值的上限 使用说明 为了绑定范围,表必须包含指定范围的元素——tab(index1) 和 tab(index2),但是范围不必是密集的。Index1 必 须小于等于 index2。在绑定中使用 tab(index1) 和 tab(index2) 之间的所有元素。 如果没有在 bind 调用中指定索引,并且语句中的两个不同绑定指定包含不同数量元素的表,然后实际使用的元 素数量是所有表之间的最小数量。如果指定索引,也会出现这种情况——为所有表选择两个索引之间的最小范围。 不是查询中的所有绑定变量都必须是数组绑定。有些可以是常规绑定,在表达式求值中对集合的每个元素使用相 同的值。 批量 select, INSERT, update 和 delete 可以通过将多个调用绑定到一个调用来提高应用程序的性能。此过程允许 使用 DBMS_SQL 预定义类型的 PL/SQL TABLE 类型。 示例 使用 bind_array 接口来做批量 INSERT 操作,示例如下: \set SQLTERM / CREATE TABLE IF NOT EXISTS dbmssql_table1(i INT, J TEXT); / 85 第 13 章 DBMS_SQL DECLARE c INTEGER; r INT; x DBMS_SQL.NUMBER_TABLE; y DBMS_SQL.varchar2_table; BEGIN c := DBMS_SQL.OPEN_CURSOR(); x(1) := 1; x(2) := 2; x(3) := 3; x(4) := 4; y(1) := 'aaaa'; y(2) := 'bbbb'; y(3) := 'cccc'; y(4) := 'dddd'; DBMS_SQL.PARSE(c, 'INSERT INTO dbmssql_table1 VALUES (:a, :b);', DBMS_SQL.NATIVE); DBMS_SQL.BIND_ARRAY(c, 'a', x); DBMS_SQL.BIND_ARRAY(c, 'b', y); r := DBMS_SQL.EXECUTE(c); DBMS_SQL.CLOSE_CURSOR(c); RAISE NOTICE 'd%', c; END; / ---------------------------NOTICE: d ANONYMOUS BLOCK SELECT * FROM dbmssql_table1; / ---------------------------i | j ---+-----1 | aaaa 2 | bbbb 3 | cccc 4 | dddd (4 rows) 13.3.6 BIND_VARIABLE_PKG 存储过程 BIND_VARIABLE_PKG 存储过程同BIND_VARIABLE 存储过程 ,都可以用来绑定包中或者非包中定义的类 型。 语法 86 第 13 章 DBMS_SQL DBMS_SQL.BIND_VARIABLE_PKG ( handle INTEGER, pos INTEGER, val ANYELEMENT); DBMS_SQL.BIND_VARIABLE_PKG ( handle INTEGER, placeholder val TEXT, ANYELEMENT); 13.3.7 DEFINE_COLUMN 存储过程 DEFINE_COLUMN 存储过程为 select 游标定义被选择的列,定义后可通过 column_value 取出对应列的值。 语法 DBMS_SQL.DEFINE_COLUMN ( handle IN INTEGER, pos IN INTEGER, val ANYELEMENT [,column_size IN INTEGER]); 参数说明 87 第 13 章 DBMS_SQL 参数 描述 handle 游标 ID pos 列在定义行中的相对位置。语句在第一列位置为 1。 val 定义的列的值。此值的类型决定了所定义列的类型。 BINARY_DOUBLE BINARY_FLOAT BFILE BLOB CLOB DATE DSINTERVAL_UNCONSTRAINED NUMBER TIME_UNCONSTRAINED TIME_TZ_UNCONSTRAINED TIMESTAMP_LTZ_UNCONSTRAINED TIMESTAMP_TZ_UNCONSTRAINED TIMESTAMP_UNCONSTRAINED UROWID YMINTERVAL_UNCONSTRAINED ADT(user-defined object types) COLLECTIONS (varrays and nested tables) REFS OPAQUE TYPES column_size 类型为 CHAR,VARCHAR2,TEXT 的列的预期列值的 最大字节大小 示例 define_column 接口在 parse 接口后调用,为 select 游标定义被选择的列,如下所示: \set SQLTERM ; DROP TABLE t2; CREATE TABLE t2(id INT,name INT); INSERT INTO t2 VALUES (1,2); \set SQLTERM / DECLARE c INTEGER; n INT; 88 第 13 章 DBMS_SQL result INT; dc INT; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'SELECT * FROM t2', DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(c, 1, n); DBMS_SQL.DEFINE_COLUMN(c, 2, result); DBMS_SQL.CLOSE_CURSOR(c); END; / ---------------------------ANONYMOUS BLOCK \set SQLTERM ; DROP TABLE t2; CREATE TABLE t2(id INT,name TEXT); INSERT INTO t2 VALUES (1,'zs'); --define_column 接口可以定义预期列值的最大字节大小 \set SQLTERM / DECLARE c INTEGER; n INT; result TEXT; dc INT; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'SELECT * FROM t2', DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(c, 1, n); DBMS_SQL.DEFINE_COLUMN(c, 2, result, 2); DBMS_SQL.CLOSE_CURSOR(c); END; / ---------------------------ANONYMOUS BLOCK 13.3.8 DEFINE_COLUMN_CHAR 存储过程 DEFINE_COLUMN_CHAR 存储过程为 select 游标定义被选择的列,定义后可通过 column_value 取出对应列 的值,其中列类型必须是 CHAR,VARCHAR,TEXT。 语法 89 第 13 章 DBMS_SQL DBMS_SQL.DEFINE_COLUMN ( handle IN INTEGER, pos IN INTEGER, val ANYELEMENT, column_size IN INTEGER); 参数说明 参数 描述 handle 游标 ID pos 列在定义行中的相对位置。语句在第一列位置为 1。 val 定义的列的值。此值的类型决定了所定义列的类型。 CHAR VARCHAR TEXT column_size 类型为 CHAR,VARCHAR2,TEXT 的列的预期列值的 最大字节大小 示例 DEFINE_COLUMN_CHAR 可以指定预期列值的最大字节大小,如下所示: \set SQLTERM ; DROP TABLE t2; CREATE TABLE t2(id INT,name TEXT); INSERT INTO t2 VALUES (1,'zs'); \set SQLTERM / DECLARE c INTEGER; n INT; result VARCHAR2(10); dc INT; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'SELECT * FROM t2', DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(c, 1, n); DBMS_SQL.DEFINE_COLUMN_CHAR(c, 2, result, 2); DBMS_SQL.CLOSE_CURSOR(c); END; / 90 第 13 章 DBMS_SQL ---------------------------ANONYMOUS BLOCK 13.3.9 DEFINE_ARRAY 存储过程 DEFINE_ARRAY 存储过程定义一个集合类型接收某一列的值。这个过程允许您从单个 SELECT 语句批量 提取行。FETCH_ROWS 调用后,会将许多行存入 PL/ SQL 聚合对象中。当你获取这些行时,它们将被赋值到 DBMS_SQL 缓存区中,直到运行一个 COLUMN_VALUE 调用,这时这些行将被复制到作为参数传递给 COLUMN_VALUE 调用的表中。 语法 DBMS_SQL.DEFINE_ARRAY ( handle IN INTEGER, pos IN INTEGER, val IN ANYELEMENT, cnt IN INTEGER, lower_bnd IN INTEGER); 参数说明 91 第 13 章 DBMS_SQL 参数 描述 handle 游标 ID pos 列在定义行中的相对位置。语句在第一列位置为 1。 val 定义的列的值。此值的类型决定了所定义列的类型。 datatype clob_table binary_float_table binary_double_table blob_table bfile_table date_table number_table urowid_table varchar2_table time_table time_with_time_zone_table timestamp_table timestamp_with_ltz_table timestamp_with_time_zone_table cnt 必须提取的行数 lower_bnd 从下限索引开始,将结果复制到集合中 示例 DEFINE_ARRAY 定义关联数组类型接收单行列值,如下所示: \set SQLTERM ; DROP TABLE t2; CREATE TABLE t2(id INT,name TEXT); INSERT INTO t2 VALUES (1,'zs'); \set SQLTERM / DECLARE c INTEGER; n DBMS_SQL.NUMBER_TABLE; result DBMS_SQL.varchar2_table; dc INT; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'SELECT * FROM t2', DBMS_SQL.NATIVE); 92 第 13 章 DBMS_SQL DBMS_SQL.DEFINE_ARRAY(c, 1, n, 1, 1); DBMS_SQL.DEFINE_ARRAY(c, 2, result, 1, 1); DBMS_SQL.CLOSE_CURSOR(c); END; / ---------------------------ANONYMOUS BLOCK 13.3.10 EXECUTE 函数 EXECUTE 函数执行给定的游标,返回已处理的行数(仅对 INSERT、UPDATE 和 DELETE 语句,其他类型 的语句返回值是不确定的)。 语法 DBMS_SQL.EXECUTE (handle INTEGER) RETURN INTEGER; 参数说明 参数 描述 handle 游标 ID 使用说明 TO_CURSOR_NUMBER 函数返回的 DBMS_SQL 游标的执行方式与已经执行的 DBMS_SQL 游标相同。 返回值说明 INTEGER 类型,返回已处理的行数。 示例 \set SQLTERM / DECLARE c NUMBER; r NUMBER; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'CREATE TABLE IF NOT EXISTS tx (i INT)', DBMS_SQL.NATIVE); r := DBMS_SQL.EXECUTE(c); DBMS_SQL.CLOSE_CURSOR(c); END; / 93 第 13 章 DBMS_SQL 13.3.11 FETCH_ROWS 函数 FETCH_ROWS 函数从给定游标中获取数据,并且返回实际获取的行数。只要还有行需要提取,就可以重复调 用 FETCH_ROWS。这些行被检索到缓冲区中,如果需要读取数据则需要调用 COLUMN_VALUE 函数来读取。不 能采用 NO_DATA_FOUND 或游标属性%NOTFOUND 判断是否检索到数据。 语法 DBMS_SQL.FETCH_ROWS(handle INTEGER) RETURN INTEGER; 参数说明 参数 描述 handle 游标 ID 使用说明 如果该游标不是关联 select 语句,调用该方法则报错“fetch out of sequence”。 返回值说明 INTEGER 类型,返回实际获取的行数。 示例 FETCH_ROWS 用于检索游标,如下所示: set serverout on \set SQLTERM / DROP TABLE t1; / CREATE TABLE t1(i INT); / INSERT INTO t1 VALUES(1),(2),(3); / DECLARE c NUMBER; d NUMBER; begin c := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(c, 'SELECT * FROM t1', DBMS_SQL.NATIVE); d := DBMS_SQL.EXECUTE_AND_FETCH(c); DBMS_OUTPUT.PUT_LINE('d:'||d); d := DBMS_SQL.FETCH_ROWS(c); DBMS_OUTPUT.PUT_LINE('d:'||d); DBMS_SQL.CLOSE_CURSOR(c); end; 94 第 13 章 DBMS_SQL / ----------------------ANONYMOUS BLOCK d:1 d:1 13.3.12 EXECUTE_AND_FETCH 函数 EXECUTE_AND_FETCH 函数执行游标,检索数据,返回实际检索行的数量。 语法 DBMS_SQL.EXECUTE_AND_FETCH ( handle INTEGER, exact BOOL DEFAULT FALSE) RETURN INTEGER; 参数说明 参数 描述 handle 游标 ID exact 设置为 TRUE,如果当查询行的数量与检索行的数量不 同,则抛出异常。 返回值说明 INTEGER 类型,返回指定的行数。 示例 参见FETCH_ROWS 函数 的 示例。 13.3.13 COLUMN_VALUE 存储过程 COLUMN_VALUE 存储过程用于访问给定游标,给定位置,指定为基本数据类型的列值。此过程用于获取 fetch_rows 调用后的数据。 语法 DBMS_SQL.COLUMN_VALUE ( handle INTEGER, pos INTEGER, val IN OUT ANYELEMENT ); 95 第 13 章 DBMS_SQL 参数说明 参数 描述 handle 游标 ID pos 列在定义行中的相对位置。语句在第一列位置为 1。 val 返回指定列处的值。 BINARY_DOUBLE BINARY_FLOAT BFILE BLOB CLOB DATE DSINTERVAL_UNCONSTRAINED NUMBER TIME_TZ_UNCONSTRAINED TIME_UNCONSTRAINED TIMESTAMP_LTZ_UNCONSTRAINED TIMESTAMP_TZ_UNCONSTRAINED TIMESTAMP_UNCONSTRAINED UROWID VARCHAR2 YMINTERVAL_UNCONSTRAINED ADT(user-defined object types) COLLECTIONS (varrays and nested tables) REFS OPAQUE TYPES 示例 使用 dbms_sql 接口函数从 dbmssql_table1 表中获取结果集,示例如下: \set SQLTERM / CREATE TABLE IF NOT EXISTS dbmssql_table1 (i INT, j TEXT); / INSERT INTO dbmssql_table1 VALUES (1, 'foo'); INSERT INTO dbmssql_table1 VALUES (2, 'bar'); / DECLARE c INTEGER; 96 第 13 章 DBMS_SQL n INT; i INT; j TEXT := 'who'; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'select i, j from dbmssql_table1', DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(c, 1, i); DBMS_SQL.DEFINE_COLUMN(c, 2, j); n := DBMS_SQL.EXECUTE(c); LOOP EXIT WHEN DBMS_SQL.FETCH_ROWS(c) <= 0; DBMS_SQL.COLUMN_VALUE(c, 1, i); DBMS_SQL.COLUMN_VALUE(c, 2, j); RAISE NOTICE 'i = %, j = %', i, j; RAISE NOTICE 'LAST_ROW_COUNT = %', DBMS_SQL.LAST_ROW_COUNT(); END LOOP; DBMS_SQL.CLOSE_CURSOR(c); END; / --------------------------NOTICE: i = 1, j = foo NOTICE: LAST_ROW_COUNT = 1 NOTICE: i = 2, j = bar NOTICE: LAST_ROW_COUNT = 2 ANONYMOUS BLOCK 13.3.14 COLUMN_VALUE 存储过程 (关联数组类型) COLUMN_VALUE 存储过程 (关联数组类型) 用于访问给定游标,给定位置,指定为关联数组类型的列值。此 过程用于获取 fetch_rows 调用后的数据。 语法 DBMS_SQL.COLUMN_VALUE ( handle INTEGER, pos INTEGER, val IN OUT ANYELEMENT ); 参数说明 97 第 13 章 DBMS_SQL 参数 描述 handle 游标 ID pos 列在定义行中的相对位置。语句在第一列位置为 1。 val 返回指定列处的值。类型为 clob_table binary_float_table binary_double_table blob_table bfile_table date_table number_table varchar2_table time_table time_with_time_zone_table timestamp_table timestamp_with_ltz_table timestamp_with_time_zone_table 示例 使用 dbms_sql 接口函数从 dbmssql_table1 表中获取结果集,并将结果集赋值到关联数组中,示例如下: \set SQLTERM / CREATE TABLE IF NOT EXISTS dbmssql_table1 (i INT, j TEXT); / INSERT INTO dbmssql_table1 VALUES (1, 'foo'); INSERT INTO dbmssql_table1 VALUES (2, 'bar'); / DECLARE c INTEGER; n INT; i DBMS_SQL.NUMBER_TABLE; j DBMS_SQL.varchar2_table; r INT; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'select i, j from dbmssql_table1', DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_ARRAY(c, 1, i, 3, 1); DBMS_SQL.DEFINE_ARRAY(c, 2, j, 3, 1); 98 第 13 章 DBMS_SQL n := DBMS_SQL.EXECUTE(c); n := DBMS_SQL.FETCH_ROWS(c); DBMS_SQL.COLUMN_VALUE(c, 1, i); DBMS_SQL.COLUMN_VALUE(c, 2, j); FOR r IN i.first..i.last LOOP RAISE NOTICE 'i(%) = %, j(%) = %', r, i(r), r, j(r); END LOOP; DBMS_SQL.CLOSE_CURSOR(c); END; / --------------------------NOTICE: i(1) = 1, j(1) = foo NOTICE: i(2) = 2, j(2) = bar ANONYMOUS BLOCK 13.3.15 COLUMN_VALUE_CHAR 存储过程 COLUMN_VALUE_CHAR 存储过程用来返回 CHAR 类型或者非 CHAR 的类型的值,同COLUMN_VALUE 存储过程 和COLUMN_VALUE 存储过程 (关联数组类型) 一致。 语法 DBMS_SQL.COLUMN_VALUE_CHAR ( handle INTEGER, pos INTEGER, val IN OUT ANYELEMENT ); 13.3.16 VARIABLE_VALUE 存储过程 VARIABLE_VALUE 存储过程返回给定游标的命名变量的值,它用于返回 PL/SQL 块或带有 RETURNING 短 语的 DML 语句中绑定变量的值。 语法 DBMS_SQL.VARIABLE_VALUE ( handle IN INTEGER, pos IN INTEGER, val IN OUT ANYELEMENT); 参数说明 99 第 13 章 参数 描述 handle 游标 ID pos 需要返回值的占位符的位置 val 返回指定位置的变量的值。 DBMS_SQL BINARY_DOUBLE BINARY_FLOAT BFILE BLOB CLOB DATE DSINTERVAL_UNCONSTRAINED NUMBER TIME_TZ_UNCONSTRAINED TIME_UNCONSTRAINED TIMESTAMP_LTZ_UNCONSTRAINED TIMESTAMP_TZ_UNCONSTRAINED TIMESTAMP_UNCONSTRAINED UROWID VARCHAR2 YMINTERVAL_UNCONSTRAINED ADT(user-defined object types) COLLECTIONS (varrays and nested tables) REFS OPAQUE TYPES 示例 使用 variable_value 获取绑定变量的值,示例如下: \set SQLTERM / CREATE TABLE IF NOT EXISTS dbmssql_table1 (i INT, j TEXT); / INSERT INTO dbmssql_table1 VALUES (1, 'foo'); INSERT INTO dbmssql_table1 VALUES (2, 'bar'); / DECLARE c INTEGER; r INT; x TEXT := 'bar'; y VARCHAR2; 100 第 13 章 DBMS_SQL BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'SELECT * FROM dbmssql_table1 WHERE j = :xx', DBMS_SQL.NATIVE); DBMS_SQL.BIND_VARIABLE(c, 1, x); r := DBMS_SQL.EXECUTE(c); DBMS_SQL.VARIABLE_VALUE(c, 1, y); RAISE NOTICE 'y1 = %', y; DBMS_SQL.CLOSE_CURSOR(c); END; / --------------------------NOTICE: y1 = bar ANONYMOUS BLOCK 13.3.17 VARIABLE_VALUE 存储过程 (关联数组类型) VARIABLE_VALUE 存储过程 (关联数组类型) 返回给定游标的命名变量的值,它用于返回 PL/SQL 块或带有 RETURNING 短语的 DML 语句中绑定变量的值。 语法 DBMS_SQL.VARIABLE_VALUE ( handle IN INTEGER, pos IN INTEGER, val IN OUT ANYELEMENT); 参数说明 101 第 13 章 参数 描述 handle 游标 ID pos 需要返回值的占位符的位置 val 数组选项返回指定位置的变量的值。 DBMS_SQL clob_table binary_float_table binary_double_table blob_table bfile_table date_table number_table varchar2_table time_table time_with_time_zone_table timestamp_table timestamp_with_ltz_table timestamp_with_time_zone_table 示例 使用 variable_value 接口函数获取绑定变量的值,示例如下: \set SQLTERM / CREATE TABLE IF NOT EXISTS dbmssql_table1 (i INT, j TEXT); / INSERT INTO dbmssql_table1 VALUES (1, 'foo'); INSERT INTO dbmssql_table1 VALUES (2, 'bar'); / DECLARE c INTEGER; r INT; i INT; x DBMS_SQL.varchar2_table; y DBMS_SQL.varchar2_table; BEGIN c := DBMS_SQL.OPEN_CURSOR(); x(1) := 'foo'; x(2) := 'bar'; DBMS_SQL.PARSE(c, 'SELECT * FROM dbmssql_table1 WHERE j = :xx', DBMS_SQL.NATIVE); DBMS_SQL.BIND_ARRAY(c, 1, x); r := DBMS_SQL.EXECUTE(c); 102 第 13 章 DBMS_SQL DBMS_SQL.VARIABLE_VALUE(c, 1, y); FOR i IN y.first..y.last LOOP RAISE NOTICE 'y(%) = %', i, y(i); END LOOP; DBMS_SQL.CLOSE_CURSOR(c); END; / --------------------------NOTICE: y(1) = foo NOTICE: y(2) = bar ANONYMOUS BLOCK 13.3.18 VARIABLE_VALUE_CHAR 存储过程 VARIABLE_VALUE_CHAR 存储过程用来返回 CHAR 类型或者非 CHAR 的 类 型 的 值, 同VARIABLE_VALUE 存储过程 和VARIABLE_VALUE 存储过程 (关联数组类型) 一致。 语法 DBMS_SQL.VARIABLE_VALUE_CHAR ( handle IN INTEGER, pos IN INTEGER, val IN OUT ANYELEMENT); 13.3.19 VARIABLE_VALUE_PKG 存储过程 VARIABLE_VALUE_PKG 存储过程用来返回包中类型或者非包中类型的值,同VARIABLE_VALUE 存储过 程 和VARIABLE_VALUE 存储过程 (关联数组类型) 一致。 语法 DBMS_SQL.VARIABLE_VALUE_PKG ( handle IN INTEGER, pos IN INTEGER, val IN OUT ANYELEMENT); 13.3.20 DESCRIBE_COLUMNS 存储过程 DESCRIBE_COLUMNS 存储过程返回描述查询列表的所有列信息(DESC_TAB 类型),需要经过调用 DBMS_SQL 包中 OPEN_CURSOR 存储过程和PARSE 存储过程 。 语法 103 第 13 章 DBMS_SQL DBMS_SQL.DESCRIBE_COLUMNS ( handle INTEGER, col_cnt OUT INTEGER, desc_t OUT DBMS_SQL.DESC_TAB); 参数说明 参数 描述 handle 被描述列的游标 ID 号 col_cnt select 语句中列表中的列数 desc_t 返回描述表,表中记录了查询列表中每个列的描述 示例 对 select 语句做 PARSE 操作后,可以使用 DESCRIBE_COLUMNS 过程获取相关表的表结构信息,示例如下: set serverout on \set SQLTERM ; DROP TABLE t1; CREATE TABLE t1(id INT,name VARCHAR(50)); \set SQLTERM / CREATE OR REPLACE PROCEDURE pr1 IS v3 DBMS_SQL.DESC_TAB; v4 INT; col_num INT; cursor_id INT; BEGIN cursor_id :=DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(cursor_id, 'SELECT * FROM t1', DBMS_SQL.NATIVE); DBMS_SQL.DESCRIBE_COLUMNS(cursor_id,v4,v3); col_num := v3.FIRST; DBMS_OUTPUT.PUT_LINE('col_num:'||col_num); WHILE col_num IS NOT NULL LOOP DBMS_OUTPUT.PUT_LINE(v3(col_num).COL_MAX_LEN); col_num := v3.NEXT(col_num); DBMS_OUTPUT.PUT_LINE('col_num:'||col_num); END LOOP; DBMS_SQL.CLOSE_CURSOR(cursor_id); END; / call pr1(); / ------------------------------- 104 第 13 章 DBMS_SQL CALL col_num:1 4 col_num:2 50 col_num: 13.3.21 CLOSE_CURSOR 存储过程 CLOSE_CURSOR 存储过程用于关闭游标 ID,并释放占用的内存空间。 语法 DBMS_SQL.CLOSE_CURSOR(handle IN OUT INTEGER); 参数说明 参数 模式 描述 handle IN 游标 ID handle OUT 游标被设置为 NULL。 在 调 用 CLOSE_CURSOR 后, 分 配 给 游 标 的内存被释放,您不能再从该游标中获 取数据。 示例 参见OPEN_CURSOR 函数 的 示例。 13.3.22 IS_OPEN 函数 IS_OPEN 函数用于检查指定的游标是否已经打开。 语法 DBMS_SQL.IS_OPEN(c IN INTEGER) RETURN BOOLEAN; 参数说明 参数 模式 描述 c IN 游标 ID 105 第 13 章 DBMS_SQL 返回值说明 对于已打开但未关闭的任何游标编号返回 TRUE, 对 于 NULL 游标编号返回 FALSE, 请 注 意, CLOSE_CURSOR 过程会将传递给它的游标变量设为 NULL。 示例 is_open 接口用于判断游标是否打开,如下所示: \set SQLTERM ; CREATE TABLE IF NOT EXISTS dbmssql_table1(i INT, J TEXT); \set SQLTERM / DECLARE c INTEGER; r INT; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'select i, j from dbmssql_table1', DBMS_SQL.NATIVE); IF DBMS_SQL.is_open(c) THEN DBMS_SQL.CLOSE_CURSOR(c); RAISE NOTICE 'A opened, now close it'; END IF; END; / ----------------------------------NOTICE: A opened, now close it ANONYMOUS BLOCK 13.3.23 LAST_ROW_COUNT 函数 LAST_ROW_COUNT 函数返回累计检索出来的行的数量。 语法 DBMS_SQL.LAST_ROW_COUNT RETURN INTEGER; 使用说明 在FETCH_ROWS 函数 或EXECUTE_AND_FETCH 函数 调用之后调用这个函数。如果在 EXECUTE 调用 之后马上调用此函数,则返回的值为 0。 返回值说明 返回所获取的行数的累计计数。 示例 通过 last_row_count 接口可以获取当前处理的行数,示例如下: 106 第 13 章 DBMS_SQL set serverout on \set SQLTERM ; DROP TABLE t2; CREATE TABLE t2(id INT,name INT); \set SQLTERM / DECLARE c INTEGER; r INT; a INT := 10; b INT := 20; BEGIN c := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(c, 'INSERT INTO t2 VALUES (:1, :2)', DBMS_SQL.NATIVE); DBMS_SQL.BIND_VARIABLE(c, '1', a); DBMS_SQL.BIND_VARIABLE(c, '2', b); r := DBMS_SQL.EXECUTE(c); DBMS_OUTPUT.PUT_LINE( 'r:' || r); DBMS_OUTPUT.PUT_LINE( DBMS_SQL.LAST_ROW_COUNT); DBMS_SQL.CLOSE_CURSOR(c); END; / ---------------------------ANONYMOUS BLOCK r:1 1 13.3.24 TO_CURSOR_NUMBER 函数 TO_CURSOR_NUMBER 函数接受一个打开的强类型或弱类型 ref 游标,并将其转换为 DBMS_SQL 游标号。 语法 DBMS_SQL.TO_CURSOR_NUMBER( c INOUT refcursor) RETURN INTEGER 参数说明 参数 描述 c 游标变量 返回值说明 107 第 13 章 DBMS_SQL 返回从 REF 游标转换而来的 DBMS_SQL 中可管理的游标 ID。 使用说明 1. 必须打开传入的 REF 游标,否则会引发错误。 2. 在将 REF 游标转换为 DBMS_SQL 游标号之后,任何本地动态 SQL 操作不再可以访问 REF 游标。 3. 这个子程序返回的 DBMS_SQL 游标的执行方式与已经执行的 DBMS_SQL 游标相同。 示例 游标变量转换为 DBMS_SQL 包内部游标,示例如下: \set SQLTERM ; CREATE TABLE IF NOT EXISTS dbmssql_table1 (i INT, j TEXT); \set SQLTERM / DECLARE v_cur INT; i INT; j TEXT; v_count INT; cur refcursor; BEGIN OPEN cur FOR SELECT i, j FROM dbmssql_table1; v_cur := DBMS_SQL.TO_CURSOR_NUMBER(cur); DBMS_SQL.DEFINE_COLUMN(v_cur, 1, i); DBMS_SQL.DEFINE_COLUMN(v_cur, 2, j); LOOP v_count := DBMS_SQL.FETCH_ROWS(v_cur); EXIT WHEN v_count <= 0; DBMS_SQL.COLUMN_VALUE_CHAR(v_cur, 1, i); DBMS_SQL.COLUMN_VALUE(v_cur, 2, j); RAISE NOTICE 'i = %, j = %', i, j; END LOOP; DBMS_SQL.CLOSE_CURSOR(v_cur); END; / ---------------------------NOTICE: i = 1, j = foo NOTICE: i = 2, j = bar ANONYMOUS BLOCK 108 第 13 章 DBMS_SQL 13.3.25 TO_REFCURSOR 函数 TO_REFCURSOR 函数将使用 DBMS_SQL 包打开、解析、执行过的游标 ID 转换为本地动态 SQL 可管理的 REF 游标(弱类型游标),可供本地动态 SQL 使用。此子程序只与 select 游标一起使用。 语法 DBMS_SQL.TO_REFCURSOR( c INTEGER) RETURN refcursor 参数说明 参数 描述 c 游标 ID 返回值说明 返回从 DBMS_SQL 游标 ID 转换而来的 PL/SQL REF 游标。 使用说明 1. 通过 cursor_name 传入的游标必须被打开、解析和执行,否则会引发错误。 2. 将 cursor_name 转换为 REF 游标后,任何 DBMS_SQL 操作都不能访问 cursor_number。 3. 在使用 DBMS_SQL 将 cursor_name 转换为 REF 游标之后,IS_OPEN 检查 cursor_name 是否打开会导致错 误。 示例 DBMS_SQL 包内的游标经过 execute 操作后,可使用 to_refcursor 转换为本地动态 SQL 游标,示例如下: \set SQLTERM ; CREATE TABLE IF NOT EXISTS dbmssql_table1 (i INT, j TEXT); \set SQLTERM / DECLARE v_cur NUMBER; sql_string VARCHAR2(1024); i INT; j TEXT; v_count INT; cur refcursor; v_name VARCHAR2(60); BEGIN v_name := 'zs'; v_cur := DBMS_SQL.OPEN_CURSOR(); sql_string := 'select i, j from dbmssql_table1'; 109 第 13 章 DBMS_SQL DBMS_SQL.PARSE(v_cur, sql_string, DBMS_SQL.NATIVE); v_count := DBMS_SQL.EXECUTE(v_cur); cur := DBMS_SQL.TO_REFCURSOR(v_cur); LOOP FETCH cur INTO i, j; EXIT WHEN cur%NOTFOUND; RAISE NOTICE 'i = %, j = %', i, j; END LOOP; close cur; END; / ---------------------------NOTICE: i = 1, j = foo NOTICE: i = 2, j = bar ANONYMOUS BLOCK 13.3.26 RETURN_RESULT 存储过程 RETURN_RESULT 存储过程让子程序隐式地将查询结果返回给客户机程序(它间接调用子程序)或子程序的 直接调用者。直接调用者执行递归语句,在递归语句中返回该语句结果。在 DBMS_SQL.RETURN_RESULT 调用 后,该语句结果只有接收者可以访问它。 语法 DBMS_SQL.RETURN_RESULT( rc IN refcursor, to_client IN BOOLEAN DEFAULT TRUE) DBMS_SQL.RETURN_RESULT( rc IN INTEGER, to_client IN BOOLEAN DEFAULT TRUE) 参数说明 参数 描述 rc 游标变量或游标 ID to_client 预留参数,暂无意义 使用说明 110 第 13 章 DBMS_SQL 1. 目前只能返回 SQL 查询,不支持通过远程过程调用返回语句结果。 2. 一旦使用该方法后,除了返回它的客户端或直接调用者外,就不能再访问它了。 3. 当客户端执行的语句或任何中间递归语句是 SQL 查询并引发错误时,不能返回语句结果。 4. 返回的 ref 游标可以是强类型的,也可以是弱类型的。 5. 返回的查询可以部分获取。 6. 要从 PL/SQL 中的递归语句检索返回的语句结果,可以使用 DBMS_SQL 执行递归语句。 示例 通过 return_result 接口将结果集返回到客户端,示例如下: \set SQLTERM ; CREATE TABLE IF NOT EXISTS dbmssql_table1 (i INT, j TEXT); \set SQLTERM / DECLARE cur1 refcursor; cur2 INT; i_ret INT; BEGIN OPEN cur1 FOR SELECT * FROM dbmssql_table1; DBMS_SQL.RETURN_RESULT(cur1); cur2 := DBMS_SQL.OPEN_CURSOR(TRUE); DBMS_SQL.PARSE(cur2, 'SELECT * FROM dbmssql_table1;',DBMS_SQL.NATIVE); i_ret := DBMS_SQL.EXECUTE(cur2); DBMS_SQL.RETURN_RESULT(cur2); END; / ---------------------------i | j ---+----1 | foo 2 | bar (2 rows) i | j ---+----1 | foo 2 | bar (2 rows) ANONYMOUS BLOCK 111 第 13 章 DBMS_SQL 13.3.27 GET_NEXT_RESULT 存储过程 GET_NEXT_RESULT 存储过程获取RETURN_RESULT 存储过程 返回的一个查询结果,并返回给接收者。 GET_NEXT_RESULT 与 RETURN_RESULT 返回结果的顺序相同。 语法 DBMS_SQL.GET_NEXT_RESULT( c IN INTEGER, rc OUT refcursor) 参数 描述 c 表示一个已经打开的游标 ID, 该 游 标 直 接 或 间 接 调 用 一 个 子 程 序, 而 子 程 序 调 用 RE- TURN_RESULT 过程隐式返回一个查询结果。 表示一个 SYS_REFCURSOR 类型的游标变量或者一个已经打开的游标 ID,接收一个 RE- rc TURN_RESULT 过程返回的结果。 使用说明 1. 在检索语句结果的游标之后,调用者必须在不再需要游标时正确关闭该游标。 2. 所有未检索返回语句的游标将在递归语句的游标关闭后关闭。 3. 要打开游标并获得它的游标 ID,请调用 DBMS_SQL.OPEN_CURSOR 方法,DBMS_SQL.OPEN_CURSOR 有一个可选的参数 treat_as_client。当此参数为 FALSE(默认参数)时,打开此游标(用来调用子程序) 的调用方不会被视为客户端接受查询结果的子程序,相反,这些查询结果在较上层返回给客户机。如果 treat_as_client 为 TRUE,调用者将被视为客户端。 示例 使用游标变量和 DBMS_SQL 游标获取 RETURN_RESULT 过程返回的结果集,示例如下: \set SQLTERM ; CREATE TABLE IF NOT EXISTS dbmssql_table1 (i INT, j TEXT); \set SQLTERM / --将游标的结果集返回给 get_results 的调用者 CREATE OR REPLACE PROCEDURE get_results(p_id IN NUMBER DEFAULT NULL) AS cur1 refcursor; cur2 refcursor; BEGIN IF p_id IS NOT NULL THEN OPEN cur1 FOR SELECT * FROM dbmssql_table1; DBMS_SQL.RETURN_RESULT(cur1); END IF; 112 第 13 章 DBMS_SQL OPEN cur2 FOR SELECT * FROM dbmssql_table1; DBMS_SQL.RETURN_RESULT(cur2); END; / --使用游标变量获取 RETURN_RESULT 过程返回的结果集 DECLARE c INTEGER; c1 INTEGER; sqlstmt VARCHAR2(1024); rc refcursor; i_ret INT; i INT; j TEXT; BEGIN c := DBMS_SQL.OPEN_CURSOR(TRUE); sqlstmt := 'begin get_results(1);end;'; DBMS_SQL.PARSE(c, sqlstmt,DBMS_SQL.NATIVE); i_ret := DBMS_SQL.EXECUTE(c); LOOP BEGIN --使用 rc 接收 c 的结果集 DBMS_SQL.get_next_result(c,rc); EXCEPTION WHEN NO_DATA_FOUND THEN EXIT; END; LOOP FETCH rc INTO i, j; EXIT WHEN rc%NOTFOUND; RAISE NOTICE 'i = %, j = %', i, j; END LOOP; END LOOP; DBMS_SQL.CLOSE_CURSOR(c); END; / ---------------------------NOTICE: i = 1, j = foo NOTICE: i = 2, j = bar NOTICE: i = 1, j = foo NOTICE: i = 2, j = bar ANONYMOUS BLOCK 113 第 13 章 DBMS_SQL --使用 dbms_sql 游标获取 RETURN_RESULT 过程返回的结果集 \set SQLTERM / DECLARE c INTEGER; c1 INTEGER; sqlstmt VARCHAR2(1024); rc refcursor; i_ret INT; i INT; j TEXT; BEGIN c := DBMS_SQL.OPEN_CURSOR(TRUE); sqlstmt := 'begin get_results(1);end;'; DBMS_SQL.PARSE(c, sqlstmt,DBMS_SQL.NATIVE); i_ret := DBMS_SQL.EXECUTE(c); LOOP BEGIN DBMS_SQL.GET_NEXT_RESULT(c,c1); EXCEPTION WHEN NO_DATA_FOUND THEN EXIT; END; DBMS_SQL.DEFINE_COLUMN(c1, 1, i); DBMS_SQL.DEFINE_COLUMN(c1, 2, j); LOOP EXIT WHEN DBMS_SQL.FETCH_ROWS(c1) <= 0; DBMS_SQL.COLUMN_VALUE(c1, 1, i); DBMS_SQL.COLUMN_VALUE(c1, 2, j); RAISE NOTICE 'i = %, j = %', i, j; END LOOP; END LOOP; DBMS_SQL.CLOSE_CURSOR(c1); END; / ---------------------------NOTICE: i = 1, j = foo NOTICE: i = 2, j = bar NOTICE: i = 1, j = foo NOTICE: i = 2, j = bar ANONYMOUS BLOCK 114 第 13 章 DBMS_SQL 13.3.28 LAST_ERROR_POSITION 函数 LAST_ERROR_POSITION 函数返回发生错误的 SQL 语句文本中的字节偏移量。SQL 语句中的第一个字符位 于位置 0。 语法 DBMS_SQL.LAST_ERROR_POSITION() RETURN INTEGER 返回值说明 返回发生错误的 SQL 语句文本中的字节偏移量。 使用说明 调用该函数在 PARSE 调用之后,在调用任何其他 DBMS_SQL 过程或函数之前。 示例 在异常块中使用 LAST_ERROR_POSITION 获取语句错误位置,示例如下: \set SQLTERM ; CREATE TABLE IF NOT EXISTS dbmssql_table1 (i INT, j TEXT); \set SQLTERM / DECLARE v_cur INT; sql_string VARCHAR2(1024); v_count INT; error_offset NUMBER; b INT := 1; BEGIN sql_string := 'select i, j, k from dbmssql_table1'; v_cur := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(v_cur, sql_string, DBMS_SQL.NATIVE); v_count := DBMS_SQL.EXECUTE(v_cur); v_count := DBMS_SQL.FETCH_ROWS(v_cur); EXCEPTION WHEN OTHERS THEN error_offset := DBMS_SQL.LAST_ERROR_POSITION(); RAISE NOTICE 'error_offset:%',error_offset; DBMS_SQL.CLOSE_CURSOR(v_cur); END / ---------------------------- 115 第 13 章 NOTICE: DBMS_SQL error_offset:13 ANONYMOUS BLOCK 13.3.29 LAST_SQL_FUNCTION_CODE 函数 LAST_SQL_FUNCTION_CODE 函数返回该语句的 SQL 函数代码。 语法 DBMS_SQL.LAST_SQL_FUNCTION_CODE RETURN INTEGER; 返回值说明 返回该语句的 SQL 函数代码。 使用说明 1. 该函数在未执行任何语句时调用返回默认值 0。 2. 在 PARSE 语句之后该函数返回语句的 SQL 函数代码。 3. 同一个 session 中,如果之前执行的 PLSQL 过程已调用一次 PARSE 语句,且当前 PLSQL 过程未调用 OPEN_CURSOR 函数,该函数返回上一次 PARSE 的值;调用 OPEN_CURSOR 后,PARSE 语句前调用, 返回默认值 0。 SQL SQL 语句 代码 SQL SQL 语句 代码 SQL SQL 语句 代码 01 CREATE TABLE 43 (NOT USED) 85 TRUNCATE TABLE 02 SET ROLE 44 (NOT USED) 86 (NOT USED) 03 INSERT 45 (NOT USED) 87 (NOT USED) 04 SELECT 46 (NOT USED) 88 (NOT USED) 05 UPDATE 47 (NOT USED) 89 (NOT USED) 06 DROP ROLE(USER) 48 (NOT USED) 90 SET CONSTRAINTS 07 DROP VIEW 49 (NOT USED) 91 CREATE FUNCTION 08 DROP TABLE 50 (NOT USED) 92 (NOT USED) 09 DELETE 51 (NOT USED) 93 DROP FUNCTION 10 CREATE VIEW 52 (NOT USED) 94 CREATE PACKAGE 见续表 116 第 13 章 DBMS_SQL 表 13.3.2 – 续表 SQL SQL 语句 代码 SQL SQL 语句 代码 SQL SQL 语句 代码 11 (NOT USED) 53 (NOT USED) 95 (NOT USED) 12 CREATE ROLE(USER) 54 (NOT USED) 96 DROP PACKAGE 13 CREATE SEQUENCE 55 (NOT USED) 97 (NOT USED) 14 ALTER SEQUENCE 56 (NOT USED) 98 (NOT USED) 15 (NOT USED) 57 (NOT USED) 99 DROP PACKAGE BODY 16 DROP SEQUENCE 58 (NOT USED) 157 (NOT USED) 17 CREATE SCHEMA 59 CREATE TRIGGER 158 DROP DIRECTORY 18 (NOT USED) 60 (NOT USED) 159 (NOT USED) 19 (NOT USED) 61 DROP TRIGGER 160 (NOT USED) 20 CREATE INDEX 62 ANALYZE TABLE 161 (NOT USED) 21 DROP INDEX 63 (NOT USED) 162 (NOT USED) 22 (NOT USED) 64 (NOT USED) 163 CREATE OPERATOR 23 (NOT USED) 65 (NOT USED) 164 (NOT USED) 24 (NOT USED) 66 (NOT USED) 165 (NOT USED) 25 (NOT USED) 67 (NOT USED) 166 (NOT USED) 26 (NOT USED) 68 DROP PROCEDURE 167 DROP OPERATOR 27 EXPLAIN 69 (NOT USED) 168 (NOT USED) 28 GRANT 70 (NOT USED) 169 (NOT USED) 29 (NOT USED) 71 (NOT USED) 170 CALL METHOD 30 CREATE SYNONYM 72 (NOT USED) 171 (NOT USED) 31 DROP SYNONYM 73 (NOT USED) 172 (NOT USED) 32 (NOT USED) 74 (NOT USED) 173 (NOT USED) 33 SET TRANSACTION 75 (NOT USED) 174 (NOT USED) 34 PL/SQL EXECUTE 76 (NOT USED) 175 (NOT USED) 见续表 117 第 13 章 DBMS_SQL 表 13.3.2 – 续表 SQL SQL 语句 代码 SQL SQL 语句 代码 SQL SQL 语句 代码 35 LOCK 77 CREATE TYPE 176 (NOT USED) 36 (NOT USED) 78 DROP TYPE 177 (NOT USED) 37 RENAME 79 (NOT USED) 178 (NOT USED) 38 COMMENT 80 (NOT USED) 179 (NOT USED) 39 (NOT USED) 81 (NOT USED) 180 (NOT USED) 40 (NOT USED) 82 (NOT USED) 181 (NOT USED) 41 (NOT USED) 83 DROP TYPE BODY 182 (NOT USED) 42 (NOT USED) 84 (NOT USED) 183 ALTER OPERATOR 示例 LAST_SQL_FUNCTION_CODE 函数在不同情况下调用,获取值可能不同,示例如下: \set SQLTERM / CREATE TABLE IF NOT EXISTS dbmssql_table1 (i INT, j TEXT); / \set SQLTERM / DECLARE sql_code INT; c INT; vc INT; BEGIN c := DBMS_SQL.OPEN_CURSOR; sql_code := DBMS_SQL.LAST_SQL_FUNCTION_CODE(); RAISE NOTICE '%',sql_code; DBMS_SQL.PARSE(c, 'INSERT INTO dbmssql_table1 VALUES (1,''xxx'')', DBMS_SQL.NATIVE); vc := DBMS_SQL.EXECUTE(c); sql_code := DBMS_SQL.LAST_SQL_FUNCTION_CODE(); RAISE NOTICE '%',sql_code; sql_code := DBMS_SQL.LAST_SQL_FUNCTION_CODE(); RAISE NOTICE '%',sql_code; DBMS_SQL.CLOSE_CURSOR(c); END; / \set SQLTERM ; 118 第 13 章 DBMS_SQL ---------------------------NOTICE: 0 NOTICE: 3 NOTICE: 3 ANONYMOUS BLOCK set serverout on \set SQLTERM / DECLARE sql_code INT; c INT; vc INT; BEGIN sql_code := DBMS_SQL.LAST_SQL_FUNCTION_CODE(); RAISE NOTICE '%',sql_code; c := DBMS_SQL.OPEN_CURSOR; sql_code := DBMS_SQL.LAST_SQL_FUNCTION_CODE(); RAISE NOTICE '%',sql_code; DBMS_SQL.PARSE(c, 'INSERT INTO t1 VALUES (1,''xx'')', DBMS_SQL.NATIVE); vc := DBMS_SQL.EXECUTE(c); sql_code := DBMS_SQL.LAST_SQL_FUNCTION_CODE(); RAISE NOTICE '%',sql_code; sql_code := DBMS_SQL.LAST_SQL_FUNCTION_CODE(); DBMS_OUTPUT.PUT_LINE(sql_code); RAISE NOTICE '%',sql_code; END; / \set SQLTERM ; ---------------------------NOTICE: 3 NOTICE: 0 NOTICE: 3 NOTICE: 3 ANONYMOUS BLOCK 13.4 其他示例 在一个匿名块分别对 create 语句、truncate 语句,以及 select 语句做动态 sql 操作,示例如下: set serverout on \set SQLTERM / DECLARE cnt INTEGER; 119 第 13 章 DBMS_SQL count INTEGER := 0; descs DBMS_SQL.DESC_TAB; hander INTEGER; res INT; result_name TEXT; my_id INT := 10; my_name TEXT := 'hello world'; my_TEXT TEXT; BEGIN hander := DBMS_SQL.OPEN_CURSOR(); DBMS_SQL.PARSE(hander,'CREATE TABLE IF NOT EXISTS test_tmp(id INT,sname TEXT)',DBMS_SQL.NATIVE); count=DBMS_SQL.EXECUTE(hander); DBMS_OUTPUT.PUT_LINE( 'count:'||count); DBMS_SQL.PARSE(hander,'truncate table test_tmp',DBMS_SQL.NATIVE); count=DBMS_SQL.EXECUTE(hander); DBMS_OUTPUT.PUT_LINE( 'count:'||count); DBMS_SQL.PARSE(hander, 'SELECT * FROM test_tmp', DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN(hander, 1, res); DBMS_SQL.DEFINE_COLUMN(hander, 2, result_name); count = DBMS_SQL.EXECUTE_AND_FETCH(hander); IF count > 0 then DBMS_SQL.COLUMN_VALUE(hander, 1, res); DBMS_SQL.COLUMN_VALUE(hander, 2, result_name); DBMS_OUTPUT.PUT_LINE( DBMS_SQL.LAST_ROW_COUNT); DBMS_SQL.DESCRIBE_COLUMNS(hander, cnt, descs); DBMS_OUTPUT.PUT_LINE( 'DESCRIBE_COLUMNS: ' || DBMS_SQL.LAST_ROW_COUNT); END IF; WHILE DBMS_SQL.FETCH_ROWS(hander) > 0 LOOP DBMS_SQL.COLUMN_VALUE(hander, 1, res); DBMS_SQL.COLUMN_VALUE(hander, 2, result_name); DBMS_OUTPUT.PUT_LINE(DBMS_SQL.LAST_ROW_COUNT); END LOOP; DBMS_SQL.CLOSE_CURSOR(hander); END; / -----------------------------ANONYMOUS BLOCK count:0 120 第 13 章 DBMS_SQL count:0 121 第 14 章 DBMS_UTILITY 14章 DBMS_UTILITY 第 DBMS_UTILITY 系统包提供一些具有通用功能的子程序,如查看错误堆栈、查看时间等。 14.1 DBMS_UTILITY 使用说明 使用 DBMS_UTILITY 系统包依赖 dbms_utility 插件,插件为初始化数据库实例时默认创建。 更多 dbms_utility 插件信息参考《KingbaseES 插件参考手册》中的 dbms_utility 章节。 14.2 DBMS_UTILITY 系统包子程序 表DBMS_UTILITY 子程序 列出了系统包 DBMS_UTILITY 所提供的子程序。 表 14.2.1: DBMS_UTILITY 子程序 子程序名称 说明 FORMAT_CALL_STACK 函数 返回当前的调用堆栈 FORMAT_ERROR_BACKTRACE 函数 返回当前的错误回溯信息 FORMAT_ERROR_STACK 函数 返回当前的错误堆栈 GET_TIME 函数 返回一个时间戳 GET_HASH_VALUE 函数 返回指定字符串的散列值 122 第 14 章 DBMS_UTILITY 14.2.1 FORMAT_CALL_STACK 函数 FORMAT_CALL_STACK 函数可以返回当前的调用堆栈信息,包括调用对象的地址,调用的行号和调用对象 的名称,它可以用在函数、存储过程或者触发器等 PL/SQL 对象中,用于帮助调试 PL/SQL 程序。 语法 DBMS_UTILITY.FORMAT_CALL_STACK() RETURN TEXT; DBMS_UTILITY.FORMAT_CALL_STACK(FORMAT TEXT) RETURN TEXT; 注意: 目前调用对象的地址为函数或过程的 oid 值,如果是内建函数或过程则为对应包的 oid 值。 使用说明 FORMAT: 指定调用堆栈信息的显示模式,分别有’o’, ’p’, ’s’ 三种模式。默认使用模式为’p’ 模式,输出 8 位有效 长度的十进制数输出对象地址信息。 • 其中’o’ 参数将按照’%8x%8d%s’ 格式打印对象地址,调用行号,对象名称,如 示例 2 所示。 • 其中’p’ 参数将按照’%8d%8d%s’ 格式打印对象地址,调用行号,对象名称,如 示例 3 所示。 • 其中’s’ 参数将按照’%d,%d,%s’ 格式打印对象地址,调用行号,对象名称,如 示例 4 所示。 示例 1 示例 1 调用无参数的 format_call_stack 子程序,示例如下: \set SQLTERM / CREATE OR REPLACE FUNCTION checkCallStack() RETURNS TEXT AS stack TEXT; BEGIN SELECT dbms_utility.format_call_stack() INTO stack ; RETURN stack; END; / \set SQLTERM ; CALL checkCallStack(); checkcallstack ------------------------------------------------------------------------ PL/SQL Call Stack ----- + object line object + handle number name + 14575 30 package body sys.dbms_utility.format_call_stack+ 16387 4 function public.checkcallstack (1 row) 123 第 14 章 DBMS_UTILITY 示例 2 示例 2 调用传入’o’ 参数的 format_call_stack 子程序,示例如下: \set SQLTERM / CREATE OR REPLACE FUNCTION checkHexCallStack() RETURNS TEXT AS stack TEXT; BEGIN SELECT dbms_utility.format_call_stack('o') INTO stack ; RETURN stack; END; / \set SQLTERM ; CALL checkHexCallStack(); checkhexcallstack ------------------------------------------------------------------------ PL/SQL Call Stack ----- + object line object + handle number name + 38ef 22 package body sys.dbms_utility.format_call_stack+ 4004 4 function public.checkhexcallstack (1 row) 示例 3 示例 3 调用传入’p’ 参数的 format_call_stack 子程序,示例如下: \set SQLTERM / CREATE OR REPLACE FUNCTION checkIntCallStack() RETURNS TEXT AS stack TEXT; BEGIN SELECT dbms_utility.format_call_stack('p') INTO stack ; RETURN stack; END; / \set SQLTERM ; CALL checkIntCallStack(); checkintcallstack -------------------------------------------------------------------+ 14575 22 package body sys.dbms_utility.format_call_stack+ 16389 4 function public.checkintcallstack (1 row) 124 第 14 章 DBMS_UTILITY 示例 4 示例 4 调用传入’s’ 参数的 format_call_stack 子程序,示例如下: \set SQLTERM / CREATE OR REPLACE FUNCTION checkIntUnpaddedCallStack() RETURNS TEXT AS stack TEXT; BEGIN SELECT dbms_utility.format_call_stack('s') INTO stack ; RETURN stack; END; / \set SQLTERM ; CALL checkIntUnpaddedCallStack(); checkintunpaddedcallstack -------------------------------------------+ 14575,22,sys.dbms_utility.format_call_stack+ 16390,4,public.checkintunpaddedcallstack (1 row) 14.2.2 FORMAT_ERROR_BACKTRACE 函数 该函数用于返回当前程序发生异常时的错误回溯堆栈,若程序未发生异常,则返回 NULL。 语法 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() RETURN TEXT; 示例 format_error_backtrace 函数在异常时使用,示例如下: set serverout on \set SQLTERM / CREATE OR REPLACE PROCEDURE p01() AS i INT := 0; BEGIN i = i/0; END; / \set SQLTERM ; \set SQLTERM / 125 第 14 章 DBMS_UTILITY CREATE OR REPLACE PROCEDURE p02() AS detail TEXT; stack TEXT; BEGIN p01(); EXCEPTION WHEN DIVISION_BY_ZERO THEN detail = DBMS_UTILITY.FORMAT_ERROR_STACK(); stack = DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); DBMS_OUTPUT.PUT_LINE('FORMAT_ERROR_STACK IS:'); DBMS_OUTPUT.PUT_LINE(detail); DBMS_OUTPUT.PUT_LINE('FORMAT_ERROR_BACKTRACE IS:'); DBMS_OUTPUT.PUT_LINE(stack); END; / \set SQLTERM ; CALL p02(); FORMAT_ERROR_STACK IS: division by zero at "public.p01", line 4 FORMAT_ERROR_BACKTRACE IS: at "public.p01", line 4 at "public.p02", line 5 14.2.3 FORMAT_ERROR_STACK 函数 FORMAT_ERROR_STACK 函数用于返回当前程序发生异常时的错误堆栈,若程序未发生异常,则返回 NULL。 语法 DBMS_UTILITY.FORMAT_ERROR_STACK() RETURN TEXT; 示例 参见FORMAT_ERROR_BACKTRACE 函数 。 14.2.4 GET_TIME 函数 GET_TIME 函数用于返回一个时间戳,该时间戳不是标准的系统时间戳,单位为厘秒(百分之一秒)。通常在 PL/SQL 程序开始和结束时各调用一次该函数,然后用后一个数字减去前一个数字,以确定当前程序的执行耗时。 126 第 14 章 DBMS_UTILITY 语法 DBMS_UTILITY.GET_TIME() RETURN NUMBER; 使用说明 函数的返回值在 -2147483648 到 2147483647 之间,具体数值取决于机器和系统。调用该函数时,应用程序需要 考虑到返回值的符号。例如,两次调用皆为负数,或者第一次调用为负数,第二次调用为正数等情况。 示例 get_time 函数可用于计算语句运行时间,示例如下: \set SQLTERM / CREATE OR REPLACE PROCEDURE TestGetTime() AS t1 PLS_INTEGER; t2 PLS_INTEGER; BEGIN t1 := DBMS_UTILITY.GET_TIME(); perform sys_sleep(3); t2 := DBMS_UTILITY.GET_TIME(); RAISE NOTICE 'sleeped: % sec.', (t2 - t1) / 100; END; / \set SQLTERM ; call TestGetTime(); NOTICE: sleeped: 3 sec. 14.2.5 GET_HASH_VALUE 函数 GET_HASH_VALUE 函数对于指定的字符串,返回范围在 [base, base+hase_size-1] 的散列值。 语法 DBMS_UTILITY.GET_HASH_VALUE( name VARCHAR2, base NUMBER, hash_size NUMBER )RETURN NUMBER; 参数说明 name 指定的要被 HASH 的字符串。 127 第 14 章 DBMS_UTILITY base 返回的 HASH 值的基准值,即返回值的最小值。 hash_size 指定的 HASH 表的大小。 返回值 基于输入字符串的哈希值。 异常说明 • base 参数为 null,则报错”bad argument”。 • hash_size 参数为 null,则报错”bad argument”。 • hash_size 为 0 时,则报错”bad argument”。 使用说明 • base 可为负值。 • 返回 hash 值的最小值为 base;返回 hash 值的最大值 bash+hash_size-1。例如,若要获取哈希值介于 1000 和 3047 之间的字符串的哈希值,请使用 1000 作为基值,使用 2048 作为 HASH 表大小。 • name 为 null 或空字符串,若其他参数正常,则返回 base 值。 • 若 hash_size 为负值则返回的哈希值不在哈希范围内,哈希值可能为正,也可能为负。 示例 SELECT DBMS_UTILITY.GET_HASH_VALUE('hello world',1,100) FROM DUAL; get_hash_value ---------------61 (1 row) 128 第 15 章 DBMS_SQL_MONITOR 15章 DBMS_SQL_MONITOR 第 DBMS_SQL_MONITOR 提供 SQL 监控的相关功能,包括产生报告,清理视图数据。 15.1 DBMS_SQL_MONITOR 使用说明 使用 DBMS_SQL_MONITOR 依赖 sys_sqltune 插件,插件需要在配置文件中添加到 shared_preload_libraries 中,并在数据库中手动创建 sys_sqltune 扩展后才可以使用。 将他添加到 kingbase.conf 文件的 shared_preload_libraries 中,重启数据库时自动加载。 示例如下 shared_preload_libraries = 'sys_sqltune' 并在数据库中创建插件 CREATE EXTENSION sys_sqltune; 使用 SQL 监控的全部功能,建议在 kingbase.conf 里添加以下参数 shared_preload_libraries = 'plsql, sys_stat_statements, sys_sqltune' sql_monitor.track = 'all' sys_stat_statements.track = 'all' enable_hint = on 更多 sys_sqltune 插件信息参考《KingbaseES 插件参考手册》中的 sys_sqltune 章节。 15.2 DBMS_SQL_MONITOR 子程序 表DBMS_SQL_MONITOR 子程序 列出了 DBMS_SQL_MONITOR 所提供的子程序。 129 第 15 章 DBMS_SQL_MONITOR 表 15.2.1: DBMS_SQL_MONITOR 子程序 子程序名称 说明 SQL_MONITOR_RESET 函数 清空视图数据 REPORT_SQL_MONITOR 函数 返回监控详细报告 REPORT_SQL_MONITOR_LIST 函数 返回监控列表报告 REPORT_SQL_MONITOR_TO_FILE 函数 将监控详细报告写入磁盘指定路径 REPORT_SQL_MONITOR_LIST_TO_FILE 函数 将监控列表报告写入磁盘指定路径 15.2.1 SQL_MONITOR_RESET 函数 SQL_MONITOR_RESET 函数用于清空 v$sql_monitor 和 v$sql_plan_monitor 视图中的所有数据。 语法 DBMS_SQL_MONITOR.SQL_MONITOR_RESET() RETURN BOOLEAN; 使用说明 使用后清空全部数据。 示例 调用无参数的 SQL_MONITOR_RESET 程序,示例如下: set sql_monitor.track = 'all'; select * from sys_sleep(5); select count(*) from v$sql_monitor; count ------1 (1 row) select count(*) from v$sql_plan_monitor; count ------1 (1 row) SELECT DBMS_SQL_MONITOR.SQL_MONITOR_RESET(); sql_monitor_reset 130 第 15 章 DBMS_SQL_MONITOR ------------------t (1 row) select count(*) from v$sql_monitor; count ------0 (1 row) select count(*) from v$sql_plan_monitor; count ------0 (1 row) 15.2.2 REPORT_SQL_MONITOR 函数 该函数用于生成监控详细报告,可用参数指定报告类型和生成报告的数据。使用默认值时,根据视图中最后更新 的数据生成在线 TEXT 报告。SQL 监控报告文本, 报告的内容包括 5 部分: 1. SQL 语句 2. SQL 语句执行的基本信息 3. SQL 总体执行情况统计 4. SQL 并行执行情况统计 5. SQL 执行计划节点统计 语法 DBMS_SQL_MONITOR.REPORT_SQL_MONITOR ( sql_exec_id IN BIGINT session_id IN TEXT sql_id DEFAULT NULL, IN BIGINT sql_exec_start IN TYPE DEFAULT NULL, IN TIMESTAMPTZ last_refresh_time type DEFAULT NULL, IN BIGINT query_id DEFAULT NULL, DEFAULT NULL, IN TIMESTAMPTZ DEFAULT NULL, DEFAULT 'TEXT) RETURN TEXT; 参数说明 sql_exec_id 131 第 15 章 DBMS_SQL_MONITOR 指定 SQL 执行 ID。 session_id 指定会话 ID。 sql_id 指定 SQL_ID, 由 SQL 语句标准化获得。 query_id 指定查询 ID,来源为 sys_stat_statements 插件。 sql_exec_start 指定报告的执行开始时间。 last_refresh_time 指定报告的执行最后数据更新时间。 type 指定报告生成类型,包括 TEXT 类型和 HTML 类型,默认生成 TEXT 类型报告。 返回值 监控详细报告。 异常说明 • 根据输入参数未匹配到数据,则报错 • type 报告类型不合法,则报错 使用说明 当有多条数据符合输入参数时,选择最后更新的数据生成报告。 示例 可通过 REPORT_SQL_MONITOR 函数生成监控详细报告,示例如下: set sql_monitor.track = 'all'; set enable_hint = on; CREATE TABLE smon_test(id bigint); INSERT INTO smon_test SELECT i FROM generate_series(1, 20000) i; SELECT count(*) FROM smon_test; SELECT * FROM sys_sleep(5); select exec_id, sql_id, query FROM v$sql_monitor; exec_id | sql_id | query ---------+----------------------+----------------------------------------------------------64771 | -7195113866045537130 | SELECT count(*) FROM smon_test; 132 第 15 章 DBMS_SQL_MONITOR 64771 | -7195113866045537130 | SELECT count(*) FROM smon_test; 64772 | 4175071384139695159 | SELECT * FROM sys_sleep(5); (3 rows) SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR(); SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR(sql_id=>-7195113866045537130); SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR(type=>'HTML'); 15.2.3 REPORT_SQL_MONITOR_LIST 函数 该函数用于生成监控列表报告,可用参数指定报告类型和生成报告的数据。使用默认值时,根据视图中全部数据 生成在线 TEXT 报告。 语法 DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_LIST( session_id sql_id DEFAULT NULL, IN BIGINT query_id type IN TEXT IN BIGINT DEFAULT NULL, IN TEXT DEFAULT NULL, DEFAULT 'TEXT') RETURN TEXT; 参数说明 session_id 指定会话 ID。 sql_id 指定 SQL_ID, 由 SQL 语句标准化获得。 query_id 指定查询 ID,来源为 sys_stat_statements 。 type 指定报告生成类型,包括 TEXT 类型和 HTML 类型,默认生成 TEXT 类型报告。 返回值 监控列表报告。 异常说明 • 根据输入参数未匹配到数据,则报错 • type 报告类型不合法,则报错 133 第 15 章 DBMS_SQL_MONITOR 使用说明 可通过 GUC 参数 sql_monitor.language 切换网页版报告的语言类型,默认为中文,具体请参考 sys_sqltune 插 件。 示例 可通过 REPORT_SQL_MONITOR_LIST 函数生成监控列表报告,示例如下: set sql_monitor.track = 'all'; set enable_hint = on; CREATE TABLE smon_test(id bigint); INSERT INTO smon_test SELECT i FROM generate_series(1, 20000) i; SELECT count(*) FROM smon_test; SELECT * FROM sys_sleep(5); SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_LIST(); select exec_id, sql_id, query FROM v$sql_monitor; exec_id | sql_id | query ---------+----------------------+----------------------------------------------------------64771 | -7195113866045537130 | SELECT count(*) FROM smon_test; 64771 | -7195113866045537130 | SELECT count(*) FROM smon_test; 64772 | 4175071384139695159 | SELECT * FROM sys_sleep(5); (3 rows) SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_LIST(sql_id=>-7195113866045537130); SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_LIST(type=>'HTML'); 15.2.4 REPORT_SQL_MONITOR_TO_FILE 函数 函 数 用 于 生 成 监 控 详 细 报 告, 报 告 生 成 参 REPORT_SQL_MONITOR_TO_FILE 照REPORT_SQL_MONITOR 函数 ,并将报告插入到磁盘指定位置。 语法 DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_TO_FILE( file_path IN TEXT, sql_exec_id IN BIGINT DEFAULT NULL, session_id IN TEXT DEFAULT NULL, sql_id IN BIGINT query_id IN BIGINT sql_exec_start IN TEXT DEFAULT IN TIMESTAMPTZ last_refresh_time type DEFAULT NULL, NULL, DEFAULT IN TIMESTAMPTZ NULL, DEFAULT NULL, DEFAULT 'TEXT) 134 第 15 章 DBMS_SQL_MONITOR RETURN TEXT; 参数说明 file_path 指定磁盘路径,可输入相对路径与绝对路径,相对路径由数据目录开始。 异常说明 • file_path 磁盘路径存在或权限不足报错。 示例 参见REPORT_SQL_MONITOR 函数 。 set sql_monitor.track = 'all'; set enable_hint = on; CREATE TABLE smon_test(id bigint); INSERT INTO smon_test SELECT i FROM generate_series(1, 20000) i; SELECT count(*) FROM smon_test; SELECT * FROM sys_sleep(5); SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_TO_FILE(file_path=>'sql_monitor.txt',type=>'TEXT'); SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_TO_FILE(file_path=>'sql_monitor.html',type=>'HTML'); 15.2.5 REPORT_SQL_MONITOR_LIST_TO_FILE 函数 REPORT_SQL_MONITOR_LIST_TO_FILE 函 数 用 于 生 成 监 控 列 表 报 告, 报 告 生 成 参 照REPORT_SQL_MONITOR_LIST 函数 ,并将报告插入到磁盘指定位置。 语法 DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_LIST_TO_FILE( file_path IN TEXT, session_id IN TEXT sql_id IN BIGINT query_id type DEFAULT NULL, DEFAULT NULL, IN BIGINT DEFAULT NULL, IN TEXT DEFAULT 'TEXT') RETURN TEXT; 参数说明 file_path 指定磁盘路径,可输入相对路径与绝对路径,相对路径由数据目录开始。 135 第 15 章 DBMS_SQL_MONITOR 异常说明 • file_path 磁盘路径存在或权限不足报错。 示例 参见REPORT_SQL_MONITOR_LIST 函数 。 set sql_monitor.track = 'all'; set enable_hint = on; CREATE TABLE smon_test(id bigint); INSERT INTO smon_test SELECT i FROM generate_series(1, 20000) i; SELECT count(*) FROM smon_test; SELECT * FROM sys_sleep(5); SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_LIST_TO_FILE(file_path=>'sql_monitor_list.txt',type=>'TEXT'); SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR_LIST_TO_FILE(file_path=>'sql_monitor_list.html',type=>'HTML'); 136 第 16 章 OWA_UTIL 第 16章 OWA_UTIL OWA_UTIL 系统包提供调用 PL/SQL 代码单元的信息。 16.1 OWA_UTIL 使用说明 使用 OWA_UTIL 系统包依赖 owa_util 插件,owa_util 插件为初始化数据库实例时默认创建。更多 owa_util 插件信息参考《KingbaseES 插件参考手册》中的 owa_util 章节。 16.2 OWA_UTIL 子程序 表OWA_UTIL 子程序 列出了系统包 OWA_UTIL 所提供的子程序。 表 16.2.1: OWA_UTIL 子程序 子程序名称 说明 WHO_CALLED_ME 存储过程 返回过程调用者的信息 16.2.1 WHO_CALLED_ME 存储过程 WHO_CALLED_ME 存储过程返回有关调用它的 PL/SQL 代码单元的信息(以输出参数的形式)。 语法 OWA_UTIL.WHO_CALLED_ME( owner OUT VARCHAR2, name OUT VARCHAR2, lineno OUT NUMBER, caller_t OUT VARCHAR2); 137 第 16 章 OWA_UTIL 参数说明 owner 该程序单元的拥有者。 name 程序单元的名称。 lineno 程序单元中发出调用的行号。 caller_t 进行调用的程序单元的类型。可能有:匿名块、触发器、包体、类型体、过程和函数。过程和函数仅适用 于独立的过程和函数。 注意: • 如果调用程序单元是在包中子程序,那么 name 就是包名。 • 如果调用程序单元是独立的过程或函数,那么 name 就是过程或函数的名称。 • 如果调用程序单元是匿名块的一部分,那么 name 则为 NULL。 示例 将 who_called_me 子程序作为 proc1 过程的一部分,只要有 PL/SQL 程序单元调用 proc1,那么可以得到 proc1 的 owner、name、lineno 和 caller_t。若是匿名块调用 proc1, 那么 owner 和 name 则为 NULL。 \set SQLTERM / CREATE OR REPLACE PROCEDURE proc1(id NUMBER) AS owner_name VARCHAR2(100); caller_name VARCHAR2(100); line_number NUMBER; caller_type VARCHAR2(100); BEGIN OWA_UTIL.WHO_CALLED_ME(owner_name,caller_name,line_number,caller_type); DBMS_OUTPUT.PUT_LINE('[id]:' || id || ' ' || '[caller_type]:' || caller_type || ' || '[owner_name]:' || owner_name || ' ' ' || '[caller_name]:' || caller_name || ' ' || '[line_number]:' || line_number || ' ' ); end; / set serverout on BEGIN 138 第 16 章 OWA_UTIL proc1(1); END; / \set SQLTERM ; [id]:1 [caller_type]:ANONYMOUS BLOCK [owner_name]: [caller_name]: [line_number]:2 139 第 17 章 UTL_ENCODE 第 17章 UTL_ENCODE UTL_ENCODE 系统包提供对于 RAW 数据类型的编码转换操作。 17.1 UTL_ENCODE 使用说明 使用 UTL_ENCODE 系统包依赖 kdb_raw 插件,需要在 kdb_raw 插件加载之后才可以使用 UTL_ENCODE 系统包。创建 kdb_raw 扩展: CREATE EXTENSION kdb_raw; 更多 kdb_raw 插件信息参考《KingbaseES 插件参考手册》中的 kdb_raw 章节。 17.2 UTL_ENCODE 子程序 表UTL_ENCODE 子程序 列出了系统包 UTL_ENCODE 所提供的子程序。 表 17.2.1: UTL_ENCODE 子程序 子程序名称 说明 BASE64_DECODE 函数 读取基于 BASE64 编码的 RAW 并将其解码 BASE64_ENCODE 函数 将 RAW 的二进制形式编码成为 BASE64 的元素 QUOTED_PRINTABLE_DECODE 函数 把 QUOTED PRINTABLE 格式字节串解码为 RAW 字节串 QUOTED_PRINTABLE_ENCODE 函数 把 RAW 字节串编码成 QUOTED PRINTABLE 格式字节串 140 第 17 章 UTL_ENCODE 17.2.1 BASE64_DECODE 函数 BASE64_DECODE 函数读取基于 base64 编码的 raw 并将其解码为原始 raw 值并返回。 语法 UTL_ENCODE.BASE64_DECODE(r IN RAW) RETURN RAW; 参数说明 r 待解码的 raw 字节串。 示例 DROP FUNCTION IF EXISTS test0050(); \set SQLTERM / CREATE OR REPLACE FUNCTION test0050() RETURNS RAW AS DECLARE v1 RAW := '\x404142434445'; DECLARE v2 RAW; BEGIN v2 = UTL_ENCODE.BASE64_ENCODE(v1); v2 = UTL_ENCODE.BASE64_DECODE(v2); RETURN v2; END; / \set SQLTERM ; SELECT * FROM test0050(); test0050 ---------------404142434445 (1 行记录) 17.2.2 BASE64_ENCODE 函数 BASE64_ENCODE 函数将 RAW 的二进制形式编码成为 BASE 64 的元素并以 RAW 的形式返回,返回 RAW。 语法 UTL_ENCODE.BASE64_ENCODE(r IN RAW) RETURN RAW; 参数说明 r 141 第 17 章 UTL_ENCODE 待转换的 raw 字节串。 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0050() RETURNS RAW AS DECLARE v1 RAW := '\x404142434445'; DECLARE v2 RAW; BEGIN v2 = UTL_ENCODE.BASE64_ENCODE(v1); RETURN v2; END; / \set SQLTERM ; SELECT * FROM test0050(); test0050 -------------------5145464351305246 (1 行记录) 17.2.3 QUOTED_PRINTABLE_DECODE 函数 QUOTED_PRINTABLE_DECODE 函数把输入的 QUOTED PRINTABLE 格式字节串解码为原始的 RAW 字 节串。 语法 UTL_ENCODE.UOTED_PRINTABLE_DECODE(r IN RAW) RETURN RAW; 参数说明 r 待转换的 raw 字节串。 示例 SELECT UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.QUOTED_PRINTABLE_DECODE('6161613D304161')) FROM dual; cast_to_varchar2 -----------------aaa + a 142 第 17 章 UTL_ENCODE 17.2.4 QUOTED_PRINTABLE_ENCODE 函数 QUOTED_PRINTABLE_ENCODE 函数把输入的 RAW 字节串编码成 QUOTED PRINTABLE 格式字节串。 语法 UTL_ENCODE.QUOTED_PRINTABLE_ENCODE(r IN RAW) RETURN RAW; 参数说明 r 待转换的 raw 字节串。 示例 SELECT UTL_ENCODE.QUOTED_PRINTABLE_ENCODE('09') FROM dual; quoted_printable_encode ------------------------3D3039 143 第 18 章 UTL_HTTP 18章 UTL_HTTP 第 UTL_HTTP 系统包提供 KingbaseES 的 http 客户端,允许在数据库内检索网页。 18.1 UTL_HTTP 使用说明 使用 UTL_HTTP 系统包依赖 http 插件,需要创建 http 扩展后才可以使用 UTL_HTTP 系统包: CREATE EXTENSION http; 更多 http 插件信息参考《KingbaseES 插件参考手册》中的 http 章节。 注意: http 插件不支持在 Windows 平台使用。 18.2 UTL_HTTP 数据类型 18.2.1 REQ 类型 使用 REQ 类型表示 HTTP 请求。 语法 CREATE TYPE UTL_HTTP.REQ AS( url VARCHAR2(32767), method VARCHAR2(64), http_version VARCHAR2(64) headers http_header[]); 参数说明 url 144 第 18 章 UTL_HTTP http 请求的 URL。 method 对 URL 所标识的资源执行的方法,目前仅支持 GET。 http_version 兼容性参数,无意义。 headers 请求的信息。 18.2.2 RESP 类型 使用 RESP 类型表示 HTTP 响应。 语法 CREATE TYPE UTL_HTTP.RESP AS( status_code INTEGER , reason_phrase VARCHAR2(256), http_version VARCHAR2(64), content TEXT); 参数说明 status_code web 服务器返回的状态代码。 reason_phrase 兼容性参数,无意义。 http_version 兼容性参数,无意义。 content web 服务器返回的内容。 18.3 UTL_HTTP 子程序 表UTL_HTTP 子程序 列出了系统包 UTL_HTTP 所提供的子程序。 145 第 18 章 UTL_HTTP 表 18.3.1: UTL_HTTP 子程序 子程序名称 说明 BEGIN_REQUEST 函数 开始一个新的 HTTP 请求 SET_HEADER 存储过程 用于设置一个 HTTP 请求头 GET_RESPONSE 函数 用于读取 http 响应,目前仅支持 get 功能 READ_LINE 存储过程 以文本形式读取 HTTP 响应体,直到到达行尾,并在调用者提供的缓冲区返回输出 READ_TEXT 存储过程 以文本形式读取 HTTP 响应体,并在调用者提供的缓冲区返回输出 END_RESPONSE 存储过程 结束 http 响应 END_REQUEST 存储过程 结束 http 请求 18.3.1 BEGIN_REQUEST 函数 BEGIN_REQUEST 函数开始一个新的 HTTP 请求。 语法 UTL_HTTP.BEGIN_REQUEST ( url IN VARCHAR2, method IN VARCHAR2 DEFAULT 'GET', http_version IN VARCHAR2 DEFAULT NULL, request_context IN VARCHAR2 DEFAULT NULL, https_host IN VARCHAR2 DEFAULT NULL) RETURN UTL_HTTP.REQ 参数说明 url http 请求的 URL。 method 对 URL 所标识的资源执行的方法,目前仅支持 GET。 http_version 兼容性参数,无意义。 request_context 兼容性参数,无意义。 https_host 146 第 18 章 UTL_HTTP 兼容性参数,无意义。 返回值说明 返回 HTTP 请求。 示例 SELECT * FROM UTL_HTTP.BEGIN_REQUEST('http://192.168.4.33:2020/root/v9_test','POST','2020.2020','test' 'httpbin.org'); 18.3.2 SET_HEADER 存储过程 SET_HEADER 存储过程用于设置一个 HTTP 请求头。 语法 UTL_HTTP.SET_HEADER ( r IN OUT UTL_HTTP.REQ, name IN VARCHAR2, value IN VARCHAR2 参数说明 r http 的请求。 name http 请求头的名字。 value http 请求头的值。 示例 \set SQLTERM / DECLARE v1 UTL_HTTP.REQ; v2 VARCHAR2; v3 VARCHAR2; BEGIN v1 := ('http://192.168.4.33:2020/root/v9_test','GET','20202020'); v2 := 'dididdi'; v3 := '20202020'; CALL UTL_HTTP.SET_HEADER(v1,v2,v3); RAISE NOTICE 'v1%',v1; END; 147 第 18 章 UTL_HTTP / \set SQLTERM ; 18.3.3 GET_RESPONSE 函数 GET_RESPONSE 函数用于读取 http 响应,目前仅支持 get 功能。 语法 UTL_HTTP.GET_RESPONSE ( r IN UTL_HTTP.REQ, return_info_response IN BOOLEAN DEFAULT FALSE) RETURN UTL_HTTP.RESP 参数说明 r http 的请求。 return_info_response 兼容性参数,无意义。 返回值说明 返回 HTTP 响应。 示例 SELECT * FROM UTL_HTTP.GET_RESPONSE(('http://192.168.4.33:2020/root/v9_test','GET','20202020')); 18.3.4 READ_LINE 存储过程 READ_LINE 存储过程以文本形式读取 HTTP 响应体,直到到达行尾,并在调用者提供的缓冲区返回输出。如 果到达 HTTP 响应正文的末尾,将引发 NO_DATA_FOUND 异常。 语法 UTL_HTTP.READ_LINE( r IN OUT UTL_HTTP.RESP, data OUT VARCHAR2, remove_crlf IN BOOLEAN DEFAULT FALSE) 参数说明 r 148 第 18 章 UTL_HTTP http 的响应。 data http 的响应正文。 remove_crlf 兼容性参数,无意义。 示例 \set SQLTERM / DECLARE req UTL_HTTP.REQ; resp UTL_HTTP.RESP; value VARCHAR2; BEGIN req := UTL_HTTP.BEGIN_REQUEST('http://192.168.4.33:2020/root/v9_test'); UTL_HTTP.SET_HEADER(req, 'Content-Type', 'text/html; charset=utf-8'); resp := UTL_HTTP.GET_RESPONSE(req); UTL_HTTP.READ_LINE(resp,value,false); RAISE NOTICE 'value:%',value; --DBMS_OUTPUT.PUT_LINE(value); END; / \set SQLTERM ; 18.3.5 READ_TEXT 存储过程 READ_TEXT 存储过程以文本形式读取 HTTP 响应体,并在调用者提供的缓冲区返回输出。如果到达 HTTP 响应正文的末尾,将引发 NO_DATA_FOUND 异常。 语法 UTL_HTTP.READ_TEXT( r IN OUT UTL_HTTP.RESP, data OUT VARCHAR2, len IN INTEGER DEFAULT NULL) 参数说明 r http 的响应。 data 149 第 18 章 UTL_HTTP http 的响应正文。 len 要读取数据的最大字符数。 注意: 如果 len 为 NULL, 这个过程将读取尽可能多的输入来填充数据中分配的字符串。 18.3.6 END_RESPONSE 存储过程 END_RESPONSE 存储过程结束 http 响应。 语法 UTL_HTTP.END_RESPONSE ( r IN OUT UTL_HTTP.RESP) 参数说明 r http 的响应。 示例 \set SQLTERM / CREATE OR REPLACE PROCEDURE UTL_HTTP.END_RESPONSE ( r IN OUT UTL_HTTP.resp) AS BEGIN r.content = NULL; END; \set SQLTERM / DECLARE v1 UTL_HTTP.RESP; BEGIN v1 := (202,'http://192.168.4.33:2020/root/v9_test',('asd','asd'),'text_test'); CALL UTL_HTTP.END_RESPONSE(v1); RAISE NOTICE 'v1%',v1; END; / \set SQLTERM ; 18.3.7 END_REQUEST 存储过程 功能描述 150 第 18 章 UTL_HTTP END_REQUEST 存储过程结束 http 请求。 语法 UTL_HTTP.END_REQUEST ( r IN OUT UTL_HTTP.REQ) 参数说明 r http 的请求。 示例 \set SQLTERM / SET SERVEROUTPUT ON CREATE OR REPLACE PROCEDURE pr1_http IS req UTL_HTTP.REQ; resp UTL_HTTP.RESP; v_message xmlstr VARCHAR2(10000); VARCHAR2(30000); BEGIN req := UTL_HTTP.BEGIN_REQUEST('http://192.168.4.33:2020/root/v9_test'); UTL_HTTP.SET_HEADER(req, 'Content-Type', 'text/html; charset=utf-8'); UTL_HTTP.SET_HEADER(req, 'Content-Length',lengthb(xmlstr)); resp := UTL_HTTP.GET_RESPONSE(req); LOOP UTL_HTTP.READ_LINE(resp,v_message, TRUE); DBMS_OUTPUT.PUT_LINE(v_message); END LOOP; UTL_HTTP.END_REQUEST(req); UTL_HTTP.END_RESPONSE(resp); EXCEPTION WHEN OTHERS THEN UTL_HTTP.END_RESPONSE(resp); UTL_HTTP.END_REQUEST(req); END pr1_http; / \set SQLTERM ; CALL pr1_http(); 151 第 19 章 UTL_I18N 19章 UTL_I18N 第 UTL_I18N 系统包提供对于 RAW 数据类型的编码转换操作。 19.1 UTL_I18N 使用说明 使用 UTL_I18N 系统包依赖 kdb_raw 插件,需要在 kdb_raw 插件加载之后才可以使用 UTL_I18N 系统包。 创建 kdb_raw 扩展: CREATE EXTENSION kdb_raw; 更多 kdb_raw 插件信息参考《KingbaseES 插件参考手册》中的 kdb_raw 章节。 19.2 UTL_I18N 子程序 表UTL_I18N 子程序 列出了系统包 UTL_I18N 所提供的子程序。 表 19.2.1: UTL_I18N 子程序 子程序名称 说明 RAW_TO_CHAR 函数 把 raw 数据按指定字符集转换成字符串 STRING_TO_RAW 函数 把某个字符集下的字符串转换成指定字符集后的字节序列 19.2.1 RAW_TO_CHAR 函数 RAW_TO_CHAR 函数将 raw 数据按指定字符集转换成字符串。 语法 152 第 19 章 UTL_I18N UTL_I18N.RAW_TO_CHAR ( data IN RAW, src_charset IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2; 参数说明 data 待转换的 raw 字节串。 src_charset 指定字符集名称。 使用说明 1. 如果 data 为 NULL 或长度为 0,或 src_charset 为非法字符集名称,返回 NULL。 2. 如果 src_charset 为 NULL,则取当前数据库字符集。 示例 SELECT UTL_I18N.RAW_TO_CHAR('D6D0B9FA', 'ZHS16GBK') FROM dual; raw_to_char ------------中国 19.2.2 STRING_TO_RAW 函数 STRING_TO_RAW 函数将把某个字符集下的字符串转换成指定字符集后的字节序列,返回 RAW。 语法 UTL_I18N.STRING_TO_RAW ( data IN VARCHAR2 CHARACTER SET ANY_CS, dst_charset IN VARCHAR2 DEFAULT NULL) RETURN RAW; 参数说明 data 字符类型数据。 dst_charset 指定字符集名称。 使用说明 153 第 19 章 UTL_I18N 1. 如果 data 为 NULL 或长度为 0,或 dst_charset 为非法字符集名称,返回 NULL; 2. 如果 dst_charset 为 NULL,则取当前数据库字符集。 示例 SELECT UTL_I18N.STRING_TO_RAW('中国', 'ZHS16GBK') FROM dual; string_to_raw --------------D6D0B9FA 154 第 20 章 UTL_RAW 20章 UTL_RAW 第 UTL_RAW 系统包提供定义了一套对于 RAW 数据类型的操作。 20.1 UTL_RAW 使用说明 使用 UTL_RAW 系统包依赖 kdb_raw 插件,需要在 kdb_raw 插件加载之后才可以使用 UTL_RAW 系统包。 创建 kdb_raw 扩展: CREATE EXTENSION kdb_raw; 更多 kdb_raw 插件信息参考《KingbaseES 插件参考手册》中的 kdb_raw 章节。 20.2 UTL_RAW 子程序 表UTL_RAW 子程序 列出了系统包 UTL_RAW 所提供的子程序。 表 20.2.1: UTL_RAW 子程序 子程序名称 说明 BIT_AND 函数 按位做与运算 BIT_COMPLEMENT 函数 按位做补运算 BIT_OR 函数 按位做或运算 BIT_XOR 函数 按位做异或运算 CAST_FROM_BINARY_DOUBLE 函数 将 DOUBLE 类型数字转换成 RAW 类型 见续表 155 第 20 章 UTL_RAW 表 20.2.1 – 续表 子程序名称 说明 CAST_FROM_BINARY_FLOAT 函数 将 FLOAT 类型数字转换成 RAW 类型 CAST_FROM_BINARY_INTEGER 函数 将 INTEGER 类型转换成 RAW 类型 CAST_FROM_NUMBER 函数 将 NUMBER 类型数字转换成 RAW 类型 CAST_TO_BINARY_DOUBLE 函数 将 RAW 字节串为对应表示的 DOUBLE 值 CAST_TO_BINARY_FLOAT 函数 将 RAW 字节串为对应表示的 FLOAT 值 CAST_TO_BINARY_INTEGER 函数 将 RAW 字节串为对应表示整数值 CAST_TO_NUMBER 函数 将 RAW 类型数字转换成 NUMBER 类型 CAST_TO_RAW 函数 将 VARCHAR2 类型转换为 RAW 类型 CAST_TO_VARCHAR2 函数 将 RAW 类型转换为 VARCHAR2 类型 COMPARE 函数 比较两个 RAW 值,返回第一个不相等的字节位置 CONCAT 函数 连接最多 12 个 RAW 类型 CONVER 函数 把源字符集下的字节数据转换为等价的目标字符集下的字节数据 COPIES 函数 返回 RAW 字符串拼接 n 次形成的 RAW 值 LENGTH 函数 获取 RAW 类型参数的字节值 OVERLAY 函数 使用指定的 raw 数据覆盖目标 raw 数据的部分内容,返回覆盖后的 raw 数据 REVERSE 函数 把输入 RAW 值的字节颠倒顺序后 SUBSTR 函数 截取输入 RAW 值中的子串 TRANSLATE 函数 把输入的 raw 数据中字节按映射规则替换 TRANSLITERATE 函数 把输入的 raw 数据中字节按映射规则替换 XRANGE 函数 截取指定的起始和结束 RAW 数据之间的连续字节 RAW 值 20.2.1 BIT_AND 函数 BIT_AND 函数按位做与运算,返回 RAW。 语法 156 第 20 章 UTL_RAW UTL_RAW.BIT_AND ( r1 IN RAW, r2 IN RAW ) RETURN RAW 参数说明 r1 RAW 类型,参与运算的第一个参数值。 r2 RAW 类型,参与运算的第二个参数值。 使用说明 1. 输入参数有一个为 NULL 则返回 NULL; 2. 长度较长的参数,和长度较短参数等长部分按位做与运算,超出部分直接附加前述计算结果后。 返回值 RAW 类型,按位与运算的结果。 示例 SELECT UTL_RAW.BIT_AND(HEXTORAW('0103'),HEXTORAW('02')) FROM DUAL; bit_and --------0003 20.2.2 BIT_COMPLEMENT 函数 BIT_COMPLEMENT 函数按位做补运算,返回 RAW。 语法 UTL_RAW.BIT_COMPLEMENT ( r IN RAW ) RETURN RAW 参数说明 r RAW 类型,参与运算的参数值。 使用说明 输入参数为 NULL 则返回 NULL。 返回值 157 第 20 章 UTL_RAW RAW 类型,按位做补运算的结果。 示例 SELECT UTL_RAW.BIT_COMPLEMENT(HEXTORAW('01')) FROM DUAL; bit_complement ---------------FE 20.2.3 BIT_OR 函数 BIT_OR 函数按位做或运算,返回 RAW。 语法 UTL_RAW.BIT_OR ( r1 IN RAW, r2 IN RAW ) RETURN RAW 参数说明 r1 RAW 类型,参与运算的第一个参数值。 r2 RAW 类型,参与运算的第二个参数值。 使用说明 1. 输入参数有一个为 NULL 则返回 NULL; 2. 长度较长的参数,和长度较短参数等长部分按位做或运算,超出部分直接附加前述计算结果后。 返回值 RAW 类型,按位做或运算的结果。 示例 SELECT UTL_RAW.BIT_OR(HEXTORAW('01'),HEXTORAW('0308')) FROM DUAL; bit_or -------0308 158 第 20 章 UTL_RAW 20.2.4 BIT_XOR 函数 BIT_XOR 函数按位做异或运算,返回 RAW。 语法 UTL_RAW.BIT_XOR ( r1 IN RAW, r2 IN RAW ) RETURN RAW 参数说明 r1 RAW 类型,参与运算的第一个参数值。 r2 RAW 类型,参与运算的第二个参数值。 使用说明 1. 输入参数有一个为 NULL 则返回 NULL; 2. 长度较长的参数,和长度较短参数等长部分按位做异或运算,超出部分直接附加前述计算结果后。 返回值 RAW 类型,按位异或运算的结果。 示例 SELECT UTL_RAW.BIT_XOR(HEXTORAW('01'),HEXTORAW('0304')) FROM DUAL; bit_xor --------0204 20.2.5 CAST_FROM_BINARY_DOUBLE 函数 CAST_FROM_BINARY_DOUBLE 函数将 DOUBLE 类型数字转换成 RAW 类型。 语法 UTL_RAW.CAST_FROM_BINARY_DOUBLE( n IN DOUBLE [ , endianess IN INTEGER ] ) RETURN RAW 参数说明 n DOUBLE 类型,待转换的 DOUBLE 类型。 159 第 20 章 UTL_RAW endianess INTEGER 类型,值表示类型:1 代表 BIG_ENDIAN,2 代表 LITTLE_ENDIAN,3 代表当前机器的 ENDIAN。缺省值为 1。非此 3 种值报错。 使用说明 1. 输入是 NULL 返回 NULL; 2. 返回值 8 字节,显示 16 位 16 进制字符。 返回值 RAW 类型,RAW 表示 IEEE 754 double-precision 编码格式。 示例 SELECT UTL_RAW.CAST_FROM_BINARY_DOUBLE(2.33) FROM DUAL; cast_from_binary_double ------------------------4002A3D70A3D70A4 20.2.6 CAST_FROM_BINARY_FLOAT 函数 CAST_FROM_BINARY_FLOAT 函数将 FLOAT 类型数字转换成 RAW 类型。 语法 UTL_RAW.CAST_FROM_BINARY_FLOAT( n IN FLOAT [ , endianess IN INTEGER ] ) RETURN RAW 参数说明 n FLOAT 类型,待转换的 FLOAT 类型。 endianess INTEGER 类型,值表示类型:1 代表 BIG_ENDIAN,2 代表 LITTLE_ENDIAN,3 代表当前机器的 ENDIAN。缺省值为 1。非此 3 种值报错。 使用说明 1. 输入是 NULL 返回 NULL; 2. 返回值 4 字节,显示 8 位 16 进制字符。 返回值 RAW 类型,RAW 表示 IEEE 754 single-precision 编码格式。 160 第 20 章 UTL_RAW 示例 SELECT UTL_RAW.CAST_FROM_BINARY_FLOAT(2.33) FROM DUAL; cast_from_binary_float ------------------------40151EB8 20.2.7 CAST_FROM_BINARY_INTEGER 函数 CAST_FROM_BINARY_INTEGER 函数将整数类型按内部字节表示转换成 RAW 类型。 语法 UTL_RAW.CAST_FROM_BINARY_INTEGER ( n IN INTEGER [, endianess IN INTEGER] ) RETURN RAW 参数说明 n INTEGER 类型,待转换的整数值。 endianess INTEGER 类型,值表示类型:1 代表 BIG_ENDIAN,2 代表 LITTLE_ENDIAN,3 代表当前机器的 ENDIAN。缺省值为 1。非此 3 种值报错。 使用说明 1. 输入是 NULL 返回 NULL; 2. 最小值-2147483648,小于最小值报错; 3. 最大值 2147483647,大于最大值报错; 4. 返回值 4 字节,显示 8 位 16 进制字符。 返回值 RAW 类型 示例 SELECT UTL_RAW.CAST_FROM_BINARY_INTEGER(100,1) FROM DUAL; cast_from_binary_integer -------------------------00000064 161 第 20 章 UTL_RAW 20.2.8 CAST_FROM_NUMBER 函数 CAST_FROM_NUMBER 函数将 NUMBER 类型数字转换成 RAW 类型。 语法 UTL_RAW.CAST_FROM_NUMBER( n IN NUMBER ) RETURN RAW 参数说明 n NUMBER 类型,待转换的 NUMBER 值。 使用说明 1. 输入是 NULL 返回 NULL; 2. 正数范围 1e-130 到 1e126,不包括 1e126,大于等于 1e126 报错,小于 1e-130 都返回 80; 3. 负数范围-1e126 到-1e-130,不包括-1e126,小于等于-1e126,大于-1e-130 都返回 80; 4. 返回值 1-22 字节,显示 2-44 位 16 进制字符。 返回值 RAW 类型 示例 SELECT UTL_RAW.CAST_FROM_NUMBER(2.33) FROM DUAL; cast_from_number ------------------------C10322 20.2.9 CAST_TO_BINARY_DOUBLE 函数 CAST_TO_BINARY_DOUBLE 函数将 RAW 字节串为对应表示的 DOUBLE 值。 语法 UTL_RAW.CAST_TO_BINARY_DOUBLE ( r IN RAW [, endianess IN INTEGER] ) RETURN DOUBLE 参数说明 r RAW 类型,待转换的 RAW 值。r 表示 IEEE 754 double-precision 编码格式。 162 第 20 章 UTL_RAW endianess INTEGER 类型,值表示类型:1 代表 BIG_ENDIAN,2 代表 LITTLE_ENDIAN,3 代表当前机器的 ENDIAN。缺省值为 1。非此 3 种值报错。 使用说明 1. 如果 RAW 超过 8 字节,只取前 8 个字节; 2. 如果 RAW 不足 8 个字节报错; 3. 如果结果是-0,则返回 +0;如果结果是 NaN,返回 NaN。 返回值 DOUBLE 类型 示例 SELECT UTL_RAW.CAST_TO_BINARY_DOUBLE(hextoraw('4002A3D70A3D70A4')) FROM DUAL; cast_to_binary_double -------------------------2.33 20.2.10 CAST_TO_BINARY_FLOAT 函数 CAST_TO_BINARY_FLOAT 函数将 RAW 字节串为对应表示的 FLOAT 值。 语法 UTL_RAW.CAST_TO_BINARY_FLOAT ( r IN RAW [, endianess IN INTEGER] ) RETURN FLOAT 参数说明 r RAW 类型,待转换的 RAW 值。r 表示 IEEE 754 single-precision 编码格式。 endianess INTEGER 类型,值表示类型:1 代表 BIG_ENDIAN,2 代表 LITTLE_ENDIAN,3 代表当前机器的 ENDIAN。缺省值为 1。非此 3 种值报错。 使用说明 1. 如果 RAW 超过 4 字节,只取前 4 个字节; 2. 如果 RAW 不足 4 个字节报错; 3. 如果结果是-0,则返回 +0;如果结果是 NaN,返回 NaN。 163 第 20 章 UTL_RAW 返回值 FLOAT 类型 示例 SELECT UTL_RAW.CAST_TO_BINARY_FLOAT(hextoraw('40151EB8')) FROM DUAL; cast_to_binary_float -------------------------2.33 20.2.11 CAST_TO_BINARY_INTEGER 函数 CAST_TO_BINARY_INTEGER 函数转换 RAW 值字节序列对应的整数。 语法 UTL_RAW.CAST_TO_BINARY_INTEGER ( n IN RAW [,endianess IN INTEGER] ) RETURN RAW 参数说明 n RAW 类型,待转换的 RAW 值 endianess INTEGER 类型,值表示类型:1 代表 BIG_ENDIAN,2 代表 LITTLE_ENDIAN,3 代表当前机器的 ENDIAN,缺省值 1。非此 3 种值报错。 使用说明 输入 RAW 超过 8 位 16 进制字符: 1. endianess=3,返回 0; 2. endian=1,2,如果 RAW 输出字符串长度是奇数,保留最高 1 位字符计算值,如果 RAW 输出字符串长度是偶 数,保留最高 2 位字符计算值。 返回值 RAW 类型 示例 SELECT UTL_RAW.CAST_TO_BINARY_INTEGER('6400',1) FROM DUAL; cast_to_binary_integer 164 第 20 章 UTL_RAW -----------------------25600 20.2.12 CAST_TO_NUMBER 函数 CAST_TO_NUMBER 函数将 RAW 类型数字转换成 NUMBER 类型。 语法 UTL_RAW.CAST_TO_BINARY_INTEGER ( r IN RAW [, endianess IN INTEGER] ) RETURN INTEGER 参数说明 r RAW 类型,待转换的 RAW 值。 使用说明 1. 输入是 NULL 返回 NULL; 2. 如果输入字节串不符合编码规则或不是数字,则报错。 返回值 INTEGER 类型 示例 SELECT UTL_RAW.CAST_TO_NUMBER(hextoraw('C10322')) FROM DUAL; cast_to_number -------------------------2.33 20.2.13 CAST_TO_RAW 函数 CAST_TO_RAW 函数将 VARCHAR2 类型转换为 RAW 类型,返回 RAW 类型。 语法 UTL_RAW.CAST_TO_VARCHAR2(v IN VARCHAR2) RETURN RAW; 参数说明 v 165 第 20 章 UTL_RAW VARCHAR2 类型,待转换的 VARCHAR2 值。 返回值 RAW 类型 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0040() RETURNS RAW AS DECLARE v1 VARCHAR2 := 'abcd'; DECLARE v3 RAW; BEGIN v3 = UTL_RAW.CAST_TO_RAW(v1); RETURN v3; END; / \set SQLTERM ; SELECT * FROM test0040(); test0040 -----------61626364 (1 row) \set SQLTERM / CREATE OR REPLACE FUNCTION test0040() RETURNS RAW AS DECLARE v1 VARCHAR2 := 'abcd'; DECLARE v3 RAW; BEGIN v3 = UTL_RAW.CAST_TO_RAW(v1); RETURN v3; END; / \set SQLTERM ; SELECT * FROM test0040(); test0040 -----------61626364 (1 行记录) 166 第 20 章 UTL_RAW 20.2.14 CAST_TO_VARCHAR2 函数 CAST_TO_VARCHAR2 函数将 RAW 类型转换为 VARCHAR2 类型,返回 VARCHAR2 类型。 语法 UTL_RAW.CAST_TO_VARCHAR2(r IN RAW) RETURN VARCHAR2; 参数说明 r RAW 类型,待转换的 RAW 值。 返回值 VARCHAR2 类型 示例 -- test UTL_RAW.CAST_TO_VARCHAR2(null) \set SQLTERM / CREATE OR REPLACE FUNCTION test0022() RETURNS BOOLEAN AS DECLARE v1 RAW ; DECLARE v3 VARCHAR2; BEGIN v3 = UTL_RAW.CAST_TO_VARCHAR2(v1); RETURN (v3 IS NULL); END; / \set SQLTERM ; SELECT * FROM test0022(); test0022 ---------t (1 行记录) 20.2.15 COMPARE 函数 COMPARE 函数比较两个 RAW 值,返回第一个不相等的字节位置。 语法 UTL_RAW.COMPARE ( r1 IN RAW, r2 IN RAW [, pad IN RAW] ) RETURN INTEGER 167 第 20 章 UTL_RAW 参数说明 r1 RAW 类型,待比较的第一个输入 RAW 值。 r2 RAW 类型,待比较的第二个输入 RAW 值。 pad RAW 类型,填充的字节,多个字节取第一个使用,默认为 00 。 使用说明 1. 两个输入 RAW 可以为 NULL 或长度 0; 2. 长度较短的输入 RAW 值拼接 pad 指定的第一个字节,默认为 00; 3. 如果两个输入 RAW 都为 NULL 或完全一样返回 0;否则返回第一个不相等字节的位置,从 1 开始计数。 返回值 integer 类型,第一个不相等的字节位置。 示例 SELECT UTL_RAW.COMPARE('ABCD', 'AB', 'CD') FROM DUAL; compare --------0 SELECT UTL_RAW.COMPARE(HEXTORAW('ABA'), HEXTORAW('ABC')) FROM DUAL; compare --------2 20.2.16 CONCAT 函数 CONCAT 函数连接最多 12 个 RAW 类型,并返回拼接后的结果。 语法 UTL_RAW.CONCAT ( r1 IN RAW [, r2 IN RAW] [, r3 IN RAW] [, r4 IN RAW] 168 第 20 章 UTL_RAW [, r5 IN RAW] [, r6 IN RAW] [, r7 IN RAW] [, r8 IN RAW] [, r9 IN RAW] [, r10 IN RAW] [, r11 IN RAW] [, r12 IN RAW] ) RETURN RAW 参数说明 r1-r12 RAW 类型,待拼接的输入 RAW 值。 使用说明 1. 输入 RAW 参数最多支持 12 个; 2. 结果长度超过 RAW 允许最大长度将报错。 返回值 RAW 类型,拼接后的结果值。 示例 SELECT UTL_RAW.CONCAT('AB','CD','EF',NULL,'1234') FROM DUAL; concat -----------ABCDEF1234 20.2.17 CONVER 函数 CONVER 函数把源字符集下的字节数据转换为等价的目标字符集下的字节数据。 语法 UTL_RAW.CONVERT(r IN RAW, to_charset IN VARCHAR2, from_charset IN VARCHAR2) RETURN RAW 参数说明 r RAW 类型。 to_charset 169 第 20 章 UTL_RAW 目标字符集名称。 from_charset 源字符集名称。 使用说明 把 from_set 字符集下 r 代表的字符串转换成 to_set 字符集下的字节串。如果转换后的字节串超出 raw 允许的 最大长度,则自动截取到最大长度。 1. 字符集名称以 kes 支持的为主,可使用 oracle 和 kes 支持的字符集名称,不区分大小写,不支持的字符集报 错; 2. 结果超过 raw 允许的最大长度自动截断到最大长度; 3. 支持的 oracle 字符集名称及映射的 kes 字符集名称如下: {"th8tisascii", "ascii"}, {"ja16euc", "eucjp"}, {"ja16euctilde", "eucjp"}, {"zht32euc", "euctw"},{"al32utf8", "utf8"}, {"we8iso8859p1", "latin1"}, {"ee8iso8859p2", "latin2"}, {"se8iso8859p3", "latin3"},{"nee8iso8859p4", "latin4"}, {"we8iso8859p9", "latin5"}, {"ne8iso8859p10", "latin6"}, {"blt8iso8859p13", "latin7"},{"cel8iso8859p14", "latin8"}, {"we8iso8859p15", "latin9"},{"ar8mswin1256", "win1256"}, {"vn8mswin1258", "win1258"},{"cl8mswin1251", "win1251"}, {"we8mswin1252", "win1252"},{"ee8mswin1250", "win1250"}, {"el8mswin1253", "win1253"},{"tr8mswin1254", "win1254"}, {"iw8mswin1255", "win1255"},{"blt8mswin1257", "win1257"}, {"cl8koi8u", "koi8u"}, {"cl8koi8r", "koi8r"},{"zhs16gbk", "gbk"}, {"ja16sjis", "shiftjis"},{"ja16sjistilde", "shiftjis"}, {"zht16mswin950", "big5"}, {"ko16mswin949", "uhc"}, {"ru8pc866", "win866"}, {"cl8iso8859p5", "iso88595"},{"ar8iso8859p6", "iso88596"}, {"el8iso8859p7", "iso88597"}, {"iw8iso8859p8", "iso88598"} 示例 select UTL_RAW.CONVERT(UTL_RAW.CAST_TO_RAW('中国'), 'ZHS16GBK', 'AL32UTF8') from dual; convert ---------D6D0B9FA 20.2.18 COPIES 函数 COPIES 函数返回 RAW 字符串拼接 n 次形成的 RAW 值。 语法 170 第 20 章 UTL_RAW UTL_RAW.COPIES(r IN RAW, n IN NUMBER) RETURN RAW 参数说明 r RAW 类型值。 n 拼接次数。 使用说明 1. n 取四舍五入后的整数值,次数 n 小于 1 报错; 2. 输入 r 为 NULL 或长度 0 报错,结果长度超出 raw 允许的最大长度报错。 示例 SELECT UTL_RAW.COPIES(HEXTORAW('01'),2) FROM DUAL; copies ----------0101 20.2.19 LENGTH 函数 LENGTH 函数获取 RAW 类型参数的字节值, 返回 INT4 类型。 语法 UTL_RAW.LENGTH(r IN RAW) RETURN INT4; 示例 \set SQLTERM / CREATE OR REPLACE FUNCTION test0030() RETURNS INT AS DECLARE v1 RAW := '68656C6C6FE4BABAE5A4A7E98791E4BB93'; DECLARE v2 INT; BEGIN V2 = UTL_RAW.LENGTH(v1); RETURN V2; END; / \set SQLTERM ; 171 第 20 章 UTL_RAW SELECT * FROM test0030(); test0030 ---------17 (1 行记录) 20.2.20 OVERLAY 函数 OVERLAY 函数使用指定的 raw 数据覆盖目标 raw 数据的部分内容,返回覆盖后的 raw 数据。 语法 UTL_RAW.OVERLAY(overlay_str IN RAW, target IN RAW, pos IN NUMBER, len IN NUMBER, pad IN RAW) RETURN RAW 参数说明 overlay_str 目标待覆盖的 RAW 值。 target 输入的 RAW 值。 pos 指定覆盖的起始位置,默认值为 1。 len 指定覆盖长度,长度小于 0 报错;长度为 null 则默认为 overlay_str 长度。 pad 填充的 RAW 值。如果 len 超过 overlay_str 的长度,或 pos 位置超出 target 的长度,超出部分填充的 raw 值,缺省为 NULL。 使用说明 把 target 值从 pos 位置起始长度为 len 的部分替换为 overlay_str 指定的 raw。 1. 如果 overlay_str 长度小于 len 则增补 pad 指定的第一个字节; 2. 如果 overlay_str 长度大于 len 超出部分忽略; 3. 如果起始位置超出指定 target 长度,则先用 pad 第一个字节补充,再拼接 overlay_str; 4. overlay_str 为 NULL 或长度为 0 报错; 5. target 未指定报错; 172 第 20 章 UTL_RAW 6. 结果超出 raw 允许的最大长度报错; 7. 起始位置小于 1 报错;为 null 则等价于 1; 8. 指定长度小于 0 报错;长度为 null 则为 overlay_str 长度; 9. pos 和 len 截取整数计算。 示例 SELECT UTL_RAW.OVERLAY(hextoraw('aaaaaaaa'),hextoraw('bbbbbbbb'),2,2) FROM dual; overlay -----------BBAAAABB 20.2.21 REVERSE 函数 REVERSE 函数把输入 RAW 值的字节颠倒顺序后返回结果。 语法 UTL_RAW.REVERSE (r IN RAW ) RETURN RAW 参数说明 r:RAW 类型,输入 RAW 值。 使用说明 输入 r 为 NULL 或长度为 0 会报错。 返回值 RAW 类型,颠倒顺序后的结果。 示例 SELECT UTL_RAW.REVERSE('0102030') FROM DUAL; reverse ---------30201000 20.2.22 SUBSTR 函数 SUBSTR 函数截取输入 RAW 值中从 pos 开始长度为 len 的子串,并返回子串。 173 第 20 章 UTL_RAW 语法 UTL_RAW.SUBSTR (r IN RAW , pos IN INTEGER [, len IN INTEGER] ) RETURN RAW 参数说明 r RAW 类型,输入 RAW 值。 pos integer 类型,截取的起始位置。 len integer 类型,截取长度。 使用说明 1. 起始位置 pos = 0 或大于 RAW 长度报错; 2. 指定长度 len 小于 1 或大于起始位置后剩余长度报错; 3. 起始位置 pos 大于 0,从 r 开头计数;小于 0,从 r 结尾计数; 4. 不指定长度 len,则截取剩余所有长度; 5. 输入 r 为 NULL 则返回 NULL。 返回值 RAW 类型,截取的子串。 示例 SELECT UTL_RAW.SUBSTR('01020304', 4, 1) FROM DUAL; substr -------04 20.2.23 TRANSLATE 函数 TRANSLATE 函数把输入的 raw 数据中字节按映射规则替换。 语法 UTL_RAW.TRANSLATE (r IN RAW, from_set IN RAW, to_set IN RAW) RETURN RAW 174 第 20 章 UTL_RAW 参数说明 r RAW 类型,输入 RAW 值。 from_set 被替换的源 RAW 值。 to_set 指定替换为目标 RAW 值。 使用说明 把输入参数 r 中字节按 from_set 中出现的位置替换为 to_set 对应位置的字节。 1. 如果字节在 from_set 出现,并且在 to_set 中有对应位置的字节,则替换为 to_set 中该对应字节;如果同一字 节在 from_set 中出现多次,以第一次出现位置的对应关系进行替换; 2. 如果字节在 from_set 出现,并且在 to_set 中没有对应位置的字节,则从结果中删除; 3. 如果字节没有在 from_set 出现,则保留在结果中; 4. 如果 to_set 比 from_set 长,则多出部分忽略; 5. 任何输入参数为 NULL 或长度为 0 报错。 返回值 RAW 类型。 示例 SELECT UTL_RAW.TRANSLATE(hextoraw('01020304'),hextoraw('01020304'),hextoraw('0a0b0c0d')) FROM DUAL; translate ----------0A0B0C0D 20.2.24 TRANSLITERATE 函数 TRANSLITERATE 函数把输入的 raw 数据中字节按映射规则替换。 语法 UTL_RAW.TRANSLITERATE (r IN RAW, to_set IN RAW,from_set IN RAW, pad IN RAW ) RETURN RAW 参数说明 r 175 第 20 章 UTL_RAW RAW 类型,输入 RAW 值。 to_set 指定替换为目标 RAW 值。 from_set 被替换的源 RAW 值。 pad 填充的 RAW 值。to_set 比 from_set 短的情况默认使用的替换字节,缺省为 NULL。 使用说明 1. 如果字节在 from_set 出现,并且在 to_set 中有对应位置的字节,则替换为 to_set 中该对应字节;如果同一字 节在 from_set 中出现多次,以第一次出现位置的对应关系进行替换; 2. 如果字节在 from_set 出现,并且在 to_set 中没有对应位置的字节,则替换为 pad 参数的第一个字节; 3. 如果字节没有在 from_set 出现,则保留在结果中; 4. 如果 from_set 为 NULL,默认为 00…ff; 5. 输入参数 r 为 NULL 或长度为 0 报错。 返回值 RAW 类型。 示例 SELECT UTL_RAW.TRANSLITERATE( hextoraw('01020304'),hextoraw('0a0b0c0d'), hextoraw('010203'),hextoraw('5555')) FROM DUAL; transliterate --------------0A0B0C04 20.2.25 XRANGE 函数 XRANGE 函数截取指定的起始和结束 RAW 数据之间的连续字节 RAW 值,并返回 RAW 值。 语法 UTL_RAW.XRANGE(start_byte IN RAW, end_byte IN RAW ) RETURN RAW 176 第 20 章 UTL_RAW 参数说明 start_byte 起始 RAW 字节,缺省为’00’。 end_byte 结束 RAW 字节,缺省为’FF’。 使用说明 start_byte 默认 00,end_byte 默认 ff,只取第一个字节。 返回值 RAW 类型。 示例 SELECT UTL_RAW.XRANGE(hextoraw('01'),hextoraw('04')) FROM DUAL; xrange --------------01020304 177 第 21 章 第 XMLTYPE 21章 XMLTYPE XMLTYPE 是处理 XML 数据的系统内置类型,它有预定义的成员函数用于抽取和处理 XML 节点和片段。 XMLTYPE 可以作为表或者视图的列的数据类型,也可以用作函数的参数类型。 21.1 XMLTYPE 使用说明 使用 XMLTYPE 系统包依赖 kdb_xmltype 插件,需要创建 kdb_xmltype 扩展后才可以使用 XMLTYPE 类型: CREATE EXTENSION kdb_xmltype; 更多 kdb_xmltype 插件信息参考《KingbaseES 插件参考手册》中的 kdb_xmltype 章节。 21.2 XMLTYPE 子程序 表XMLTYPE 子程序 列出了 XMLTYPE 类型所提供的子程序。 表 21.2.1: XMLTYPE 子程序 子程序名称 说明 CREATEXML 创建并返回一个 XMLType 实例 EXISTSNODE 用于检查 XML 中是否存在结点 EXTRACT 用于提取 XMLType 片段,并返回包含结果节点的 XMLType 实例 GETCLOBVAL 以 CLOB 的形式获取 XMLType 实例的值 GETNUMBERVAL 返回一个数值 GETSTRINGVAL 以字符串形式获取 XMLType 实例的内容 178 第 21 章 XMLTYPE 21.2.1 CREATEXML CREATEXML 静态函数创建并返回一个 XMLType 实例,用于传入数据的字符串和 CLOB 参数必须包含格式 正确且有效的 XML 文档。 语法 语法 描述 STATIC FUNCTION createXML(xmlData IN varchar2) RETURN XMLType 通过字符串创建一个 XMLType deterministic; 实例 STATIC FUNCTION createXML(xmlData IN clob) RETURN XMLType deter- 通过 clob 创建一个 XMLType ministic; 实例 参数说明 名称 描述 xmlData 传入的 xml 数据,其中源类型可以是 BFile、BLOB、CLOB、refcursor、VARCHAR2 或对象类型。 schema 指定的 Schema URL。 validated 表示实例有效的标记。(默认值为 0) well- 表示输入格式良好的标记。如果设置该参数,那么数据库将不会对输入实例进行格式检查。(默认值 formed 为 0) element 元素名,主要用于 xml 数据为 ADT_1 或 REF CURSOR 的原型。(默认为 NULL)。 csid 输入 XML 数据的字符集 id。 21.2.2 EXISTSNODE EXISTSNODE 成员函数用于检查 XML 中是否存在结点。 语法 语法 描述 MEMBER FUNCTION existsNode( xpath IN varchar2) RETURN 给定一个 XPath 表达式,检查在该路径下是 number deterministic; 否存在有效节点。 MEMBER FUNCTION existsNode( xpath in varchar2, nsmap in 通过指定 xpath 表达式和命名空间,来检查 varchar2) RETURN number deterministic; 在该路径下是否存在任一节点。 179 第 21 章 XMLTYPE 参数说明 名称 描述 xpath Xpath 表达式 nsmap 命名空间映射 返回值说明 如果 XPath 为 NULL 或文档为空,则返回 0,否则返回 1。 21.2.3 EXTRACT EXTRACT 成员函数用于提取 XMLType 片段,并返回包含结果节点的 XMLType 实例。 语法 语法 描述 MEMBER FUNCTION extract( xpath IN varchar2) RE- 给定 XPath 表达式,提取该路径下的内容,并以 TURN XMLType deterministic; XMLType 的形式返回片段。 MEMBER FUNCTION extract( xpath IN varchar2, 指定 xpath 表达式和命名空间,提取 xml 数据中的片 nsmap IN varchar2) RETURN XMLType deterministic; 段,并返回一个包含生成片段的 XMLType 实例。 参数说明 名称 描述 xpath XPath 表达式 nsmap 前缀到命名空间的映射信息 返回值说明 如果 XPath 未产生任何节点,则返回 NULL。 21.2.4 GETCLOBVAL GETCLOBVAL 成员函数以 CLOB 的形式获取 XMLType 实例的值。如果返回的 CLOB 是临时的,则必须在使 用后释放。函数返回的 clob 是只读的。 语法 180 第 21 章 XMLTYPE MEMBER FUNCTION getClobVal() RETURN clob deterministic; 21.2.5 GETNUMBERVAL GETNUMBERVAL 成员函数返回一个数值,该值的格式与 XMLType 实例所指向的文本值一致。XMLType 必 须是包含数值的有效文本节点。 语法 MEMBER FUNCTION getNumberVal() RETURN number deterministic; 21.2.6 GETSTRINGVAL GETSTRINGVAL 成员函数以字符串形式获取 XMLType 实例的内容。如果 XML 文档是一个文本结点,则返 回文本本身。如果 XML 文档超过 VARCHAR2 最大值 (4000),那么运行时就会报错。 语法 MEMBER FUNCTION getStringVal() RETURN varchar2 deterministic; 181 版权声明 版权声明 北京人大金仓信息技术股份有限公司(简称:人大金仓)版权所有,并保留对本手册及本声明的一切权利。 未得到人大金仓的书面许可,任何人不得以任何方式或形式对本手册内的任何部分进行复制、摘录、备份、修 改、传播、翻译成其他语言、将其全部或部分用于商业用途。 免责声明 本手册内容依据现有信息制作,由于产品版本升级或其他原因,其内容有可能变更。人大金仓保留在没有任何通 知或者提示的情况下对手册内容进行修改的权利。 本手册仅作为使用指导,人大金仓在编写本手册时已尽力保证其内容准确可靠,但并不确保手册内容完全没有错 误或遗漏,本手册中的所有信息也不构成任何明示或暗示的担保。 技术支持 • 人大金仓官方网站:http://www.kingbase.com.cn/ • 人大金仓文档中心:http://help.kingbase.com.cn/ • 全国服务热线:400-601-1188 • 人大金仓技术支持与反馈信箱:support@kingbase.com.cn 182 服务周期承诺 服务周期承诺 由于市场需求在不断变化,技术创新和发展的进程不断加剧,产品的版本更迭不可避免。人大金仓对于产品版本 生命周期的有效管理,有助于您提前规划项目,更好地从产品服务终止上过渡。 表 2: KingbaseES 产品生命周期里程碑 关键里程碑点 定义 产品发布日期 产品正式发布版本,即 GA(general availability)版本的发布日期。 停止销售日期 正式停止销售的日期,版本停止接受订单日。该日之后,产品将不再销售。 停止功能升级日期 在该日期之后,不再提供新特性和新硬件支持。但依旧提供错误修复、安全修复、功 能维护等服务。 停止功能维护日期 在该日期之后,不再维护功能,修复问题。但依旧提供安全修复等服务 停止安全维护日期 在该日期之后,不再发布补丁版本修复中高风险漏洞,仅提供有限的支持。 产品服务终止日期 停止提供产品服务和支持的日期。包括软件维护版本,缺陷修复,以及针对该产品的 所有服务支持(包括服务热线和远程/现场支持)。 服务周期策略 金仓数据库管理系统 KingbaseES 产品确保以下的服务周期: 1)产品自发布之日起至产品停止功能升级(包含新特性、新硬件支持)之日不少于 5 年。 2)产品停止功能升级之日起至产品停止功能维护(主要包括问题修复)之日不少于 4 年。 3)产品功能维护停止之日起至产品停止安全维护(包括中高风险漏洞修复)之日不少于 2 年。 服务终止策略 金仓数据库管理系统 KingbaseES 产品确保在销售后,至少提供 6 年的服务支持。 注意: 人大金仓将会综合各方因素来确定产品服务终止日期。并将在实际产品服务终止日期之前至少 90 天,通过公 183 服务周期承诺 开方式宣布产品服务终止日期。 184

相关文章