MS - SQL 에서 사용하는 변수테이블 처럼 오라클에서도 비슷하게 사용할 수 있는 임시테이블 같은걸 사용하고 싶은데
동시적으로 테이블을 INSERT UPDATE DELETE 시 영향 안받게 독립적으로 사용 할 수 있었으면 좋겠어요~
함수안에서 사용하려고 하는데 괜찮은게 있을까요?
1 2 3 4 5 6 7 | DECLARE @NA_TABLE TABLE ( AAA VARCHAR (200), BBB INT , CCC INT , DDD VARCHAR (100)); INSERT INTO @NA_TABLE (AAA) VALUES ( '홍길동' , 100, 200, '승리' ); UPDATE @NA_TABLE SET AAA = '고길동' ; |
오라클 임시테이블은 MSSQL 과 다르게 함수 안에서 선언하는게 아니라
미리 만들어 두고 일반 테이블처럼 사용하기만 하면 됩니다.
입력된 자료는 커밋시 클리어 됩니다.
http://wiki.gurubee.net/pages/viewpage.action?pageId=28117339
1 | 쿼리 올립니다. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | CREATE FUNCTION [dbo].[FN_GET_SPLIT_TABLE_STR] ( @vList VARCHAR (1000) , @vDelim VARCHAR (2) ) RETURNS @Arrary TABLE (IdxNo int identity, Value varchar (1000), PRIMARY KEY (IdxNo)) BEGIN DECLARE @PStart INT , @PEnd int , @LenDelim tinyint, @Exit tinyint, @vStr varchar (1000) SET @PStart = 1 SET @PEnd = 1 SET @LenDelim = LEN(@vDelim) SET @Exit = 0 IF @vList IS NOT NULL AND @vList <> '' BEGIN WHILE @Exit = 0 BEGIN SET @PEnd = CHARINDEX(@vDelim, @vList, @PStart) IF @PEnd <= 0 BEGIN SET @PEnd = LEN(@vList) + 1 SET @Exit = 1 END SET @vStr = LTRIM(RTRIM( SUBSTRING (@vList, @PStart, @PEnd - @PStart))) IF @vStr <> 'NULL' INSERT INTO @Arrary (Value) VALUES (@vStr) ELSE INSERT INTO @Arrary (Value) VALUES ( NULL ) SET @PStart = @PEnd + @LenDelim END END ELSE BEGIN INSERT INTO @Arrary (Value) VALUES ( NULL ) END RETURN END |
함수나 임시테이블 없이 단일 쿼리로 작성해 봤습니다.
1 2 3 4 5 6 7 8 | SELECT SUBSTR(vList , INSTR(vDelim||vList, vDelim, 1, LEVEL ) , INSTR(vList||vDelim, vDelim, 1, LEVEL ) - INSTR(vDelim||vList, vDelim, 1, LEVEL ) ) x FROM ( SELECT 'aaa,bb,c' vList, ',' vDelim FROM dual) CONNECT BY LEVEL <= LENGTH(vList) - LENGTH( REPLACE (vList, vDelim)) + 1 ; |
글쎄요? UI 에서 어떻게 사용하는지 몰라서...
원하시는게 다음 링크가 아닐까? 생각되긴 하지만 확신은 없네요.
function에서 muti_row를 리턴받자...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | -- GTT 생성 CREATE GLOBAL TEMPORARY TABLE SYSDBA.TMP1 ( IN_NO NUMBER(5) , OUT_NO NUMBER(5) , DT TIMESTAMP DEFAULT SYSTIMESTAMP , ERR_TXT VARCHAR2(1000)) ON COMMIT PRESERVE ROWS -- transaction only --ON COMMIT DELETE ROWS -- session only ; -- GTT 확인 SELECT TEMPORARY , DURATION FROM DBA_TABLES WHERE OWNER = 'SYSDBA' AND TABLE_NAME = 'TMP1' ; -- 함수 생성 CREATE OR REPLACE FUNCTION SYSDBA.F1( NO IN NUMBER) RETURN NUMBER IS V_OUT_NO NUMBER(10) DEFAULT 0; V_ERR_TXT VARCHAR2(1000); PRAGMA AUTONOMOUS_TRANSACTION; BEGIN BEGIN V_OUT_NO := NO *1E3; INSERT INTO SYSDBA.TMP1 ( IN_NO , OUT_NO) VALUES ( NO , V_OUT_NO) ; EXCEPTION WHEN OTHERS THEN V_ERR_TXT := 'IN_NO[' || NO || '] ERROR[' ||SQLCODE||SQLERRM|| ']' ; GOTO ERROR_RETURN; END ; COMMIT ; RETURN NO *1E3; <<ERROR_RETURN>> BEGIN INSERT INTO SYSDBA.TMP1 (ERR_TXT) VALUES (V_ERR_TXT) ; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE||SQLERRM); END ; COMMIT ; RETURN -99999999; END ; / SELECT SYSDBA.F1(1) FROM DUAL; SELECT * FROM SYSDBA.TMP1; SELECT SYSDBA.F1(123456789012) FROM DUAL; SELECT * FROM SYSDBA.TMP1; |
오라클 함수내에서 GTT에 대한 DML 수행 테스트한 내역 공유드려 봅니다..