조회한 테이블 값 읽어서 다른테이블에 저장하기 0 2 3,940

by 쩡zZ [SQL Query] [2018.11.04 16:54:34]


위의 테이블에서 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;

 

by 야신 [2018.11.04 23:35:51]
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;
 
...
 
이런식이 되야겠네요.

 


by 쩡zZ [2018.11.05 13:36:20]

아 너무너무 감사합니다 !!! 해결됬습니다 !

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입