Skip to content

Commit b53968e

Browse files
committed
Added Oracle to supported databases
1 parent 510754d commit b53968e

8 files changed

Lines changed: 530 additions & 3 deletions

File tree

config/dbinfo.json

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,20 @@
7575
"options": {
7676
"mode": null
7777
}
78+
},
79+
"oracleDB": {
80+
"type": "oracle",
81+
"user": "system",
82+
"password": "oracle",
83+
"server": "localhost",
84+
"port": 1521,
85+
"serviceName": "XEPDB1",
86+
"options": {
87+
"poolMin": 0,
88+
"poolMax": 4,
89+
"poolIncrement": 1,
90+
"queueTimeout": 30000,
91+
"stmtCacheSize": 30
92+
}
7893
}
79-
}
94+
}

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
"node_modules/tedious/**/*",
3232
"node_modules/mysql2/**/*",
3333
"node_modules/pg/**/*",
34-
"node_modules/better-sqlite3/**/*"
34+
"node_modules/better-sqlite3/**/*",
35+
"node_modules/oracledb/**/*"
3536
],
3637
"targets": [
3738
"node18-win-x64"
@@ -45,6 +46,7 @@
4546
"mssql": "^10.0.0",
4647
"mysql2": "^3.4.0",
4748
"pg": "^8.16.3",
49+
"oracledb": "^6.6.0",
4850
"xml2js": "^0.6.2",
4951
"yargs": "^17.7.2"
5052
},

queries/oracle-test.xml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<queries>
3+
<excel
4+
output="output/oracle_test_report_${DATE.KST:YYYYMMDD_HHmmss}.xlsx"
5+
db="oracleDB"
6+
style="modern">
7+
</excel>
8+
9+
<sheet name="Session" db="oracleDB">
10+
<query>
11+
SELECT USER as username, SYS_CONTEXT('USERENV','DB_NAME') as db_name, SYSDATE as sysdate FROM dual
12+
</query>
13+
</sheet>
14+
15+
<sheet name="Tables" db="oracleDB">
16+
<query>
17+
SELECT
18+
owner,
19+
table_name,
20+
num_rows,
21+
blocks,
22+
to_char(last_analyzed,'YYYY-MM-DD HH24:MI:SS') as last_analyzed
23+
FROM all_tables
24+
WHERE owner = USER
25+
ORDER BY table_name
26+
FETCH FIRST 50 ROWS ONLY
27+
</query>
28+
</sheet>
29+
30+
<sheet name="Customers" db="oracleDB">
31+
<query>
32+
SELECT
33+
c.CustomerID,
34+
c.CustomerCode,
35+
c.CustomerName,
36+
c.City,
37+
c.Region,
38+
c.Country,
39+
c.CreditLimit,
40+
c.IsActive,
41+
to_char(c.CreatedDate, 'YYYY-MM-DD HH24:MI:SS') as CreatedDate
42+
FROM Customers c
43+
ORDER BY c.CustomerID
44+
FETCH FIRST 100 ROWS ONLY
45+
</query>
46+
</sheet>
47+
</queries>
Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
-- ========================================
2+
-- 샘플 테이블 생성 스크립트
3+
-- Oracle Database용 (12c 이상 권장)
4+
-- ========================================
5+
6+
-- 주의: 스키마는 현재 접속 사용자로 생성됩니다. 필요 시 다른 스키마로 변경하세요.
7+
8+
-- 기존 객체 삭제 (존재 시)
9+
BEGIN EXECUTE IMMEDIATE 'DROP VIEW vw_OrderSummary'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
10+
/
11+
BEGIN EXECUTE IMMEDIATE 'DROP TABLE OrderDetails CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
12+
/
13+
BEGIN EXECUTE IMMEDIATE 'DROP TABLE Orders CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
14+
/
15+
BEGIN EXECUTE IMMEDIATE 'DROP TABLE Products CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
16+
/
17+
BEGIN EXECUTE IMMEDIATE 'DROP TABLE Employees CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
18+
/
19+
BEGIN EXECUTE IMMEDIATE 'DROP TABLE Customers CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
20+
/
21+
22+
-- ========================================
23+
-- 1. Customers 테이블
24+
-- ========================================
25+
CREATE TABLE Customers (
26+
CustomerID NUMBER GENERATED BY DEFAULT AS IDENTITY,
27+
CustomerCode VARCHAR2(20) NOT NULL,
28+
CustomerName VARCHAR2(100) NOT NULL,
29+
ContactName VARCHAR2(50),
30+
Email VARCHAR2(100),
31+
Phone VARCHAR2(20),
32+
Address VARCHAR2(200),
33+
City VARCHAR2(50),
34+
Region VARCHAR2(50),
35+
PostalCode VARCHAR2(10),
36+
Country VARCHAR2(50),
37+
CustomerType VARCHAR2(20) DEFAULT 'Regular',
38+
CreditLimit NUMBER(15,2) DEFAULT 0,
39+
IsActive NUMBER(1) DEFAULT 1,
40+
CreatedDate TIMESTAMP DEFAULT SYSTIMESTAMP,
41+
LastUpdated TIMESTAMP DEFAULT SYSTIMESTAMP,
42+
CONSTRAINT PK_Customers PRIMARY KEY (CustomerID),
43+
CONSTRAINT UK_Customers_Code UNIQUE (CustomerCode)
44+
);
45+
46+
CREATE INDEX IX_Customers_Name ON Customers (CustomerName);
47+
CREATE INDEX IX_Customers_City ON Customers (City);
48+
CREATE INDEX IX_Customers_Region ON Customers (Region);
49+
CREATE INDEX IX_Customers_Type ON Customers (CustomerType);
50+
51+
-- LastUpdated 자동 업데이트 트리거
52+
CREATE OR REPLACE TRIGGER trg_customers_modtime
53+
BEFORE UPDATE ON Customers
54+
FOR EACH ROW
55+
BEGIN
56+
:NEW.LastUpdated := SYSTIMESTAMP;
57+
END;
58+
/
59+
60+
-- ========================================
61+
-- 2. Orders 테이블
62+
-- ========================================
63+
CREATE TABLE Orders (
64+
OrderID NUMBER GENERATED BY DEFAULT AS IDENTITY,
65+
OrderNumber VARCHAR2(30) NOT NULL,
66+
CustomerID NUMBER NOT NULL,
67+
OrderDate TIMESTAMP NOT NULL,
68+
RequiredDate TIMESTAMP,
69+
ShippedDate TIMESTAMP,
70+
OrderStatus VARCHAR2(20) DEFAULT 'Pending',
71+
SubTotal NUMBER(15,2) DEFAULT 0,
72+
TaxAmount NUMBER(15,2) DEFAULT 0,
73+
TotalAmount NUMBER(15,2) DEFAULT 0,
74+
PaymentMethod VARCHAR2(30),
75+
PaymentStatus VARCHAR2(20) DEFAULT 'Unpaid',
76+
EmployeeID NUMBER,
77+
Notes VARCHAR2(500),
78+
CreatedDate TIMESTAMP DEFAULT SYSTIMESTAMP,
79+
LastUpdated TIMESTAMP DEFAULT SYSTIMESTAMP,
80+
CONSTRAINT PK_Orders PRIMARY KEY (OrderID),
81+
CONSTRAINT UK_Orders_Number UNIQUE (OrderNumber),
82+
CONSTRAINT FK_Orders_Customers FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
83+
);
84+
85+
CREATE INDEX IX_Orders_CustomerID ON Orders (CustomerID);
86+
CREATE INDEX IX_Orders_OrderDate ON Orders (OrderDate);
87+
CREATE INDEX IX_Orders_Status ON Orders (OrderStatus);
88+
CREATE INDEX IX_Orders_PaymentStatus ON Orders (PaymentStatus);
89+
CREATE INDEX IX_Orders_ShippedDate ON Orders (ShippedDate);
90+
91+
CREATE OR REPLACE TRIGGER trg_orders_modtime
92+
BEFORE UPDATE ON Orders
93+
FOR EACH ROW
94+
BEGIN
95+
:NEW.LastUpdated := SYSTIMESTAMP;
96+
END;
97+
/
98+
99+
-- ========================================
100+
-- 3. Products 테이블
101+
-- ========================================
102+
CREATE TABLE Products (
103+
ProductID NUMBER GENERATED BY DEFAULT AS IDENTITY,
104+
ProductCode VARCHAR2(20) NOT NULL,
105+
ProductName VARCHAR2(100) NOT NULL,
106+
Category VARCHAR2(50),
107+
UnitPrice NUMBER(15,2) DEFAULT 0,
108+
UnitsInStock NUMBER DEFAULT 0,
109+
UnitsOnOrder NUMBER DEFAULT 0,
110+
ReorderLevel NUMBER DEFAULT 0,
111+
Discontinued NUMBER(1) DEFAULT 0,
112+
Description CLOB,
113+
CreatedDate TIMESTAMP DEFAULT SYSTIMESTAMP,
114+
LastUpdated TIMESTAMP DEFAULT SYSTIMESTAMP,
115+
CONSTRAINT PK_Products PRIMARY KEY (ProductID),
116+
CONSTRAINT UK_Products_Code UNIQUE (ProductCode)
117+
);
118+
119+
CREATE INDEX IX_Products_Name ON Products (ProductName);
120+
CREATE INDEX IX_Products_Category ON Products (Category);
121+
CREATE INDEX IX_Products_Price ON Products (UnitPrice);
122+
123+
CREATE OR REPLACE TRIGGER trg_products_modtime
124+
BEFORE UPDATE ON Products
125+
FOR EACH ROW
126+
BEGIN
127+
:NEW.LastUpdated := SYSTIMESTAMP;
128+
END;
129+
/
130+
131+
-- ========================================
132+
-- 4. OrderDetails 테이블
133+
-- ========================================
134+
CREATE TABLE OrderDetails (
135+
OrderDetailID NUMBER GENERATED BY DEFAULT AS IDENTITY,
136+
OrderID NUMBER NOT NULL,
137+
ProductID NUMBER NOT NULL,
138+
UnitPrice NUMBER(15,2) NOT NULL,
139+
Quantity NUMBER NOT NULL,
140+
Discount NUMBER(5,2) DEFAULT 0,
141+
LineTotal NUMBER(15,2) GENERATED ALWAYS AS (UnitPrice * Quantity * (1 - Discount/100)) VIRTUAL,
142+
CreatedDate TIMESTAMP DEFAULT SYSTIMESTAMP,
143+
CONSTRAINT PK_OrderDetails PRIMARY KEY (OrderDetailID),
144+
CONSTRAINT FK_OrderDetails_Orders FOREIGN KEY (OrderID) REFERENCES Orders(OrderID) ON DELETE CASCADE,
145+
CONSTRAINT FK_OrderDetails_Products FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
146+
);
147+
148+
CREATE INDEX IX_OrderDetails_OrderID ON OrderDetails (OrderID);
149+
CREATE INDEX IX_OrderDetails_ProductID ON OrderDetails (ProductID);
150+
151+
-- ========================================
152+
-- 5. Employees 테이블
153+
-- ========================================
154+
CREATE TABLE Employees (
155+
EmployeeID NUMBER GENERATED BY DEFAULT AS IDENTITY,
156+
EmployeeCode VARCHAR2(20) NOT NULL,
157+
FirstName VARCHAR2(50) NOT NULL,
158+
LastName VARCHAR2(50) NOT NULL,
159+
Title VARCHAR2(50),
160+
BirthDate DATE,
161+
HireDate DATE,
162+
Email VARCHAR2(100),
163+
Phone VARCHAR2(20),
164+
Department VARCHAR2(50),
165+
Salary NUMBER(15,2),
166+
ReportsTo NUMBER,
167+
IsActive NUMBER(1) DEFAULT 1,
168+
CreatedDate TIMESTAMP DEFAULT SYSTIMESTAMP,
169+
LastUpdated TIMESTAMP DEFAULT SYSTIMESTAMP,
170+
CONSTRAINT PK_Employees PRIMARY KEY (EmployeeID),
171+
CONSTRAINT UK_Employees_Code UNIQUE (EmployeeCode),
172+
CONSTRAINT FK_Employees_ReportsTo FOREIGN KEY (ReportsTo) REFERENCES Employees(EmployeeID)
173+
);
174+
175+
CREATE INDEX IX_Employees_Name ON Employees (LastName, FirstName);
176+
CREATE INDEX IX_Employees_Department ON Employees (Department);
177+
CREATE INDEX IX_Employees_ReportsTo ON Employees (ReportsTo);
178+
179+
CREATE OR REPLACE TRIGGER trg_employees_modtime
180+
BEFORE UPDATE ON Employees
181+
FOR EACH ROW
182+
BEGIN
183+
:NEW.LastUpdated := SYSTIMESTAMP;
184+
END;
185+
/
186+
187+
-- ========================================
188+
-- 6. 주문 요약 뷰
189+
-- ========================================
190+
CREATE OR REPLACE VIEW vw_OrderSummary AS
191+
SELECT
192+
o.OrderID,
193+
o.OrderNumber,
194+
o.OrderDate,
195+
c.CustomerCode,
196+
c.CustomerName,
197+
c.City AS CustomerCity,
198+
c.Region AS CustomerRegion,
199+
o.OrderStatus,
200+
o.PaymentStatus,
201+
o.TotalAmount,
202+
(SELECT COUNT(*) FROM OrderDetails od WHERE od.OrderID = o.OrderID) AS ItemCount,
203+
(SELECT NVL(SUM(od.Quantity),0) FROM OrderDetails od WHERE od.OrderID = o.OrderID) AS TotalQuantity,
204+
o.CreatedDate
205+
FROM Orders o
206+
JOIN Customers c ON o.CustomerID = c.CustomerID;
207+
208+
-- 완료 메시지
209+
PROMPT 'Oracle용 샘플 테이블 생성 완료'
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
-- ========================================
2+
-- 샘플 테이블/뷰 삭제 스크립트 (Oracle)
3+
-- ========================================
4+
BEGIN EXECUTE IMMEDIATE 'DROP VIEW vw_OrderSummary'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
5+
/
6+
BEGIN EXECUTE IMMEDIATE 'DROP TABLE OrderDetails CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
7+
/
8+
BEGIN EXECUTE IMMEDIATE 'DROP TABLE Orders CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
9+
/
10+
BEGIN EXECUTE IMMEDIATE 'DROP TABLE Products CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
11+
/
12+
BEGIN EXECUTE IMMEDIATE 'DROP TABLE Employees CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
13+
/
14+
BEGIN EXECUTE IMMEDIATE 'DROP TABLE Customers CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;
15+
/
16+
PROMPT 'Oracle용 샘플 객체 삭제 완료'
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
-- ========================================
2+
-- 샘플 데이터 입력 스크립트 (Oracle)
3+
-- ========================================
4+
5+
-- Customers
6+
INSERT INTO Customers (CustomerCode, CustomerName, ContactName, Email, Phone, City, Region, Country, CustomerType, CreditLimit, IsActive)
7+
VALUES ('CUST001','Acme Corp','John Doe','john@acme.com','+1-555-1001','New York','NY','USA','Regular',10000,1);
8+
INSERT INTO Customers (CustomerCode, CustomerName, ContactName, Email, Phone, City, Region, Country, CustomerType, CreditLimit, IsActive)
9+
VALUES ('CUST002','Globex','Jane Smith','jane@globex.com','+1-555-1002','Los Angeles','CA','USA','VIP',20000,1);
10+
INSERT INTO Customers (CustomerCode, CustomerName, ContactName, Email, Phone, City, Region, Country, CustomerType, CreditLimit, IsActive)
11+
VALUES ('CUST003','Initech','Bob Martin','bob@initech.com','+1-555-1003','Seattle','WA','USA','Regular',15000,1);
12+
13+
-- Products
14+
INSERT INTO Products (ProductCode, ProductName, Category, UnitPrice, UnitsInStock)
15+
VALUES ('P-100','Laptop 14"','Electronics',1200,50);
16+
INSERT INTO Products (ProductCode, ProductName, Category, UnitPrice, UnitsInStock)
17+
VALUES ('P-101','Wireless Mouse','Electronics',25,500);
18+
INSERT INTO Products (ProductCode, ProductName, Category, UnitPrice, UnitsInStock)
19+
VALUES ('P-102','Office Chair','Furniture',180,120);
20+
21+
-- Employees
22+
INSERT INTO Employees (EmployeeCode, FirstName, LastName, Title, Department, Salary, IsActive)
23+
VALUES ('E-001','Alice','Kim','Manager','Sales',6500,1);
24+
INSERT INTO Employees (EmployeeCode, FirstName, LastName, Title, Department, Salary, IsActive)
25+
VALUES ('E-002','Brian','Lee','Engineer','IT',7200,1);
26+
INSERT INTO Employees (EmployeeCode, FirstName, LastName, Title, Department, Salary, IsActive)
27+
VALUES ('E-003','Cathy','Park','Analyst','Finance',5800,1);
28+
29+
-- Orders
30+
INSERT INTO Orders (OrderNumber, CustomerID, OrderDate, OrderStatus, SubTotal, TaxAmount, TotalAmount, PaymentStatus)
31+
VALUES ('SO-20240101-001', 1, TO_TIMESTAMP('2024-01-01 10:00:00','YYYY-MM-DD HH24:MI:SS'), 'Pending', 1225, 122.5, 1347.5, 'Unpaid');
32+
INSERT INTO Orders (OrderNumber, CustomerID, OrderDate, OrderStatus, SubTotal, TaxAmount, TotalAmount, PaymentStatus)
33+
VALUES ('SO-20240105-002', 2, TO_TIMESTAMP('2024-01-05 15:30:00','YYYY-MM-DD HH24:MI:SS'), 'Shipped', 180, 18, 198, 'Paid');
34+
35+
-- OrderDetails
36+
INSERT INTO OrderDetails (OrderID, ProductID, UnitPrice, Quantity, Discount)
37+
VALUES (1, 1, 1200, 1, 0);
38+
INSERT INTO OrderDetails (OrderID, ProductID, UnitPrice, Quantity, Discount)
39+
VALUES (1, 2, 25, 1, 0);
40+
INSERT INTO OrderDetails (OrderID, ProductID, UnitPrice, Quantity, Discount)
41+
VALUES (2, 3, 180, 1, 0);
42+
43+
COMMIT;
44+
45+
PROMPT 'Oracle용 샘플 데이터 입력 완료'

src/database/DatabaseFactory.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const MSSQLAdapter = require('./MSSQLAdapter');
22
const MySQLAdapter = require('./MySQLAdapter');
33
const PostgreSQLAdapter = require('./PostgreSQLAdapter');
44
const SQLiteAdapter = require('./SQLiteAdapter');
5+
const OracleAdapter = require('./OracleAdapter');
56
const { getMessages } = require('../utils/messages');
67

78
/**
@@ -37,6 +38,11 @@ class DatabaseFactory {
3738
case 'sqlite3':
3839
return new SQLiteAdapter(config, language);
3940

41+
case 'oracle':
42+
case 'oracledb':
43+
case 'oci':
44+
return new OracleAdapter(config, language);
45+
4046
default:
4147
throw new Error(`${msg.unsupportedDbType} ${dbType}`);
4248
}
@@ -52,7 +58,8 @@ class DatabaseFactory {
5258
{ type: 'mysql', name: 'MySQL', defaultPort: 3306 },
5359
{ type: 'mariadb', name: 'MariaDB', defaultPort: 3306 },
5460
{ type: 'postgresql', name: 'PostgreSQL', defaultPort: 5432 },
55-
{ type: 'sqlite', name: 'SQLite', defaultPort: null }
61+
{ type: 'sqlite', name: 'SQLite', defaultPort: null },
62+
{ type: 'oracle', name: 'Oracle Database', defaultPort: 1521 }
5663
];
5764
}
5865

0 commit comments

Comments
 (0)