위의 테이블에서 row를 읽어서 다른 TR_TEST테이블에 저장을 하고싶습니다.
oracle로 프로시져는 처음만들어서 너무 ...어렵네요...ㅠㅠ
인터넷 참고하면서 쿼리를 만들어 보았는데
V_GEN VARCHAR2(6) := IDX.GB; 이부분에서 특히 오류가나는데..어떤 문제인지 도통모르겠네요 ㅠㅠ
전문가님들의 조언 요청드립니다 ㅠㅠ
오류(15,16): PLS-00103: 심볼 "VARCHAR2"를 만났습니다 다음 중 하나가 기대될 때: := . ( @ % ; 심볼이 ":=" 계속하기 위하여 "VARCHAR2"로 치환되었습니다
오류(15,28): PLS-00103: 심볼 "="를 만났습니다 다음 중 하나가 기대될 때: . ( * % & = - + ; < / > at in is mod remainder not rem <> 또는 != 또는 ~= >= and or like like2 like4 likec between || multiset member submultiset
오류(21,9): PLS-00103: 심볼 "SELECT"를 만났습니다 다음 중 하나가 기대될 때: begin function pragma procedure subtype type current cursor delete exists prior 심볼이 "begin" 계속하기 위하여 "SELECT"로 치환되었습니다
오류(42,17): PLS-00103: 심볼 "LEFT"를 만났습니다 다음 중 하나가 기대될 때: ) , with group having intersect minus order start union where connect
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 | CREATE OR REPLACE PROCEDURE PROC_TEST IS CURSOR VM_TABLE IS SELECT 'HG0301' AS GB FROM DUAL UNION SELECT 'HG0302' AS GB FROM DUAL UNION SELECT 'HG0303' AS GB FROM DUAL UNION SELECT 'HG0304' AS GB FROM DUAL UNION SELECT 'HG0305' AS GB FROM DUAL UNION SELECT 'HG0306' AS GB FROM DUAL UNION SELECT 'HG0307' AS GB FROM DUAL UNION SELECT 'HH0308' AS GB FROM DUAL UNION SELECT 'HG0309' AS GB FROM DUAL ; BEGIN FOR IDX IN VM_TABLE LOOP V_GEN VARCHAR2(6) := IDX.GB; V_VAL1 FLOAT := 0; V_VAL2 FLOAT := 0; V_VAL3 FLOAT := 0; V_VAL4 FLOAT := 0; SELECT SUM (COL1) AS COL1, SUM (COL2) AS COL2, SUM (COL3) AS COL3, SUM (COL4) AS COL4 INTO V_VAL1, V_VAL2, V_VAL3, V_VAL4 FROM ( SELECT SUBSTR(TAG_CODE, 2, 6) AS GEN, TAG_CODE, CASE WHEN SUBSTR(TAG_CODE, 12, 6) = 'OTMP02' THEN NVL(ROUND(TAG_VALUE,6), 0) ELSE 0 END AS COL1, CASE WHEN SUBSTR(TAG_CODE, 12, 6) = 'MTMP02' THEN NVL(ROUND(TAG_VALUE,6), 0) ELSE 0 END AS COL2, CASE WHEN SUBSTR(TAG_CODE, 12, 6) = 'IRAD02' THEN NVL(ROUND(TAG_VALUE,6), 0) ELSE 0 END AS COL3, CASE WHEN SUBSTR(TAG_CODE, 12, 6) = 'LRAD02' THEN NVL(ROUND(TAG_VALUE,6), 0) ELSE 0 END AS COL4, TO_CHAR(TAG_DATE, 'YYYY-MM-DD HH24:MI:SS' ) AS TAG_DATE FROM ( SELECT A.TAG_CODE AS TAG_CODE, A.TAG_DATE AS TAG_DATE, B.TAG_VALUE FROM ( SELECT TAG_CODE, MAX (TAG_DATE) AS TAG_DATE FROM TR_HOURDATA WHERE trunc(TAG_DATE, 'dd' ) = trunc(sysdate, 'dd' ) GROUP BY TAG_CODE )A LEFT OUTER JOIN ( SELECT TAG_CODE, TAG_VALUE, TAG_DATE FROM TR_HOURDATA WHERE trunc(TAG_DATE, 'dd' ) = trunc(sysdate, 'dd' ) )B ON A.TAG_CODE = B.TAG_CODE AND A.TAG_DATE = B.TAG_DATE ) WHERE TAG_CODE IN ( 'CHG0301WT01OTMP02' , 'CHG0302WT01OTMP02' , 'CHG0303WT01OTMP02' , 'CHG0304WT01OTMP02' , 'CHG0305WT01OTMP02' , 'CHG0306WT01OTMP02' , 'CHG0307WT01OTMP02' , 'CHH0308WT01OTMP02' , 'CHG0309WT01OTMP02' ) )M WHERE GEN = IDX.GEN GROUP BY GEN ; INSERT INTO TR_TEST(TAG_CODE, TAG_VALUE, TAG_CONFIDENCE, TAG_DATE) VALUES ( 'M' || V_GEN || 'TEST02' , 1000, 0, TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24' ) || ':00:00' ); END LOOP; END PROC_TEST; |
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 | 변수는 첫번째 begin 이 시작되기 전에 설정해야 합니다. 고로 V_GEN VARCHAR2(6) ; V_VAL1 FLOAT := 0; V_VAL2 FLOAT := 0; V_VAL3 FLOAT := 0; V_VAL4 FLOAT := 0; ; BEGIN FOR IDX IN VM_TABLE LOOP V_GEN := IDX.GB; V_VAL1 := 0; V_VAL2 := 0; V_VAL3 := 0; V_VAL4 := 0; ... 이런식이 되야겠네요. |