# ORACLE 18C XE ์ ์๋ฐฉ๋ฒ
(๋์ ๊ฒฝ์ฐ ํ์ฌ ๋คํธ์ํฌ์์ 127.0.0.1์ด ์๋๋ผ ์ ํํ ip๋ฅผ ์
๋ ฅํด์ ๋จ)
https://www.youtube.com/watch?v=jMzhxbiFXtM
sqlplus / as sysdba
SELECT name, open_mode, cdb FROM v$database;
show pdbs;
exit
lsnrctl status (์ค๋ผํด์ ServiceNameํ์ธํ๊ธฐ)
services.msc oracle์ด ์ผ์ ธ์๋์ง ํ์ธํ๊ธฐ
C:\app\f5074\product\18.0.0\dbhomeXE\network\admin\tnsnames.ora SERVICE_NAMEํ์ธํ๊ธฐ
# ์ค๋ผํด sqlํ์ผ ์ํฌํธ ๋ฐฉ๋ฒ
https://enspring.tistory.com/517
https://blog.naver.com/PostView.nhn?blogId=kimdj217&logNo=221405032563&parentCategoryNo=&categoryNo=34&viewDate=&isShowPopularPosts=false&from=postView
cmd ์์ sqlplus system
@C:\Users\f5074\Documents\ex.sql
# 1๋ถ๋จ์๋ก ๋ ์ง ์์ฑ
SELECT TO_CHAR(TO_DATE(START_DTTM, 'YYYYMMDDHH24MI') + (((LEVEL / 60)) / 24), 'YYYYMMDDHH24MI') TIME_STR
FROM (
SELECT '202012291300' AS START_DTTM
, '202012301430' AS END_DTTM
FROM DUAL
) connect BY TO_DATE(START_DTTM, 'YYYYMMDDHH24MI') + (((LEVEL / 60)) / 24) <= TO_DATE(END_DTTM, 'YYYYMMDDHH24MI');
# x์ผ ๋จ์๋ก ๋ ์ง ์์ฑ
SELECT TO_CHAR(DUM_DAYS, 'YYYYMMDD') DUM_DAYS
FROM (
SELECT TO_DATE('20200101', 'YYYYMMDD') - 1 + ROWNUM AS DUM_DAYS
FROM ALL_OBJECTS
WHERE TO_DATE('20200101', 'YYYYMMDD') - 1 + ROWNUM < TO_DATE('20200120', 'YYYYMMDD')
)
WHERE TO_CHAR(DUM_DAYS, 'D') = '7'
# X์ผ ๋จ์ ํ์ฉ
WITH TB_DATE AS (
SELECT TO_CHAR(DUM_DAYS, 'YYYYMMDD') DUM_DAYS
FROM (
SELECT TO_DATE('20200101', 'YYYYMMDD') - 1 + ROWNUM AS DUM_DAYS
FROM ALL_OBJECTS
WHERE TO_DATE('20200101', 'YYYYMMDD') - 1 + ROWNUM <= TO_DATE('20200120', 'YYYYMMDD')
)
), TB_CODE AS(
SELECT GENE_CD_DESC
FROM T_CD_GENE_DATA
WHERE 1 = 1
AND GENE_DV = 'STAT_EQP_SET'
)
SELECT TD.DUM_DAYS, TC.GENE_CD_DESC
FROM TB_DATE TD, TB_CODE TC
ORDER BY DUM_DAYS
# ์ค๋น๋ฐ์ดํฐ
์ค๋น๋ฐ์ดํฐ๋ฅผ ์ฐจํธ๋ก ๋ง๋ค๋, ๊ฐ ๋ถ๋จ์๋ก ๋ฐ์ดํฐ๊ฐ ์์ด๋ ์ํฉ
์ํฉ์ ๋ฐ๋ผ ๋ถ๋จ์ ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ์ ๋น ์ง ๋ ๋น๊ฐ์ด ์๋๋ก ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ
1. ํด๋ผ์ด์ธํธ์์ ์์ ๊ฒฝ์ฐ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ํํ๋ก ๊ตฌํ
2. ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ๋ง๋ค์ด์ฃผ๋ ๋ฐฉ๋ฒ
3. ์ค๋น์์ ์ธก์ ํ๋ ํญ๋ชฉ๋ณ(ITEM_CD)๋ก ๋ ์ง๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฑํด์ผํจ
4. ๋ฐ์ดํฐ๊ฐ ์๋ ๋น๊ฐ์ ๊ฒฝ์ฐ ์ด์ ํน์ ์ดํ์ ์๋ ๋ฐ์ดํฐ๋ก ๊ฐ์ ๋ฎ์ด์์์ผ ํจ
# DBLINK
JOIN ์์ฒด๋ฅผ ์ธ๋ถ DB์์ ์ํํ๋ ค๋ฉด, /*+ DRIVING_SITE(EXT_TABLE) */ ์ ์ฌ์ฉํ๋ค.
-> ๋ณดํต ์ธ๋ถ DB์ TABLE์ด ํฐ ๊ฒฝ์ฐ, ์์ ๋ด๋ถ DB DATA ๋ฅผ ๊ทธ์ชฝ์ผ๋ก ๋ณด๋ธํ JOIN ์ดํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ ๋ฐฉ์
LEADING ๋ฑ์ ํํธ๊ฐ ์ ๋จน์๋๋? ๊ทธ๋ฅ ํ
์ด๋ธ, ๋ทฐ ์์ ๋ฐ๊พธ๊ณ ORDERED ํํธ ์ ์ฉํ๋ฉด ๋จนํ
-> Query Transformation ๋ฑ์ผ๋ก ์ธํด Query Block ์ด ๋ฐ๋์ ์์ด ๋ช
์์ ์ผ๋ก ์ด๋ฆ์ ์ง์ ํ๋ LEADING ํํธ๊ฐ ์๋จน์ ๋๊ฐ
์๋ ๊ฒ ๊ฐ๋ค. 10053 Trace ํ์ธํ๋ฉด ์ ํํ BLOCK ๋ช
์ด ๋์ค๋ ค๋?
# Dumpํ์ผ Import
1. ๋จผ์ emt.dmpํ์ผ์ C:\DEV์ ์ ์ฅ
2. cmd์์ ์์๋๋ก ์
๋ ฅ์ ํ๋ฉด ๋จ
1) C:\Users\hkedu>sqlplus "/as sysdba"
2) SQL> create user emt identified by emt default tablespace users;
3) SQL> grant connect, resource to emt;
4) SQL> create directory save as 'c:/dev';
5) SQL> grant read, write on directory save to emt;
6) SQL> exit
7) C:\Users\hkedu>impdp emt/emt directory=save file=emt.dmp
์ค๋ฅ๊ฐ ์๊ธธ ๊ฒฝ์ฐ
1) C:\Users\hkedu>sqlplus "/as sysdba"
2) SQL> drop user emt cascade;
3) SQL> drop directory save;
4) SQL> create user emt identified by emt default tablespace users;
5) SQL> grant connect, resource to emt;
6) SQL> create directory save as 'c:/dev';
7) SQL> grant read, write on directory save to emt;
8) SQL> exit
9) C:\Users\hkedu>impdp emt/emt directory=save file=emt.dmp
# ORDER BY
GROUP BY SITE, CUR_DT, EQP_DESC, EQP_NO, EQP_ID, STATUS, STATUS_D
ORDER BY SITE, CUR_DT, EQP_DESC ASC, EQP_NO, EQP_ID, STATUS, DECODE(STATUS_D, 'ChangePowder', 1, 'ChangeMold', 2, 'SampleProduction', 3)
# ์ผ,์ฃผ,์,๋ ๋จ์ ๊ฐ ๊ตฌํ๊ธฐ
๋ ์ง๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ง ํ ์ผ, ์ฃผ, ์, ๋
๋จ์๋ก GROUP BY๋ก ์ฒ๋ฆฌํ ์ ์์
SELECT TO_CHAR(TO_TIMESTAMP('20200209 13595500', 'YYYYMMDD HH24MISSFF3'), 'YYYY-MM-DD') AS YEAR_MONTH_DAYS
, TO_CHAR(TO_TIMESTAMP('20200209 13595500', 'YYYYMMDD HH24MISSFF3'), 'YYYY-WW') || ' W' AS YEAR_WEEKS
, TO_CHAR(TO_TIMESTAMP('20200209 13595500', 'YYYYMMDD HH24MISSFF3'), 'YYYY-MM') AS YEAR_MONTHS
, TO_CHAR(TO_TIMESTAMP('20200209 13595500', 'YYYYMMDD HH24MISSFF3'), 'YYYY') AS YEARS
FROM DUAL
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD')
, TO_CHAR(SYSDATE, 'YYYY-WW') || ' W'
, TO_CHAR(SYSDATE, 'YYYY-MM')
, TO_CHAR(SYSDATE, 'YYYY')
FROM DUAL
# ORA-01000์ต๋ ์ด๊ธฐ ์ปค์ ์๋ฅผ ์ด๊ณผํ์ต๋๋ค.
> ์์๊ฐ์ ์๋ฌ๋ฐ์ ์ ์ฌ์ฉํ๋ ํธ๋์ญ์
ํ
์ด๋ธ์ Lock๊ฐ ๊ฑธ๋ฆด ํ๋ฅ ์ด ๋์
SELECT SID
, USER_NAME
, COUNT(SID) CURSOR
FROM V$OPEN_CURSOR
WHERE 1 = 1
-- AND user_name = 'SCOTT'
GROUP BY SID
, USER_NAME
ORDER BY CURSOR DESC
# Procedures
##### 1. ํ
์ด๋ธ์์ฑ
CREATE TABLE TABLE3
(
COLUMN1 VARCHAR2(100)
,COLUMN2 VARCHAR2(100)
)
##### 2. ํ๋ก์์ ธ ์์ฑ
CREATE OR REPLACE PROCEDURE EX_PROC
(
PARA1 IN VARCHAR2
,PARA2 IN VARCHAR2
)
IS
RETURN_MESSAGE VARCHAR2(100) := 'test';
RETURN_MESSAGE2 VARCHAR2(100) := 'test';
BEGIN
dbms_output.put_line(RETURN_MESSAGE);
INSERT INTO TABLE3 (COLUMN1, COLUMN2) VALUES(PARA1, PARA2);
END EX_PROC;
##### 3. ์คํ (EXEC๊ฐ ์๋ ๊ฒฝ์ฐ ํ๋จ์ ๋ฐฉ์)
EXEC EX_PROC('test','test');
BEGIN
EX_PROC('test','test');
END;
# Oracle sequence
CREATE SEQUENCE TEST.SQ_ID INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999999999999 CYCLE NOCACHE NOORDER;
-- ์ํ์ค ํ์ฌ๊ฐ ๋ณ๊ฒฝ-1
DROP SEQUENCE SEQ_X;
CREATE SEQUENCE SEQ_X START WITH 10001 INCREMENT BY 1 MAXVALUE 1E28 MINVALUE 1 NOCYCLE CACHE 20 NOORDER;
-- ์ํ์ค ํ์ฌ๊ฐ ๋ณ๊ฒฝ-2
ALTER SEQUENCE SEQ_X INCREMENT BY 10000;
SELECT SEQ_X.NEXTVAL FROM DUAL;
ALTER SEQUENCE SEQ_X INCREMENT BY 1;
-- 7๋ง 8๋ง ๊ฑด์ด ๋์ด ๊ฐ ๊ฒฝ์ฐ ํ๋จ์ sequence ์ฑ๋ฅ์ด ๋ ์ข์
INSERT INTO TABLE1 (
SEQ
, INST_DTM
)
VALUES (
(SELECT NVL(MAX(TO_NUMBER(SEQ)) + 1, 1) AS SEQ FROM TABLE1)
, SYSDATE
)
-- ์ฐ๋ ์ถ๊ฐํ NEXTVAL
TO_CHAR(SYSDATE,'YYYY') || LPAD((SELECT NVL(TO_NUMBER( SUBSTR(MAX(SEQ), 5) + 1), 1) AS SEQ FROM TABLE1), 5,'0')
<selectKey resultType="java.lang.String" keyProperty="SEQ" order="BEFORE">
SELECT SQ_ID.NEXTVAL AS SEQ FROM DUAL
</selectKey>
INSERT INTO TABLE1 (
SEQ
, INST_DTM
)
VALUES (
#{SEQ}
, SYSDATE
)
# ๋ ์ง๊ด๋ จ
SELECT
TO_DATE('20220901'||'235959', 'YYYYMMDDHH24MISS')
, TO_DATE('20220901', 'YYYYMMDD') - 0.99999
, TO_DATE('20220901', 'YYYYMMDD') - 0.00001
, TO_DATE('20220901', 'YYYYMMDD') + 0.99999
, TO_DATE('20220901', 'YYYYMMDD') + 0.00001
FROM DUAL
-- ์ปฌ๋ผ์ด DATE์ธ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ๋๋ 235959๊น์ง ํ์ธํ๋๋ก ์งํํด์ผํจ
(x) AND REGISTER_DATE BETWEEN TO_DATE('20220901', 'YYYYMMDD') AND TO_DATE('20220901', 'YYYYMMDD')
(o) AND REGISTER_DATE BETWEEN TO_DATE('20220901'||'000000', 'YYYYMMDDHH24MISS') AND TO_DATE('20220901'||'235959', 'YYYYMMDDHH24MISS')
# ๊ถํ๊ด๋ จ
SELECT *
FROM DBA_TAB_PRIVS
WHERE 1 = 1
AND GRANTEE = 'TEST'
# ROWNUM ์ญ์
SELECT NUM
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY PK_KEY DESC) AS NUM
FROM TEMP
)
WHERE 1 = 1
AND NUM <= 1
# oracle function
PLS-00306: 'TEST_OBJ' ํธ์ถ ์ ์ธ์์ ๊ฐฏ์๋ ์ ํ์ด ์๋ชป๋์์ต๋๋ค function์์ object์ ๊ฐ์ ์ถ๊ฐํ ๋ types์ ์ ์ธ๋ object์ ๊ฐ์ ๊ฐ์ด ์ถ๊ฐํด์ค์ผํจ
CREATE OR REPLACE TYPE TEST_OBJ AS OBJECT
(
TEST_A VARCHAR2(15),
TEST_B VARCHAR2(7)
);
# oracle package
CREATE OR REPLACE PACKAGE TEST.PACKAGE_TEST
AS
-- ํจํค์ง์ ๋ค์ด์ฌ ํ๋ก์์ , ํจ์ ์ ์
PROCEDURE PROC_TEST;
PROCEDURE PROC_TEST2(NAME IN VARCHAR2, AGE IN NUMBER);
FUNCTION examFunc(getGender IN VARCHAR2) RETURN VARCHAR2;
END PACKAGE_TEST;
-- ํจํค์ง ๋ฐ๋ ๋ถ๋ถ
CREATE OR REPLACE PACKAGE BODY TEST.PACKAGE_TEST
AS
-- ํจํค์ง ๋ด ํ๋ก์์ , ํจ์ ๋ด์ฉ ์ ์
PROCEDURE PROC_TEST
IS
BEGIN
INSERT INTO TABLE_TEST(COL1,COL2) VALUES('TEST', 1);
END PROC_TEST;
PROCEDURE PROC_TEST2(NAME IN VARCHAR2, AGE IN NUMBER)
IS
BEGIN
INSERT INTO TABLE_TEST(COL1,COL2) VALUES(NAME, AGE);
END PROC_TEST2;
FUNCTION examFunc -- ํจ์๋ช
(getGender IN VARCHAR2) -- ํจ์ ํธ์ถ์ ๋ฐ์์ฌ ํ๋ผ๋ฏธํฐ ์ ์
RETURN VARCHAR2 -- ํจ์ ์ํ ์ ๋ฐํํ ๋ฐ์ดํฐ ํ์
IS -- ์ฌ์ฉํ ๋ณ์ ์ ์
setGender VARCHAR2(100);
BEGIN -- ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ํจ์ ์ํ
IF getGender = '๋จ' THEN setGender := '๋จ์';
ELSIF getGender = '์ฌ' THEN setGender := '์ฌ์';
ELSE setGender := '์ค๋ฅ';
END IF;
RETURN setGender; -- ๋ฐํ
END examFunc;
END PACKAGE_TEST;
# oracle procedure
-- IN ๋ณ์๋ง ์๋๊ฒฝ์ฐ ์คํ
EXEC TEST_PROC();
EXEC TEST_PROC(213, 'DDOL');
-- OUT ๋ณ์ ์๋๊ฒฝ์ฐ ์คํ
DECLARE
param1 varchar2(200);
param2 varchar2(200);
BEGIN
TEST_PROC('123', param1, param2);
END;
# https://studyingazae.tistory.com/59
# ํ ์ด๋ธ ์ปฌ๋ผ์ฐพ๊ธฐ
/ํ ์ด๋ธ ๋ด ์ปฌ๋ผ ์ฐพ๊ธฐ/ SELECT * FROM USER_TAB_COLUMNS WHERE COLUMN_NAME LIKE '%ATT_FL_GRP_ID%';
# ์ค๋ผํด
SELECT * FROM DBA_OBJECTS WHERE OWNER = 'CCIP' AND OBJECT_TYPE = 'TABLE' AND OBJECT_NAME LIKE '%MBSH%';
# oracle charset to java
SELECT LENGTHB(LTRIM(RTRIM('๋ ๋ฐฉ๊ฐํํฌ์'))) AS A11
FROM DUAL
;
SELECT *
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER = 'NLS_CHARACTERSET'
;
import java.io.UnsupportedEncodingException;
public class TestCode {
public static void main(String[] args) throws UnsupportedEncodingException{
String charset;
String test;
int length;
test = "[ 30%ํ ์ธ! ]์
ํฐ์๋ผ ํ๋ฆฌ์คํด ์ฐํ ์๋ถํฌ๋ฆผ, ์ํฐ์์ด์ง, ๋ณด์ต ํ๋ ฅ, ์ค๊ธฐ์ธํฌ ๋ฐฐ์์ก ํ์ฅํ (50ml X 1ea)";
charset = "MS949";
length = test.getBytes(charset).length;
System.out.println(charset + " length : " + length + " Bytes");
charset = "UTF-8";
length = test.getBytes(charset).length;
System.out.println(charset + " length : " + length + " Bytes");
charset = "euc-kr";
length = test.getBytes(charset).length;
System.out.println(charset +" length : " + length + " Bytes");
test = "๋ ๋ฐฉ๊ฐํํฌ์";
charset = "MS949";
length = test.getBytes(charset).length;
System.out.println(charset + " length : " + length + " Bytes");
charset = "UTF-8";
length = test.getBytes(charset).length;
System.out.println(charset + " length : " + length + " Bytes");
charset = "euc-kr";
length = test.getBytes(charset).length;
System.out.println(charset + " length : " + length + " Bytes");
}
}
# oracle merge๋ฌธ ๊ด๋ จ
๋ฐ์ดํฐ๊ฐ null์ธ๊ฒฝ์ฐ ์ฑ๋ฆฝํ์ง ์์ ์ด ๊ฒฝ์ฐ NVL ์ฒ๋ฆฌ๋ก null์ด ์๋๋๋ก ๋ณ๊ฒฝ t.DTL_ADDR = s.DTL_ADDR => and nvl(t.DTL_ADDR, '1') = nvl(s.DTL_ADDR, '1')
MERGE INTO TABLE1 T
USING (
SELECT ALLN_ORD_MST_ID
, ALLN_ORD_ID
FROM TEMP1
WHERE INST_ID = I_INTG_MEM_ID
AND ALLN_ORD_MST_ID = I_ALLN_ORD_MST_ID
) S
ON ( T.ALLN_ORD_MST_ID = S.ALLN_ORD_MST_ID
AND NVL(T.DTL_ADDR, '1') = NVL(S.DTL_ADDR, '1')
)
WHEN MATCHED THEN
UPDATE
SET T.MDF_DTM = SYSDATE
, T.MDF_ID = S.INST_ID
WHERE T.FAIL_RSN IS NULL
# oracle
SELECT *
FROM TABLE1
START WITH UPR_GRP_ID IS NULL
CONNECT BY PRIOR UPR_GRP_ID = GRP_ID
SELECT *
FROM TABLE1
START WITH UPR_GRP_ID IS NULL
CONNECT BY PRIOR GRP_ID = UPR_GRP_ID
# declare begin end
-- 1. declare begin end - PL/SQL ๊ธฐ๋ณธ์ผ๋ก ์ฟผ๋ฆฌ, ๋ฌธ๋ฒ์ ์คํํ ์ ์์ต๋๋ค
-- 2. declare [์ ์ธ๋ถ] - ๋ณ์, ์์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค
-- 3. begin [์คํ๋ถ] - ์ ์ด, ๋ฐ๋ณต๋ฌธ, ํจ์ ๋ฑ ๋ค์ํ ๋ก์ง ๊ธฐ์ ์ ์คํํฉ๋๋ค
-- 4. end [์ข
๋ฃ๋ถ] - ์คํ๋ ๋ก์ง์ ์ข
๋ฃ๋ฅผ ์ ์ธํฉ๋๋ค
-- 5. ์คํํ ๊ฒฐ๊ณผ๋ DBMS_OUTPUT์์ ํ์ธํ ์ ์์ต๋๋ค
DECLARE
TEST_NAME VARCHAR2(50); --์ด๊ธฐ ๋ณ์ ์ ์ธ
BEGIN
TEST_NAME := 'ํ
์คํธ'; --๋ณ์์ ๊ฐ ๋์
์ค์
DBMS_OUTPUT.PUT_LINE('TEST_NAME : ' || TEST_NAME); -- ๊ฒฐ๊ณผ ์ถ๋ ฅ
END;
# oracle tablespace
-- Error updating database. Cause: java.sql.SQLException: ORA-01653: TEST.TB_TEST1 ํ
์ด๋ธ์ 128(์ผ)๋ก TEST_DATA2 ํ
์ด๋ธ์คํ์ด์ค์์ ํ์ฅํ ์ ์์ต๋๋ค
-- ํ
์ด๋ธ ์คํ์ด์ค ํ์ธ
SELECT TABLE_NAME,TABLESPACE_NAME
FROM DBA_TABLES
WHERE OWNER='TEST' AND TABLE_NAME='TB_TEST1';
-- ํ
์ด๋ธ ์คํ์ด์ค์ ์ ๋ณด ํ์ธ
SELECT TABLESPACE_NAME, FILE_NAME, BYTES, AUTOEXTENSIBLE
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='TEST_DATA2';
-- ๊ฐ์ฉ์ฉ๋ ํ์ธ
SELECT DF.FILE_NAME "ํ์ผ๋ช
"
, DF.TABLESPACE_NAME "ํ
์ด๋ธ ์คํ์ด์ค๋ช
"
, TO_CHAR((DF.BYTES / 1024), '999,990,999') "์ด (KB)"
, TO_CHAR((((DF.BYTES - SUM(NVL(FS.BYTES, 0)))) / 1024), '999,990,999') "์ฌ์ฉ(KB)"
, TO_CHAR(((SUM(NVL(FS.BYTES, 0))) / 1024), '999,990,999') "๊ฐ์ฉ(KB)"
, TRUNC(((SUM(NVL(FS.BYTES, 0)) / (DF.BYTES)) * 100), 2) "๊ฐ์ฉ %"
FROM DBA_FREE_SPACE FS
RIGHT JOIN DBA_DATA_FILES DF ON FS.FILE_ID = DF.FILE_ID
WHERE 1 = 1
-- AND DF.TABLESPACE_NAME = 'TEST_DATA2'
GROUP BY DF.TABLESPACE_NAME, DF.FILE_NAME, DF.BYTES
ORDER BY DF.TABLESPACE_NAME;
# Reference
https://m.cafe.daum.net/oraclesqltuning/8ACn/28 https://lawmin.tistory.com/58
ORA-01000์ต๋ ์ด๊ธฐ ์ปค์ ์๋ฅผ ์ด๊ณผํ์ต๋๋ค. https://serendipity.tistory.com/65
oracle package: https://wakestand.tistory.com/173
โ - mysql - oracle-index โ