@zerodep-dev/easy-query-ts-oracle 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +18 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/dialect.d.ts +73 -0
- package/dist/dialect.d.ts.map +1 -0
- package/dist/dialect.js +327 -0
- package/dist/dialect.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +171 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -3
- package/src/dialect.ts +391 -0
- package/src/index.ts +223 -0
package/dist/dialect.js
ADDED
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/** Oracle 方言(不依赖驱动):Oracle 包与 Oracle 兼容的库(达梦)共用 */
|
|
2
|
+
import { assembleTables, bareName, dateFormatParts, Dialect, SqlWriter, standardJsonPath, unquoteSql, } from '@zerodep-dev/easy-query-ts';
|
|
3
|
+
/** CASE 分支里参数要转成的类型(按列的种类) */
|
|
4
|
+
const CASE_TYPES = {
|
|
5
|
+
int: 'NUMBER',
|
|
6
|
+
bigint: 'NUMBER',
|
|
7
|
+
decimal: 'NUMBER',
|
|
8
|
+
double: 'BINARY_DOUBLE',
|
|
9
|
+
datetime: 'TIMESTAMP(3)',
|
|
10
|
+
date: 'DATE',
|
|
11
|
+
json: 'JSON',
|
|
12
|
+
string: 'VARCHAR2(4000)',
|
|
13
|
+
};
|
|
14
|
+
const SECONDS = { second: 1, minute: 60, hour: 3600, day: 86400 };
|
|
15
|
+
export class OracleDialect extends Dialect {
|
|
16
|
+
name = 'oracle';
|
|
17
|
+
/** CASE 分支里参数要转成的类型(Oracle 兼容的库按自己的类型名覆盖) */
|
|
18
|
+
caseTypes = CASE_TYPES;
|
|
19
|
+
/** Oracle 一条语句最多 65535 个绑定变量;IN 列表最多 1000 项另由核心切分 */
|
|
20
|
+
maxBindParams = 65535;
|
|
21
|
+
indexIfNotExists;
|
|
22
|
+
dropIfExists;
|
|
23
|
+
/** Oracle 的 DDL 会隐式提交 */
|
|
24
|
+
transactionalDdl = false;
|
|
25
|
+
recursiveKeyword = '';
|
|
26
|
+
ctesAtTop = true;
|
|
27
|
+
/** 23ai 起有 SQL 的 BOOLEAN:条件能当值、布尔列能当条件 */
|
|
28
|
+
booleanValues;
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
super(options);
|
|
31
|
+
// 23ai 起有 IF [NOT] EXISTS
|
|
32
|
+
this.indexIfNotExists = this.atLeast('23');
|
|
33
|
+
this.dropIfExists = this.atLeast('23');
|
|
34
|
+
this.booleanValues = this.atLeast('23');
|
|
35
|
+
}
|
|
36
|
+
placeholder(index) {
|
|
37
|
+
return `:${index}`;
|
|
38
|
+
}
|
|
39
|
+
likeEscape() {
|
|
40
|
+
return " ESCAPE '\\'";
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 带毫秒的日期时间文字(核心按 UTC 编码的写法)写成 TO_TIMESTAMP(:n, …):NLS_DATE_FORMAT 认不得小数秒,
|
|
44
|
+
* 放进 DATE 的上下文、CASE 的分支时隐式转换会失败
|
|
45
|
+
*/
|
|
46
|
+
bindParam(value, w) {
|
|
47
|
+
if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}$/.test(value))
|
|
48
|
+
return `TO_TIMESTAMP(${w.bind(this, value)}, 'YYYY-MM-DD HH24:MI:SS.FF3')`;
|
|
49
|
+
return super.bindParam(value, w);
|
|
50
|
+
}
|
|
51
|
+
/** CASE 的各分支要同一个类型(NULL 的绑定变量默认是 CHAR):参数按列的种类转成那一列的类型 */
|
|
52
|
+
caseValue(n, w) {
|
|
53
|
+
const sql = super.caseValue(n, w);
|
|
54
|
+
if (n.k !== 'param' || !n.codec)
|
|
55
|
+
return sql;
|
|
56
|
+
const type = this.caseTypes[n.codec.kind];
|
|
57
|
+
return type ? `CAST(${sql} AS ${type})` : sql;
|
|
58
|
+
}
|
|
59
|
+
/** 没有 SQL 的 BOOLEAN 时(23ai 之前)布尔写成 1 / 0 */
|
|
60
|
+
encodeParam(value, kind) {
|
|
61
|
+
if (typeof value === 'boolean')
|
|
62
|
+
return this.booleanValues ? value : value ? 1 : 0;
|
|
63
|
+
return super.encodeParam(value, kind);
|
|
64
|
+
}
|
|
65
|
+
// ---- 查询 ----
|
|
66
|
+
/** 12c 起 OFFSET … FETCH */
|
|
67
|
+
limitOffset(limit, offset) {
|
|
68
|
+
if (limit === undefined && (offset === undefined || offset === 0))
|
|
69
|
+
return '';
|
|
70
|
+
let s = offset ? ` OFFSET ${Math.trunc(offset)} ROWS` : '';
|
|
71
|
+
if (limit !== undefined)
|
|
72
|
+
s += ` FETCH NEXT ${Math.trunc(limit)} ROWS ONLY`;
|
|
73
|
+
return s;
|
|
74
|
+
}
|
|
75
|
+
select(q, w = new SqlWriter()) {
|
|
76
|
+
if (!this.atLeast('12.1') && (q.limit !== undefined || (q.offset ?? 0) > 0))
|
|
77
|
+
return this.rownumPage(q, w);
|
|
78
|
+
return super.select(q, w);
|
|
79
|
+
}
|
|
80
|
+
/** 12c 之前:SELECT 列 FROM (SELECT eq_a.*, ROWNUM eq_rn FROM (原查询) eq_a WHERE ROWNUM <= 上界) WHERE eq_rn > 偏移 */
|
|
81
|
+
rownumPage(q, w) {
|
|
82
|
+
const offset = Math.trunc(q.offset ?? 0);
|
|
83
|
+
const inner = super.select({ ...q, limit: undefined, offset: undefined }, w);
|
|
84
|
+
const bound = q.limit === undefined ? '' : ` WHERE ROWNUM <= ${offset + Math.trunc(q.limit)}`;
|
|
85
|
+
const columns = q.columns.map((c) => this.quote(c.as)).join(', ') || '*';
|
|
86
|
+
return `SELECT ${columns} FROM (SELECT eq_a.*, ROWNUM eq_rn FROM (${inner}) eq_a${bound}) WHERE eq_rn > ${offset} ORDER BY eq_rn`;
|
|
87
|
+
}
|
|
88
|
+
// ---- 写入 ----
|
|
89
|
+
/** 表别名不写 AS;带导航的 join 用核心的"按主键自连接"写法(UPDATE … WHERE EXISTS 由子类改写) */
|
|
90
|
+
update(q, w = new SqlWriter()) {
|
|
91
|
+
const joins = q.joins ?? [];
|
|
92
|
+
if (joins.length === 0) {
|
|
93
|
+
const set = q.set.map((s) => `${this.quote(s.column)} = ${this.value(s.e, w)}`).join(', ');
|
|
94
|
+
let s = `UPDATE ${this.table(q.from.table)} ${q.from.alias} SET ${set}`;
|
|
95
|
+
if (q.where.length > 0)
|
|
96
|
+
s += ` WHERE ${this.conjunction(q.where, w)}`;
|
|
97
|
+
return s;
|
|
98
|
+
}
|
|
99
|
+
// 没有 UPDATE … FROM:按主键自连接,新值写成多列子查询,范围写成 EXISTS(join 的条件、参数在两处各渲染一次,顺序与文字一致)
|
|
100
|
+
const self = `${q.from.alias}_w`;
|
|
101
|
+
const same = (q.key ?? [])
|
|
102
|
+
.map((k) => `${self}.${this.quote(k)} = ${q.from.alias}.${this.quote(k)}`)
|
|
103
|
+
.join(' AND ');
|
|
104
|
+
if (!same)
|
|
105
|
+
throw new Error(`update through a navigation needs a primary key on ${q.from.table}`);
|
|
106
|
+
const from = () => `${this.table(q.from.table)} ${q.from.alias}${this.joinClauses(joins, w)}`;
|
|
107
|
+
const columns = q.set.map((c) => this.quote(c.column)).join(', ');
|
|
108
|
+
const values = q.set.map((c) => this.value(c.e, w)).join(', ');
|
|
109
|
+
const source = from();
|
|
110
|
+
const scope = from();
|
|
111
|
+
const where = q.where.length > 0 ? ` AND ${this.conjunction(q.where, w)}` : '';
|
|
112
|
+
return `UPDATE ${this.table(q.from.table)} ${self} SET (${columns}) = (SELECT ${values} FROM ${source} WHERE ${same}) WHERE EXISTS (SELECT 1 FROM ${scope} WHERE ${same}${where})`;
|
|
113
|
+
}
|
|
114
|
+
delete(q, w = new SqlWriter()) {
|
|
115
|
+
if (!q.joins?.length) {
|
|
116
|
+
let s = `DELETE FROM ${this.table(q.from.table)} ${q.from.alias}`;
|
|
117
|
+
if (q.where.length > 0)
|
|
118
|
+
s += ` WHERE ${this.conjunction(q.where, w)}`;
|
|
119
|
+
return s;
|
|
120
|
+
}
|
|
121
|
+
const self = `${q.from.alias}_w`;
|
|
122
|
+
const from = `${this.table(q.from.table)} ${q.from.alias}${this.joinClauses(q.joins, w)}`;
|
|
123
|
+
const keys = (q.key ?? []).map((k) => `${self}.${this.quote(k)} = ${q.from.alias}.${this.quote(k)}`);
|
|
124
|
+
const where = [...keys, ...(q.where.length > 0 ? [this.conjunction(q.where, w)] : [])].join(' AND ');
|
|
125
|
+
return `DELETE FROM ${this.table(q.from.table)} ${self} WHERE EXISTS (SELECT 1 FROM ${from} WHERE ${where})`;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 多行插入写成一个匿名块里的逐行 INSERT(一次往返):INSERT ALL 对自增列只生成一次值,23ai 的多行 VALUES
|
|
129
|
+
* 按第一行推断绑定变量的类型(数字文字进 NUMBER 列会失败)。一块最多 500 行,免得块太大编译慢
|
|
130
|
+
*/
|
|
131
|
+
maxInsertRows = 500;
|
|
132
|
+
/** upsert 写成 MERGE … USING (SELECT … FROM DUAL) */
|
|
133
|
+
insert(q, w = new SqlWriter()) {
|
|
134
|
+
if (q.conflict)
|
|
135
|
+
return this.merge(q, q.conflict, w);
|
|
136
|
+
if (q.source || q.rows.length === 1)
|
|
137
|
+
return super.insert(q, w);
|
|
138
|
+
const rows = q.rows.map((r) => super.insert({ ...q, rows: [r] }, w));
|
|
139
|
+
return `BEGIN ${rows.join('; ')}; END;`;
|
|
140
|
+
}
|
|
141
|
+
merge(q, conflict, w) {
|
|
142
|
+
const cols = q.columns.map((c) => this.quote(c));
|
|
143
|
+
const source = q.rows
|
|
144
|
+
.map((r) => `SELECT ${r.map((n, i) => `${this.node(n, w)} AS ${cols[i]}`).join(', ')} FROM DUAL`)
|
|
145
|
+
.join(' UNION ALL ');
|
|
146
|
+
const on = conflict.target
|
|
147
|
+
.map((t) => `eq_t.${this.quote(t)} = eq_s.${this.quote(t)}`)
|
|
148
|
+
.join(' AND ');
|
|
149
|
+
let s = `MERGE INTO ${this.table(q.table)} eq_t USING (${source}) eq_s ON (${on})`;
|
|
150
|
+
if (conflict.update.length > 0)
|
|
151
|
+
s += ` WHEN MATCHED THEN UPDATE SET ${conflict.update.map((u) => `eq_t.${this.quote(u)} = eq_s.${this.quote(u)}`).join(', ')}`;
|
|
152
|
+
return `${s} WHEN NOT MATCHED THEN INSERT (${cols.join(', ')}) VALUES (${cols.map((c) => `eq_s.${c}`).join(', ')})`;
|
|
153
|
+
}
|
|
154
|
+
/** 单行插入取自增主键:RETURNING 主键 INTO 输出变量(驱动认 :eq_id) */
|
|
155
|
+
generatedKeys = 'returning';
|
|
156
|
+
returning(column) {
|
|
157
|
+
return ` RETURNING ${this.quote(column)} INTO :eq_id`;
|
|
158
|
+
}
|
|
159
|
+
releaseSavepoint() {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
// ---- 函数 ----
|
|
163
|
+
functions() {
|
|
164
|
+
return {
|
|
165
|
+
...super.functions(),
|
|
166
|
+
length: (a) => `LENGTH(${a[0]})`,
|
|
167
|
+
concat: (a) => `(${a.map((x) => `${x}`).join(' || ')})`,
|
|
168
|
+
substring: (a) => `SUBSTR(${a.join(', ')})`,
|
|
169
|
+
index_of: (a) => `(INSTR(${a[0]}, ${a[1]}) - 1)`,
|
|
170
|
+
left: (a) => `SUBSTR(${a[0]}, 1, ${a[1]})`,
|
|
171
|
+
right: (a) => `SUBSTR(${a[0]}, -LEAST(${a[1]}, LENGTH(${a[0]})))`,
|
|
172
|
+
ceil: (a) => `CEIL(${a[0]})`,
|
|
173
|
+
log10: (a) => `LOG(10, ${a[0]})`,
|
|
174
|
+
log: (a) => `LOG(${a[1]}, ${a[0]})`,
|
|
175
|
+
atan2: (a) => `ATAN2(${a[0]}, ${a[1]})`,
|
|
176
|
+
add_days: (a) => `(${a[0]} + NUMTODSINTERVAL(${a[1]}, 'DAY'))`,
|
|
177
|
+
add_months: (a) => `ADD_MONTHS(${a[0]}, ${a[1]})`,
|
|
178
|
+
diff_days: (a) => `(TRUNC(CAST(${a[0]} AS DATE)) - TRUNC(CAST(${a[1]} AS DATE)))`,
|
|
179
|
+
// 年、月是 YEAR TO MONTH 的区间,其余是 DAY TO SECOND
|
|
180
|
+
add_time: (a) => {
|
|
181
|
+
const unit = unquoteSql(a[2]).toUpperCase();
|
|
182
|
+
const fn = unit === 'YEAR' || unit === 'MONTH' ? 'NUMTOYMINTERVAL' : 'NUMTODSINTERVAL';
|
|
183
|
+
return `(${a[0]} + ${fn}(${a[1]}, '${unit}'))`;
|
|
184
|
+
},
|
|
185
|
+
diff_time: (a) => `TRUNC((CAST(${a[0]} AS DATE) - CAST(${a[1]} AS DATE)) * 86400 / ${SECONDS[unquoteSql(a[2])]})`,
|
|
186
|
+
hour: (a) => `EXTRACT(HOUR FROM CAST(${a[0]} AS TIMESTAMP))`,
|
|
187
|
+
minute: (a) => `EXTRACT(MINUTE FROM CAST(${a[0]} AS TIMESTAMP))`,
|
|
188
|
+
second: (a) => `TRUNC(EXTRACT(SECOND FROM CAST(${a[0]} AS TIMESTAMP)))`,
|
|
189
|
+
day_of_year: (a) => `TO_NUMBER(TO_CHAR(${a[0]}, 'DDD'))`,
|
|
190
|
+
// 与 NLS_TERRITORY 无关的星期:相对一个已知的星期日算
|
|
191
|
+
day_of_week: (a) => `MOD(TRUNC(${a[0]}) - DATE '1970-01-04', 7)`,
|
|
192
|
+
iso_day_of_week: (a) => `(MOD(TRUNC(${a[0]}) - DATE '1970-01-05', 7) + 1)`,
|
|
193
|
+
date_format: (a) => this.formatDate(a[0], dateFormatParts(unquoteSql(a[1]))),
|
|
194
|
+
date_trunc: (a) => this.dateTrunc(a[0], unquoteSql(a[1])),
|
|
195
|
+
now: () => `SYS_EXTRACT_UTC(SYSTIMESTAMP)`,
|
|
196
|
+
in_csv: (a) => `(',' || ${a[1]} || ',' LIKE '%,' || ${a[0]} || ',%')`,
|
|
197
|
+
truncate: (a) => `TRUNC(${a[0]}, ${a[1]})`,
|
|
198
|
+
// 正则(Expr.matches):第三个参数 'c' 区分大小写、'i' 忽略
|
|
199
|
+
regex_match: (a) => `REGEXP_LIKE(${a[0]}, ${a[1]}, ${a[2]})`,
|
|
200
|
+
json_value: (a) => `JSON_QUERY(${a[0]}, ${standardJsonPath(a[1])} WITH CONDITIONAL WRAPPER)`,
|
|
201
|
+
json_text: (a) => `JSON_VALUE(${a[0]}, ${standardJsonPath(a[1])})`,
|
|
202
|
+
json_number: (a) => `JSON_VALUE(${a[0]}, ${standardJsonPath(a[1])} RETURNING BINARY_DOUBLE)`,
|
|
203
|
+
json_boolean: (a) => `(CASE JSON_VALUE(${a[0]}, ${standardJsonPath(a[1])}) WHEN 'true' THEN 1 WHEN 'false' THEN 0 END)`,
|
|
204
|
+
json_has: (a) => `JSON_EXISTS(${a[0]}, ${standardJsonPath(a[1])})`,
|
|
205
|
+
json_length: (a) => `JSON_VALUE(${a[0]}, ${standardJsonPath(a[1]).replace(/'$/, ".size()'")})`,
|
|
206
|
+
cast_string: (a) => `CAST(${a[0]} AS VARCHAR2(4000))`,
|
|
207
|
+
cast_int: (a) => `CAST(${a[0]} AS NUMBER(10))`,
|
|
208
|
+
cast_bigint: (a) => `CAST(${a[0]} AS NUMBER(19))`,
|
|
209
|
+
cast_double: (a) => `CAST(${a[0]} AS BINARY_DOUBLE)`,
|
|
210
|
+
cast_datetime: (a) => `CAST(${a[0]} AS TIMESTAMP(3))`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
dateTrunc(x, unit) {
|
|
214
|
+
const format = {
|
|
215
|
+
year: 'YYYY',
|
|
216
|
+
quarter: 'Q',
|
|
217
|
+
month: 'MM',
|
|
218
|
+
week: 'IW',
|
|
219
|
+
day: 'DD',
|
|
220
|
+
hour: 'HH24',
|
|
221
|
+
minute: 'MI',
|
|
222
|
+
}[unit];
|
|
223
|
+
if (!format)
|
|
224
|
+
return `CAST(CAST(${x} AS DATE) AS TIMESTAMP(3))`;
|
|
225
|
+
return `CAST(TRUNC(${x}, '${format}') AS TIMESTAMP(3))`;
|
|
226
|
+
}
|
|
227
|
+
/** LISTAGG(e, 分隔符) WITHIN GROUP (ORDER BY …);DISTINCT 要 19c */
|
|
228
|
+
stringAgg(n, w) {
|
|
229
|
+
if (n.distinct)
|
|
230
|
+
this.requires('LISTAGG(DISTINCT …)', '19');
|
|
231
|
+
const order = this.aggOrder(n.order, w).trim() || 'ORDER BY NULL';
|
|
232
|
+
return `LISTAGG(${n.distinct ? 'DISTINCT ' : ''}${this.node(n.e, w)}, '${n.separator.replaceAll("'", "''")}') WITHIN GROUP (${order})`;
|
|
233
|
+
}
|
|
234
|
+
// ---- 建表 ----
|
|
235
|
+
columnType(kind, o) {
|
|
236
|
+
if (o.dbType)
|
|
237
|
+
return o.dbType;
|
|
238
|
+
switch (kind) {
|
|
239
|
+
case 'string':
|
|
240
|
+
return `VARCHAR2(${o.length ?? 255} CHAR)`;
|
|
241
|
+
case 'int':
|
|
242
|
+
return 'NUMBER(10)';
|
|
243
|
+
case 'bigint':
|
|
244
|
+
return 'NUMBER(19)';
|
|
245
|
+
case 'decimal':
|
|
246
|
+
return `NUMBER(${o.precision ?? 38}, ${o.scale ?? 10})`;
|
|
247
|
+
case 'double':
|
|
248
|
+
return 'BINARY_DOUBLE';
|
|
249
|
+
case 'boolean':
|
|
250
|
+
return this.atLeast('23') ? 'BOOLEAN' : 'NUMBER(1)';
|
|
251
|
+
case 'time':
|
|
252
|
+
return 'VARCHAR2(12)';
|
|
253
|
+
case 'datetime':
|
|
254
|
+
return 'TIMESTAMP(3)';
|
|
255
|
+
case 'json':
|
|
256
|
+
return this.atLeast('21') ? 'JSON' : 'CLOB';
|
|
257
|
+
case 'bytes':
|
|
258
|
+
return 'BLOB';
|
|
259
|
+
default:
|
|
260
|
+
return super.columnType(kind, o);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
createTableStart(ifNotExists) {
|
|
264
|
+
return ifNotExists && this.atLeast('23') ? 'CREATE TABLE IF NOT EXISTS' : 'CREATE TABLE';
|
|
265
|
+
}
|
|
266
|
+
/** DEFAULT 要写在 NOT NULL 前面 */
|
|
267
|
+
columnDefinition(name, kind, o) {
|
|
268
|
+
return [
|
|
269
|
+
this.quote(name),
|
|
270
|
+
this.columnType(kind, o),
|
|
271
|
+
o.generated ? this.identity() : undefined,
|
|
272
|
+
o.dbDefault !== undefined ? `DEFAULT ${o.dbDefault}` : undefined,
|
|
273
|
+
o.nullable ? undefined : 'NOT NULL',
|
|
274
|
+
]
|
|
275
|
+
.filter(Boolean)
|
|
276
|
+
.join(' ');
|
|
277
|
+
}
|
|
278
|
+
identity() {
|
|
279
|
+
this.requires('IDENTITY columns', '12.1');
|
|
280
|
+
return 'GENERATED BY DEFAULT ON NULL AS IDENTITY';
|
|
281
|
+
}
|
|
282
|
+
addColumn(table, name, kind, o) {
|
|
283
|
+
return `ALTER TABLE ${this.table(table)} ADD (${this.columnDefinition(name, kind, o)})`;
|
|
284
|
+
}
|
|
285
|
+
/** 读库结构时列类型的写法(user_tab_columns 别名 c),与 columnType 的输出对得上 */
|
|
286
|
+
introspectedType = `LOWER(c.data_type) || CASE
|
|
287
|
+
WHEN c.data_type IN ('VARCHAR2', 'NVARCHAR2', 'CHAR', 'NCHAR') THEN '(' || c.char_length || CASE c.char_used WHEN 'C' THEN ' char' ELSE '' END || ')'
|
|
288
|
+
WHEN c.data_type = 'NUMBER' AND c.data_precision IS NOT NULL THEN '(' || c.data_precision || CASE WHEN c.data_scale > 0 THEN ', ' || c.data_scale ELSE '' END || ')'
|
|
289
|
+
ELSE '' END`;
|
|
290
|
+
/** 读库结构时判断自增列(1 / 0) */
|
|
291
|
+
introspectedIdentity = `CASE c.identity_column WHEN 'YES' THEN 1 ELSE 0 END`;
|
|
292
|
+
/** USER_* 数据字典(当前用户的表) */
|
|
293
|
+
async introspect(run) {
|
|
294
|
+
return assembleTables({
|
|
295
|
+
tables: await run(`SELECT t.table_name AS "table_name", c.comments AS "comment" FROM user_tables t
|
|
296
|
+
LEFT JOIN user_tab_comments c ON c.table_name = t.table_name ORDER BY t.table_name`),
|
|
297
|
+
columns: await run(`SELECT c.table_name AS "table_name", c.column_name AS "column_name",
|
|
298
|
+
${this.introspectedType} AS "column_type",
|
|
299
|
+
CASE c.nullable WHEN 'Y' THEN 1 ELSE 0 END AS "is_nullable", c.data_default AS "column_default",
|
|
300
|
+
m.comments AS "comment", ${this.introspectedIdentity} AS "is_generated",
|
|
301
|
+
CASE WHEN EXISTS (SELECT 1 FROM user_constraints k JOIN user_cons_columns kc ON kc.constraint_name = k.constraint_name
|
|
302
|
+
WHERE k.constraint_type = 'P' AND k.table_name = c.table_name AND kc.column_name = c.column_name) THEN 1 ELSE 0 END AS "primary_key"
|
|
303
|
+
FROM user_tab_columns c
|
|
304
|
+
LEFT JOIN user_col_comments m ON m.table_name = c.table_name AND m.column_name = c.column_name
|
|
305
|
+
ORDER BY c.table_name, c.column_id`),
|
|
306
|
+
indexes: await run(`SELECT i.table_name AS "table_name", i.index_name AS "index_name", CASE i.uniqueness WHEN 'UNIQUE' THEN 1 ELSE 0 END AS "is_unique",
|
|
307
|
+
ic.column_name AS "column_name"
|
|
308
|
+
FROM user_indexes i JOIN user_ind_columns ic ON ic.index_name = i.index_name
|
|
309
|
+
WHERE NOT EXISTS (SELECT 1 FROM user_constraints k WHERE k.index_name = i.index_name AND k.constraint_type = 'P')
|
|
310
|
+
ORDER BY i.table_name, i.index_name, ic.column_position`),
|
|
311
|
+
foreignKeys: await run(`SELECT k.table_name AS "table_name", k.constraint_name AS "constraint_name", kc.column_name AS "column_name",
|
|
312
|
+
r.table_name AS "referenced_table", rc.column_name AS "referenced_column"
|
|
313
|
+
FROM user_constraints k JOIN user_cons_columns kc ON kc.constraint_name = k.constraint_name
|
|
314
|
+
JOIN user_constraints r ON r.constraint_name = k.r_constraint_name
|
|
315
|
+
JOIN user_cons_columns rc ON rc.constraint_name = r.constraint_name AND rc.position = kc.position
|
|
316
|
+
WHERE k.constraint_type = 'R' ORDER BY k.table_name, k.constraint_name, kc.position`),
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
/** varchar2(50 char) 与 VARCHAR2(50 CHAR)、number(10) 等写法不算差异 */
|
|
320
|
+
normalizeType(type) {
|
|
321
|
+
return super.normalizeType(type);
|
|
322
|
+
}
|
|
323
|
+
renameTable(from, to) {
|
|
324
|
+
return `ALTER TABLE ${this.table(from)} RENAME TO ${this.quote(bareName(to))}`;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=dialect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialect.js","sources":["../src/dialect.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oracle Database,驱动用 oracledb 的 Thin 模式(纯 JS,不装 Instant Client)。按服务器版本渲染:
|
|
3
|
+
* ```ts
|
|
4
|
+
* import oracledb from 'oracledb'
|
|
5
|
+
* const pool = await oracledb.createPool({ user, password, connectString: 'host:1521/FREEPDB1' })
|
|
6
|
+
* const db = createDb({ schema, adapter: oracle(pool) }) // 默认按最新(23ai)
|
|
7
|
+
* const old = createDb({ schema, adapter: oracle(pool, { version: '11.2' }) }) // ROWNUM 分页、NUMBER(1) 布尔
|
|
8
|
+
* ```
|
|
9
|
+
* 版本门槛(低于时退回旧写法,没有旧写法就报错并说明要哪个版本):
|
|
10
|
+
* - 12.1:OFFSET … FETCH 分页(之前用 ROWNUM 包两层)、IDENTITY 列、LISTAGG 之外的 JSON_VALUE 等
|
|
11
|
+
* - 23:SQL 的 BOOLEAN(条件能直接当值、布尔列能直接当条件、BOOLEAN 列类型)、多行 VALUES、IF [NOT] EXISTS
|
|
12
|
+
* 与其它库的差异:表别名不写 AS;参数是 :1、:2;空字符串就是 NULL;没有 TIME 类型(存成 VARCHAR2(12) 的文字)。
|
|
13
|
+
* 会话的日期格式设成 ISO,日期、时间戳按文字读出再由列的 codec 解码(与 MySQL、PG 的口径一致,不受 Node 的本地时区影响)。
|
|
14
|
+
*/
|
|
15
|
+
import oracledb from 'oracledb';
|
|
16
|
+
import { type Adapter, type Without } from '@zerodep-dev/easy-query-ts';
|
|
17
|
+
import { type OracleVersion } from './dialect.ts';
|
|
18
|
+
export { OracleDialect, type OracleVersion } from './dialect.ts';
|
|
19
|
+
export interface OracleOptions {
|
|
20
|
+
/** 服务器版本:按它选写法,默认最新(23ai) */
|
|
21
|
+
readonly version?: OracleVersion;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 连接池:建池时给 sessionCallback 设好会话的日期格式与时区(见 oracleSession),
|
|
25
|
+
* `oracledb.createPool({ …, sessionCallback: oracleSession })`
|
|
26
|
+
*/
|
|
27
|
+
export declare function oracle(pool: oracledb.Pool, options?: OracleOptions): Adapter<Without<'returning'>>;
|
|
28
|
+
export declare namespace oracle {
|
|
29
|
+
var detect: (pool: oracledb.Pool) => Promise<Adapter<Without<'returning'>>>;
|
|
30
|
+
}
|
|
31
|
+
/** 建池时的 sessionCallback:日期、时间戳的会话格式设成 ISO、时区 UTC(核心按 UTC 文字读写日期时间) */
|
|
32
|
+
export declare function oracleSession(conn: oracledb.Connection, _requested: string, done: (error?: Error) => void): void;
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,OAAO,EAKb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAuJjE,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,MAAM,CACpB,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAK/B;yBARe,MAAM;uBAWO,QAAQ,CAAC,IAAI,KAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;;AAYnF,sEAAsE;AACtE,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,CAAC,UAAU,EACzB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,GAC5B,IAAI,CASN"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oracle Database,驱动用 oracledb 的 Thin 模式(纯 JS,不装 Instant Client)。按服务器版本渲染:
|
|
3
|
+
* ```ts
|
|
4
|
+
* import oracledb from 'oracledb'
|
|
5
|
+
* const pool = await oracledb.createPool({ user, password, connectString: 'host:1521/FREEPDB1' })
|
|
6
|
+
* const db = createDb({ schema, adapter: oracle(pool) }) // 默认按最新(23ai)
|
|
7
|
+
* const old = createDb({ schema, adapter: oracle(pool, { version: '11.2' }) }) // ROWNUM 分页、NUMBER(1) 布尔
|
|
8
|
+
* ```
|
|
9
|
+
* 版本门槛(低于时退回旧写法,没有旧写法就报错并说明要哪个版本):
|
|
10
|
+
* - 12.1:OFFSET … FETCH 分页(之前用 ROWNUM 包两层)、IDENTITY 列、LISTAGG 之外的 JSON_VALUE 等
|
|
11
|
+
* - 23:SQL 的 BOOLEAN(条件能直接当值、布尔列能直接当条件、BOOLEAN 列类型)、多行 VALUES、IF [NOT] EXISTS
|
|
12
|
+
* 与其它库的差异:表别名不写 AS;参数是 :1、:2;空字符串就是 NULL;没有 TIME 类型(存成 VARCHAR2(12) 的文字)。
|
|
13
|
+
* 会话的日期格式设成 ISO,日期、时间戳按文字读出再由列的 codec 解码(与 MySQL、PG 的口径一致,不受 Node 的本地时区影响)。
|
|
14
|
+
*/
|
|
15
|
+
import oracledb from 'oracledb';
|
|
16
|
+
import {} from '@zerodep-dev/easy-query-ts';
|
|
17
|
+
import { OracleDialect } from './dialect.js';
|
|
18
|
+
export { OracleDialect } from './dialect.js';
|
|
19
|
+
// ---- 驱动 ----
|
|
20
|
+
const SESSION_FORMATS = [
|
|
21
|
+
`ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'`,
|
|
22
|
+
`ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF3'`,
|
|
23
|
+
`ALTER SESSION SET TIME_ZONE = '+00:00'`,
|
|
24
|
+
];
|
|
25
|
+
/** 驱动按本地时区造出的 Date → 'YYYY-MM-DD HH:MM:SS.mmm'(库里存的不带时区的时刻,核心按 UTC 读) */
|
|
26
|
+
function wallClock(d) {
|
|
27
|
+
const p = (n, w = 2) => String(n).padStart(w, '0');
|
|
28
|
+
return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}.${p(d.getMilliseconds(), 3)}`;
|
|
29
|
+
}
|
|
30
|
+
/** 读出的值:日期、数字、大文本按文字(数字精度、日期时区都不经过 JS 的转换),二进制按 Buffer */
|
|
31
|
+
function fetchInfo() {
|
|
32
|
+
return {
|
|
33
|
+
outFormat: oracledb.OUT_FORMAT_OBJECT,
|
|
34
|
+
fetchTypeHandler: (meta) => {
|
|
35
|
+
switch (meta.dbType) {
|
|
36
|
+
// 不带时区的 DATE / TIMESTAMP:驱动按 Node 的本地时区造 Date,取回本地的各部分就是库里存的墙上时间
|
|
37
|
+
case oracledb.DB_TYPE_DATE:
|
|
38
|
+
case oracledb.DB_TYPE_TIMESTAMP:
|
|
39
|
+
return { converter: (v) => (v instanceof Date ? wallClock(v) : null) };
|
|
40
|
+
case oracledb.DB_TYPE_TIMESTAMP_TZ:
|
|
41
|
+
case oracledb.DB_TYPE_TIMESTAMP_LTZ:
|
|
42
|
+
return { converter: (v) => (v instanceof Date ? v.toISOString() : null) };
|
|
43
|
+
case oracledb.DB_TYPE_NUMBER:
|
|
44
|
+
case oracledb.DB_TYPE_CLOB:
|
|
45
|
+
case oracledb.DB_TYPE_NCLOB:
|
|
46
|
+
return { type: oracledb.STRING };
|
|
47
|
+
case oracledb.DB_TYPE_BLOB:
|
|
48
|
+
return { type: oracledb.BUFFER };
|
|
49
|
+
case oracledb.DB_TYPE_JSON:
|
|
50
|
+
return { converter: (v) => (v === null ? null : JSON.stringify(v)) };
|
|
51
|
+
default:
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
class OracleSession {
|
|
58
|
+
connection;
|
|
59
|
+
autoCommit;
|
|
60
|
+
constructor(connection, autoCommit) {
|
|
61
|
+
this.connection = connection;
|
|
62
|
+
this.autoCommit = autoCommit;
|
|
63
|
+
}
|
|
64
|
+
async query(sql, params) {
|
|
65
|
+
const { conn, release } = await this.connection();
|
|
66
|
+
try {
|
|
67
|
+
// INSERT … RETURNING 主键 INTO :eq_id:取输出变量当成一行返回
|
|
68
|
+
if (/\bINTO :eq_id$/.test(sql)) {
|
|
69
|
+
const result = await conn.execute(sql, [...params.map(bindValue), { dir: oracledb.BIND_OUT, type: oracledb.STRING }], {
|
|
70
|
+
autoCommit: this.autoCommit,
|
|
71
|
+
});
|
|
72
|
+
const out = result.outBinds;
|
|
73
|
+
return [{ eq_id: out[out.length - 1][0] }];
|
|
74
|
+
}
|
|
75
|
+
const result = await conn.execute(sql, params.map(bindValue), fetchInfo());
|
|
76
|
+
return result.rows ?? [];
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await release();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async execute(sql, params) {
|
|
83
|
+
const { conn, release } = await this.connection();
|
|
84
|
+
try {
|
|
85
|
+
const result = await conn.execute(sql, params.map(bindValue), {
|
|
86
|
+
autoCommit: this.autoCommit,
|
|
87
|
+
});
|
|
88
|
+
// 方言把多行插入写成匿名块里的逐行 INSERT:块不报告行数,成功就是每行一行
|
|
89
|
+
if (/^BEGIN INSERT INTO /.test(sql))
|
|
90
|
+
return { affected: sql.match(/\bINSERT INTO /g).length, insertId: undefined };
|
|
91
|
+
return { affected: result.rowsAffected ?? 0, insertId: undefined };
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
await release();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** JS 值 → 绑定值:bigint 写成文字,Uint8Array 写成 Buffer */
|
|
99
|
+
function bindValue(value) {
|
|
100
|
+
if (typeof value === 'bigint')
|
|
101
|
+
return value.toString();
|
|
102
|
+
if (value instanceof Uint8Array && !Buffer.isBuffer(value))
|
|
103
|
+
return Buffer.from(value);
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
const ISOLATION = {
|
|
107
|
+
'read uncommitted': 'READ COMMITTED',
|
|
108
|
+
'read committed': 'READ COMMITTED',
|
|
109
|
+
'repeatable read': 'SERIALIZABLE',
|
|
110
|
+
serializable: 'SERIALIZABLE',
|
|
111
|
+
};
|
|
112
|
+
class OracleDriver extends OracleSession {
|
|
113
|
+
pool;
|
|
114
|
+
constructor(pool) {
|
|
115
|
+
super(async () => {
|
|
116
|
+
const conn = await pool.getConnection();
|
|
117
|
+
return { conn, release: () => conn.close() };
|
|
118
|
+
}, true);
|
|
119
|
+
this.pool = pool;
|
|
120
|
+
}
|
|
121
|
+
async transaction(work, options) {
|
|
122
|
+
const conn = await this.pool.getConnection();
|
|
123
|
+
try {
|
|
124
|
+
if (options?.readOnly)
|
|
125
|
+
await conn.execute('SET TRANSACTION READ ONLY');
|
|
126
|
+
else if (options?.isolation)
|
|
127
|
+
await conn.execute(`SET TRANSACTION ISOLATION LEVEL ${ISOLATION[options.isolation]}`);
|
|
128
|
+
try {
|
|
129
|
+
const result = await work(new OracleSession(async () => ({ conn, release: async () => undefined }), false));
|
|
130
|
+
await conn.commit();
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
await conn.rollback();
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
await conn.close();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 连接池:建池时给 sessionCallback 设好会话的日期格式与时区(见 oracleSession),
|
|
145
|
+
* `oracledb.createPool({ …, sessionCallback: oracleSession })`
|
|
146
|
+
*/
|
|
147
|
+
export function oracle(pool, options = {}) {
|
|
148
|
+
return {
|
|
149
|
+
dialect: new OracleDialect({ version: options.version }),
|
|
150
|
+
driver: new OracleDriver(pool),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/** 连上库读出服务器版本(如 23.5.0.24.7)再建 adapter,部署到 11g 还是 23ai 都自动选对写法 */
|
|
154
|
+
oracle.detect = async (pool) => {
|
|
155
|
+
const conn = await pool.getConnection();
|
|
156
|
+
try {
|
|
157
|
+
return {
|
|
158
|
+
dialect: new OracleDialect({ version: conn.oracleServerVersionString }),
|
|
159
|
+
driver: new OracleDriver(pool),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
await conn.close();
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
/** 建池时的 sessionCallback:日期、时间戳的会话格式设成 ISO、时区 UTC(核心按 UTC 文字读写日期时间) */
|
|
167
|
+
export function oracleSession(conn, _requested, done) {
|
|
168
|
+
// 驱动要的是回调形式:依次执行,完成或出错时调 done
|
|
169
|
+
SESSION_FORMATS.reduce((prev, sql) => prev.then(() => conn.execute(sql)), Promise.resolve()).then(() => done(), (error) => done(error));
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,61 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zerodep-dev/easy-query-ts-oracle",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Oracle dialect and driver adapter (oracledb Thin mode) for @zerodep-dev/easy-query-ts, rendering per server version",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"author": "lionheart (https://github.com/kenconnet666)",
|
|
7
|
+
"homepage": "https://github.com/kenconnet666/easy-query-ts#readme",
|
|
8
|
+
"bugs": {
|
|
9
|
+
"url": "https://github.com/kenconnet666/easy-query-ts/issues"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/kenconnet666/easy-query-ts.git",
|
|
14
|
+
"directory": "packages/oracle"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"oracle",
|
|
18
|
+
"oracledb",
|
|
19
|
+
"orm",
|
|
20
|
+
"easy-query"
|
|
21
|
+
],
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"@easy-query-ts/source": "./src/index.ts",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"default": "./dist/index.js"
|
|
27
|
+
},
|
|
28
|
+
"./dialect": {
|
|
29
|
+
"@easy-query-ts/source": "./src/dialect.ts",
|
|
30
|
+
"types": "./dist/dialect.d.ts",
|
|
31
|
+
"default": "./dist/dialect.js"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"src"
|
|
37
|
+
],
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@zerodep-dev/easy-query-ts": "^0.2.0",
|
|
43
|
+
"oracledb": "^6.0.0 || ^7.0.0"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@zerodep-dev/easy-query-ts": "0.2.0",
|
|
47
|
+
"@zerodep-dev/easy-query-ts-test": "0.2.0",
|
|
48
|
+
"oracledb": "7.0.1",
|
|
49
|
+
"@types/oracledb": "7.0.3"
|
|
50
|
+
},
|
|
51
|
+
"type": "module",
|
|
52
|
+
"sideEffects": false,
|
|
53
|
+
"peerDependenciesMeta": {
|
|
54
|
+
"oracledb": {
|
|
55
|
+
"optional": true
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "tsc -b tsconfig.build.json"
|
|
60
|
+
}
|
|
6
61
|
}
|