SqlOracleEnum.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package jnpf.database.sql.enums;
  2. import jnpf.database.enums.DbAliasEnum;
  3. import jnpf.database.enums.ParamEnum;
  4. import jnpf.database.source.DbBase;
  5. import jnpf.database.sql.enums.base.SqlFrameBase;
  6. import jnpf.database.sql.model.DbStruct;
  7. import lombok.AllArgsConstructor;
  8. import lombok.Getter;
  9. import java.util.Arrays;
  10. import java.util.List;
  11. /**
  12. * Oracle SQL语句模板
  13. *
  14. * @author JNPF开发平台组 YanYu
  15. * @version V3.3
  16. * @copyright 引迈信息技术有限公司
  17. * @date 2022/3/30
  18. */
  19. @Getter
  20. @AllArgsConstructor
  21. public enum SqlOracleEnum implements SqlFrameBase {
  22. /* =============================== 系统语句 ==================================== */
  23. FIELDS(
  24. "SELECT \n" +
  25. "\tA.COLUMN_NAME AS " + DbAliasEnum.FIELD.getAlias() + ",\n" +
  26. "\tA.DATA_TYPE AS " + DbAliasEnum.DATA_TYPE.getAlias() + ",\n" +
  27. "\tA.DATA_LENGTH AS " + DbAliasEnum.CHAR_LENGTH.getAlias() + ",\n" +
  28. "\tA.DATA_PRECISION AS " + DbAliasEnum.NUM_PRECISION.getAlias() + ",\n" +
  29. "\tA.DATA_SCALE AS " + DbAliasEnum.NUM_SCALE.getAlias() + ",\n" +
  30. "\tCASE WHEN E.CONSTRAINT_TYPE IS NOT NULL THEN '1' ELSE '0' END AS " + DbAliasEnum.PRIMARY_KEY.getAlias() + ",\n" +
  31. "\tCASE A.NULLABLE WHEN 'N' THEN '0' ELSE '1' END AS " + DbAliasEnum.ALLOW_NULL.getAlias() + ",\n" +
  32. "\t(SELECT COUNT(*) FROM ALL_TRIGGERS WHERE TABLE_NAME = A.TABLE_NAME AND TABLE_OWNER = A.OWNER AND INSTR(TRIGGER_NAME, 'AUTO_') >0) AS " + DbAliasEnum.AUTO_TRIGGER.getAlias() + ",\n" +
  33. "\tB.COMMENTS AS " + DbAliasEnum.FIELD_COMMENT.getAlias() + "\n" +
  34. "FROM \n" +
  35. "\tALL_TAB_COLUMNS A -- 表&字段 OWNER、TABLE_NAME、COLUMN_NAME_\t\n" +
  36. "LEFT JOIN \n" +
  37. "\tALL_COL_COMMENTS B -- 字段注释 TABLE_NAME、COLUMN_NAME\n" +
  38. "ON \n" +
  39. "\tA.OWNER = B.OWNER AND A.TABLE_NAME = B.TABLE_NAME AND A.COLUMN_NAME = B.COLUMN_NAME \n" +
  40. "LEFT JOIN \n" +
  41. "\t(SELECT \n" +
  42. "\t\t\tC.OWNER, C.TABLE_NAME, C.COLUMN_NAME, D.CONSTRAINT_TYPE \n" +
  43. "\t\tFROM \n" +
  44. "\t\t\tALL_CONS_COLUMNS C, ALL_CONSTRAINTS D \n" +
  45. "\t\tWHERE \n" +
  46. "\t\t\tC.CONSTRAINT_NAME = D.CONSTRAINT_NAME AND D.CONSTRAINT_TYPE = 'P'\n" +
  47. "\t) E\n" +
  48. "ON\n" +
  49. "\tA.OWNER = E.OWNER AND A.TABLE_NAME = E.TABLE_NAME AND A.COLUMN_NAME = E.COLUMN_NAME \n" +
  50. "WHERE\n" +
  51. " A.OWNER = " + ParamEnum.DB_NAME.getParamSign() + "\n" +
  52. "\tAND A.TABLE_NAME = " + ParamEnum.TABLE.getParamSign()
  53. ){
  54. @Override
  55. public void setStructParams(String table, DbStruct dbStruct, List<String> list) {
  56. list.add(dbStruct.getOracleDbSchema());
  57. list.add(table);
  58. }
  59. },
  60. // "SELECT atcs.table_name " + DbAliasConst.TABLE_NAME + ", atcs.comments " + DbAliasConst.TABLE_COMMENT + ", ats.num_rows " + DbAliasConst.TABLE_SUM + "\n" +
  61. // "FROM user_tab_comments atcs,all_tables ats WHERE atcs.table_name = ats.table_name AND ats.owner = '" + ParamEnum.DB_NAME.getParamSign() + "'"
  62. TABLES("SELECT atcs.table_name " + DbAliasEnum.TABLE_NAME.getAlias() + ", atcs.comments " + DbAliasEnum.TABLE_COMMENT.getAlias() + ", ats.num_rows " + DbAliasEnum.TABLE_SUM.getAlias() + "\n" +
  63. "FROM all_tab_comments atcs,all_tables ats WHERE atcs.table_name = ats.table_name AND ats.owner = atcs.owner AND ats.owner = " + ParamEnum.DB_NAME.getParamSign() + ""
  64. // "SELECT " +
  65. // "a.TABLE_NAME " + DbAliasConst.TABLE_NAME + ", " +
  66. // "b.COMMENTS " + DbAliasConst.TABLE_COMMENT + ", " +
  67. // "a.num_rows " + DbAliasConst.TABLE_SUM +
  68. // "\nFROM user_tables a, user_tab_comments b "
  69. // + "WHERE a.TABLE_NAME = b.TABLE_NAME "
  70. /*+ "and a.TABLESPACE_NAME='"+ ParamEnum.TABLE_SPACE.getTarget()+"'"*/
  71. ){
  72. @Override
  73. public void setStructParams(String table, DbStruct dbStruct, List<String> list) {
  74. list.add(dbStruct.getOracleDbSchema());
  75. }
  76. },
  77. TABLESANDVIEW("SELECT\n" +
  78. "\tatcs.table_name " + DbAliasEnum.TABLE_NAME.getAlias() + ",\n" +
  79. "\tatcs.comments " + DbAliasEnum.TABLE_COMMENT.getAlias() + ",\n" +
  80. "\tatcs.table_type " + DbAliasEnum.TABLE_TYPE.getAlias() + " \n" +
  81. "FROM\n" +
  82. "\tall_tab_comments atcs\n" +
  83. "\tLEFT JOIN all_views alv ON alv.owner = atcs.owner \n" +
  84. "WHERE\n" +
  85. "\tatcs.owner = " + ParamEnum.DB_NAME.getParamSign()
  86. ){
  87. @Override
  88. public void setStructParams(String table, DbStruct dbStruct, List<String> list) {
  89. list.add(dbStruct.getOracleDbSchema());
  90. }
  91. },
  92. TABLE(
  93. TABLES.sqlFrame + " AND ats.TABLE_NAME = " + ParamEnum.TABLE.getParamSign()
  94. ){
  95. @Override
  96. public void setStructParams(String table, DbStruct dbStruct, List<String> list) {
  97. list.add(dbStruct.getOracleDbSchema());
  98. list.add(table);
  99. }
  100. },
  101. EXISTS_TABLE(
  102. "SELECT COUNT(*) AS TOTAL FROM ALL_TABLES WHERE OWNER = UPPER(" + ParamEnum.DB_NAME.getParamSign() + ") AND TABLE_NAME = UPPER(" + ParamEnum.TABLE.getParamSign() + ")"
  103. ){
  104. @Override
  105. public void setStructParams(String table, DbStruct dbStruct, List<String> list) {
  106. list.add(dbStruct.getOracleDbSchema());
  107. list.add(table);
  108. }
  109. },
  110. /* =============================== 定义语句 ==================================== */
  111. // (Data Definition Language)简称 DDL:用来建立数据库、数据库对象和定义列的命令。包括:create、alter、drop
  112. CREATE_TABLE ("<CREATE> <TABLE> {table} <(>\n" +
  113. "【{column} {dataType} [[NOT] [NULL]] [<DEFAULT> {defaultValue}] 】" +
  114. "\n{primarykeys}" +
  115. "\n<)>"
  116. ){
  117. public String createIndex(){
  118. String model = "CREATE UNIQUE INDEX {indexName} ON {table}(【column】)";
  119. return null;
  120. }
  121. },
  122. // 添加自增
  123. CREATE_AUTO_INCREMENT(
  124. "CREATE SEQUENCE {table}_seq\n" +
  125. "INCREMENT by 1\n" + // 每次增加1
  126. "START WITH 1\n" + // 从1开始计数
  127. "NOMAXVALUE\n" + // 无最大值
  128. "NOCYCLE\n" + // 一直累加,不循环
  129. "NOCACHE"
  130. ),
  131. // 添加自增触发器(1、结尾需要用斜杠/,;代表行结束,/代表块结束。2、触发器与序列名字长度有限制)
  132. // select 1 from dual:用来做过渡;封号
  133. CREATE_AUTO_INCREMENT_TRIGGER(
  134. "CREATE OR REPLACE TRIGGER AUTO_{table}_tg\n" +
  135. "BEFORE INSERT ON {table}\n" +
  136. "FOR EACH ROW\n" +
  137. "BEGIN\n" +
  138. "\tSELECT {table}_seq.NEXTVAL INTO :new.{autoInc_field} FROM dual;\n" +
  139. "END;"
  140. ),
  141. DROP_SEQ (
  142. "DROP sequence {seqName}"
  143. ),
  144. DROP_TRIGGER(
  145. "DROP trigger {triggerName}"
  146. ),
  147. CREATE ("CREATE TABLE 《schema》.{table}(\n" +
  148. "【 " +
  149. "1:(PRIMARY KEY ({primaryColumn}))|" +
  150. "2:({column} {dataType} [[NOT] [NULL]] [DEFAULT {defaultValue}])" +
  151. ",\n】)"
  152. ),
  153. DROP_TABLE ("DROP TABLE {table}"),
  154. /**
  155. * 注意:Oracle DDL:COMMENT 无法在Mybatis Mapper.xml里面使用?占位符
  156. * 会出现:ORA-01780: 要求文字字符串
  157. */
  158. COMMENT_TABLE ("COMMENT ON TABLE 《schema》.{table} IS '{comment}'"),
  159. COMMENT_COLUMN ("COMMENT ON COLUMN 《schema》.{table}.{column} IS '{comment}'"),
  160. DROP_COLUMN ("ALTER TABLE 《schema》.{table} DROP COLUMN {column}"),
  161. ADD_COLUMN ("ALTER TABLE 《schema》.{table} ADD {column} {dataType}"),
  162. MODIFY_TYPE ("ALTER TABLE 《schema》.{table} ALTER COLUMN {column} TYPE {dataType}"),
  163. ALTER_TABLE ("ALTER TABLE 《schema》.{oldTable} RENAME TO {newTable}"),
  164. /* =============================== DML操作语句 ==================================== */
  165. /* (Data Manipulation Language)简称 DML:用来操纵数据库中数据的命令。包括:select、insert、update、delete。
  166. 注意:有一些Oracle版本中的语法子查询不支持别名关键词 AS */
  167. /*=============================== ALTER ====================================*/
  168. ORDER_PAGE ("SELECT * FROM " +
  169. "(SELECT JNPF_TEMP.*, ROWNUM JNPF_RowNo " +
  170. "FROM " +
  171. "({selectSql}) JNPF_TEMP " +
  172. "ORDER BY {orderColumn} [DESC]) JNPF_TAB " +
  173. "WHERE JNPF_TAB.JNPF_RowNo BETWEEN {beginIndex} AND {endIndex}"),
  174. DB_TIME_SQL ("select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as TIME from dual"),
  175. INSERT ("INSERT INTO 《schema》.{table} (【{column},】) VALUES (【{value},】)"),
  176. /**
  177. * 【注意:Oracle所有插入字符,也就是''之间的内容都会隐式转成varchar2类型,都不得超过4000】
  178. * 尾部用;结尾,不然会报错
  179. */
  180. CLOB_INSERT ("DECLARE\n" +
  181. "\tclobVal {table}.{column}%TYPE;\n" +
  182. "BEGIN\t\n" +
  183. "\tclobVal := '{value}';\n" +
  184. "INSERT INTO {table} (【{clobColumn},{column},】) VALUES (【{clobVal},{value},】);\n" +
  185. "END"),
  186. CLOB_UPDATE (
  187. "DECLARE \n" +
  188. "-- 此表为:{table}\n" +
  189. "\tv_context NCLOB;\n" +
  190. "BEGIN\n" +
  191. "\tDBMS_LOB.CREATETEMPORARY(v_context,TRUE);\n" +
  192. // "\tcontext := '' ;\n" +
  193. "\t【DBMS_LOB.APPEND(v_context, '{context}');】\n" +
  194. "\tUPDATE {table} SET {column} = v_context WHERE {key} = '{value}';\n" +
  195. "END"
  196. ){
  197. @Override
  198. public String getFastSql(List<String> values){
  199. String sql = this.getSqlFrame();
  200. List<String> keys = Arrays.asList(
  201. "{table}",
  202. "{column}",
  203. "\t【DBMS_LOB.APPEND(v_context, '{context}');】\n",
  204. "{key}",
  205. "{value}"
  206. );
  207. for (int i = 0; i < values.size(); i++) {
  208. if(values.get(i) != null){
  209. sql = sql.replace(keys.get(i), values.get(i));
  210. }
  211. }
  212. return sql;
  213. }
  214. },
  215. CLOB_APPEND("DBMS_LOB.APPEND(v_context, '{context}')"),
  216. BLOB_UPDATE (
  217. "DECLARE \n" +
  218. "-- 此表为:{table}\n" +
  219. "\tv_context BLOB;\n" +
  220. "BEGIN\n" +
  221. "\tDBMS_LOB.CREATETEMPORARY(v_context,TRUE);\n" +
  222. "\t【DBMS_LOB.APPEND(v_context, HEXTORAW('{context}'))】\n" +
  223. "\tUPDATE {table} SET {column} = v_context WHERE {key} = '{value}';\n" +
  224. "END"
  225. ){
  226. @Override
  227. public String getFastSql(List<String> values){
  228. String sql = this.getSqlFrame();
  229. List<String> keys = Arrays.asList(
  230. "{table}",
  231. "{column}",
  232. "\t【DBMS_LOB.APPEND(v_context, HEXTORAW('{context}'))】\n",
  233. "{key}",
  234. "{value}"
  235. );
  236. for (int i = 0; i < values.size(); i++) {
  237. if(values.get(i) != null){
  238. sql = sql.replace(keys.get(i), values.get(i));
  239. }
  240. }
  241. return sql;
  242. }
  243. },
  244. BLOB_APPEND("DBMS_LOB.APPEND(v_context, HEXTORAW('{context}'))"),
  245. /* =============================== 其他 ==================================== */
  246. /**
  247. * oracle 时间格式转换
  248. */
  249. TO_TIME ("TO_DATE('{datetime}','YYYY-MM-DD HH24:MI:SS')"),
  250. /**
  251. * 查看现有表空间信息
  252. */
  253. SELECT_TABLESPACE("SELECT TABLESPACE_NAME,FILE_ID,FILE_NAME,round(bytes/(1024*1024),0) total_space FROM DBA_DATA_FILES ORDER BY TABLESPACE_NAME"),
  254. /**
  255. * 创建临时表空间
  256. */
  257. CREATE_TEMP_TABLESPACE("CREATE TEMPORARY TABLESPACE UQSM_TEMP TEMPFILE '/{path}/{tempTablespaceName}.dbf' " +
  258. "size 8000m autoextend on next 50m maxsize unlimited extent management local;"),
  259. /**
  260. * 创建表空间
  261. */
  262. CREATE_TABLESPACE("\n" + "CREATE TABLESPACE UQSM_DATA LOGGING DATAFILE '/{path}/{tempTablespaceName}.dbf' " +
  263. "SIZE 8000m autoextendon next 50M maxsize unlimited extent management local;\n"),
  264. /**
  265. * 创建用户
  266. */
  267. CREATE_USER ("CREATE USER {user} IDENTIFIED BY {password} DEFAULT TABLESPACE {tablespace} TEMPORARY TABLESPACE {tempTablespace}"),
  268. /**
  269. * 删除用户
  270. */
  271. DROP_USER ("DROP USER {user}"),
  272. /**
  273. * 给用户授予权限
  274. */
  275. GRANT_ROLE ("GRANT connect,RESOURCE,dba to {user};"),
  276. /**
  277. * 修改用户的密码
  278. */
  279. ALTER_USER_PASSWORD("ALTER USER {user} IDENTIFIED BY {password}"),
  280. ;
  281. private final String sqlFrame;
  282. private final String dbEncode = DbBase.ORACLE;
  283. public String getFastSql(List<String> values){
  284. return this.getSqlFrame();
  285. }
  286. }