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