프로시져.테이블내의 13개의 필드에 대한 1000줄의 입력데이타를 처리

CREATE TABLE [EXTUREPLUSSTOCKFOREIGNERMASTER] (
[DATACLASS] VARCHAR2(2),
[INFOMARKETCLASS] VARCHAR2(3),
[STOCKCODE] VARCHAR2(12),
[SERIALNO] VARCHAR2(8),
[TRADEDATE] VARCHAR2(8),
[STOCKLIMITRATE] VARCHAR2(5),
[INDIVIDUALLIMITRATE] VARCHAR2(5),
[LISTINGSTOCKSIZE] VARCHAR2(15),
[ORDERPOSSIBILITYVOLUME] VARCHAR2(15),
[LIMITEXHAUSTCLASS] VARCHAR2(1),
[FILLER1] VARCHAR2(5),
[FILLER2] VARCHAR2(5),

[ENDTEXT] VARCHAR2(1)
);

구분자 방식("N:12345"와 "S:Hello World")을 적용하여 숫자와 문자열을 구분하려면, C/C++ 코드에서 구분자(N: 또는 S:)를 활용하여 데이터를 구분하고, Oracle 프로시저에서 이를 처리하도록 할 수 있습니다. 여기서는 두 가지 주요 방법을 설명하겠습니다:

  1. C/C++ 코드에서 데이터 전처리
  2. Oracle 프로시저에서 데이터 처리

1. C/C++ 코드에서 데이터 전처리

C/C++에서는 입력 데이터를 N:과 S:로 구분하여 Oracle 프로시저로 전달할 수 있도록 준비합니다. 이를 위해 inData 배열을 처리하고, 각 값에 대해 N:은 숫자, S:는 문자열로 판단하여 Oracle 프로시저에 전달합니다.

예제: C/C++ 코드에서 구분자 추가

 
#include <stdio.h>
#include <string.h>
#include <ctype.h>

char inData[1000][13][100];

void preprocessData(char rawData[1000][13][100]) {
    // 배열 초기화 및 데이터 전처리
    for (int i = 0; i < 1000; i++) {
        for (int j = 0; j < 13; j++) {
            if (isdigit(rawData[i][j][0])) { // 숫자인 경우
                snprintf(inData[i][j], 100, "N:%s", rawData[i][j]);
            } else { // 문자열인 경우
                snprintf(inData[i][j], 100, "S:%s", rawData[i][j]);
            }
        }
    }
}

// 예시 호출
int main() {
    char rawData[1000][13][100] = {
        {"12345", "Hello", "67890", "World", "1", "2", "3", "4", "5", "6", "7", "8", "9"},
        {"54321", "Test", "98765", "Example", "10", "20", "30", "40", "50", "60", "70", "80", "90"}
        // 기타 데이터 추가...
    };
    
    preprocessData(rawData);
    
    // 'inData' 배열을 Oracle 프로시저로 전달
}



위 코드에서 preprocessData 함수는 rawData 배열을 받아 각 값에 N: 또는 S:를 접두사로 추가하여 inData 배열에 저장합니다. 이렇게 하면 inData 배열은 숫자와 문자열을 구분할 수 있는 형식으로 변환됩니다.


2. Oracle 프로시저에서 데이터 처리

Oracle 프로시저에서는 전달된 데이터를 구분자(N: 또는 S:)에 따라 숫자와 문자열을 구분해서 처리할 수 있습니다. 이때 문자열의 앞 두 문자를 확인하여 숫자와 문자열을 판별하고, 그에 맞는 처리 로직을 수행합니다.

예제: Oracle 프로시저에서 구분자 처리

CREATE OR REPLACE PROCEDURE bulk_insert_proc (
    p_data IN SYS.ODCIVARCHAR2LIST -- 문자열 배열 타입
)
IS
    v_prefix VARCHAR2(2);
    v_value  VARCHAR2(4000);
BEGIN
    FOR i IN 1..p_data.COUNT / 13 LOOP
        FOR j IN 1..13 LOOP
            v_prefix := SUBSTR(p_data((i-1)*13 + j), 1, 2);  -- 앞의 구분자 확인
            v_value := SUBSTR(p_data((i-1)*13 + j), 3);      -- 구분자 이후의 값
            
            IF v_prefix = 'N:' THEN
                -- 숫자 처리: 여기서는 예를 들어 숫자 컬럼에 값을 삽입
                INSERT INTO EXTUREPLUSSTOCKFOREIGNERMASTER (number_column)
                VALUES (TO_NUMBER(v_value));
            ELSIF v_prefix = 'S:' THEN
                -- 문자열 처리: 문자열 컬럼에 값을 삽입
                INSERT INTO EXTUREPLUSSTOCKFOREIGNERMASTER (string_column)
                VALUES (v_value);
            END IF;
        END LOOP;
    END LOOP;
    
    COMMIT;
END;
/

프로시저 설명:

  1. 구분자 확인: SUBSTR 함수로 문자열의 처음 두 글자인 N: 또는 S:를 확인하여, 숫자인지 문자열인지를 구분합니다.
  2. 숫자 처리: N:으로 시작하는 값은 TO_NUMBER를 사용해 숫자로 변환하여 숫자 컬럼에 삽입합니다.
  3. 문자열 처리: S:로 시작하는 값은 그대로 문자열로 처리하여 문자열 컬럼에 삽입합니다.

3. C/C++에서 Oracle 프로시저 호출

C/C++ 코드에서 위와 같이 전처리된 inData 배열을 Oracle 프로시저로 전달할 수 있습니다. 이때 각 레코드는 13개의 값을 가지며, 각 값은 N: 또는 S:로 시작하는 형태로 전달됩니다.

예제: Oracle 프로시저 호출

#include <oci.h>

// OCI 핸들 및 환경 초기화
OCIEnv     *env;
OCIError   *err;
OCISvcCtx  *svc;
OCIStmt    *stmt;
OCIBind    *bind;
OCIArray   *array_data;

void bulkInsert(char inData[1000][13][100]) {
    // 환경 초기화
    OCIEnvCreate(&env, OCI_THREADED | OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL);
    OCIHandleAlloc(env, (void **)&err, OCI_HTYPE_ERROR, 0, NULL);
    OCIHandleAlloc(env, (void **)&svc, OCI_HTYPE_SVCCTX, 0, NULL);

    // Oracle 연결
    OCILogon(env, err, &svc, (text *)"username", strlen("username"), (text *)"password", strlen("password"), (text *)"db", strlen("db"));

    // 배열 준비: 1000 레코드, 13 컬럼
    OCIDescriptorAlloc(env, (void **)&array_data, OCI_DTYPE_TABLE, 0, NULL);
    
    // 데이터를 배열에 삽입
    for (int i = 0; i < 1000; i++) {
        for (int j = 0; j < 13; j++) {
            OCIArrayAppend(array_data, (text *)inData[i][j], strlen(inData[i][j]), err);
        }
    }

    // 프로시저 호출 준비
    OCIStmtPrepare(stmt, err, (text *)"BEGIN bulk_insert_proc(:data); END;", strlen("BEGIN bulk_insert_proc(:data); END;"), OCI_NTV_SYNTAX, OCI_DEFAULT);

    // 바인딩
    OCIBindByName(stmt, &bind, err, (text *)":data", strlen(":data"), (void *)array_data, sizeof(array_data), SQLT_TAB, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);

    // 실행
    OCIStmtExecute(svc, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT);

    // 종료
    OCILogoff(svc, err);
    OCIHandleFree(stmt, OCI_HTYPE_STMT);
    OCIHandleFree(err, OCI_HTYPE_ERROR);
    OCIHandleFree(svc, OCI_HTYPE_SVCCTX);
    OCIEnvFree(env, OCI_DEFAULT);
}

결론

  • C/C++ 코드에서 데이터를 N:과 S:로 구분하여 Oracle 프로시저에 전달합니다.
  • Oracle 프로시저에서는 SUBSTR을 사용하여 구분자를 확인하고, 숫자와 문자열을 처리합니다.
  • N: 접두사는 숫자 컬럼에 삽입하고, S: 접두사는 문자열 컬럼에 삽입합니다.


프로시져로 전달한 데이타의 숫자,문자열구분

입력 데이터에 구분자 추가

입력 데이터를 C/C++에서 Oracle로 전달하기 전에, 숫자와 문자열을 구분하는 구분자를 추가합니다. 예를 들어:

  • 숫자는 "N:<value>" 형태
  • 문자열은 "S:<value>" 형태

프로시저 수정

CREATE OR REPLACE PROCEDURE bulk_insert_proc (
    p_data IN SYS.ODCIVARCHAR2LIST
)
IS
    v_prefix VARCHAR2(1);
    v_value  VARCHAR2(4000);
BEGIN
    FOR i IN 1..p_data.COUNT LOOP
        v_prefix := SUBSTR(p_data(i), 1, 2); -- 앞의 구분자 확인
        v_value := SUBSTR(p_data(i), 3);    -- 구분자 이후의 값

        IF v_prefix = 'N:' THEN
            INSERT INTO your_table (number_column, string_column)
            VALUES (TO_NUMBER(v_value), NULL);
        ELSIF v_prefix = 'S:' THEN
            INSERT INTO your_table (number_column, string_column)
            VALUES (NULL, v_value);
        END IF;
    END LOOP;

    COMMIT;
END;
/
 


C/C++ 코드에서 데이터 예시
:

char insertmsg[1000][1024] = {
    "N:12345", // 숫자
    "S:Hello World", // 문자열
    ...
};
 

REQUEST)
오라클 프로시져는 오라클 엔진 내부에서 동작하는 코드입니다. 네트웍의 부하를 줄이기 위해서 insert 할 문장 1000번에 해당되는 데이타를 char insertmsg[1000][1024]에 넣고 오라클을 접속해서 프로시져를 호출하는 방법으로 구성한다면?

RESPONSE)

네트워크 부하를 줄이기 위해서 데이터를 한 번에 묶어서 Oracle 프로시저로 전달하는 것은 효과적인 방법입니다. 아래는 그 방법에 대한 개략적인 구현 흐름을 설명합니다.


1. Oracle 프로시저 생성

Oracle 프로시저를 만들어서 대량의 데이터를 처리할 수 있도록 배열 또는 CLOB 형태의 데이터를 받을 수 있게 설계합니다.

예제: insertmsg 처리용 프로시저

CREATE OR REPLACE PROCEDURE bulk_insert_proc (
    p_data IN SYS.ODCIVARCHAR2LIST -- 문자열 배열 타입
)
IS
BEGIN
    FOR i IN 1..p_data.COUNT LOOP
        INSERT INTO your_table (your_column)
        VALUES (p_data(i));
    END LOOP;

    COMMIT; -- 필요한 경우 사용
END;
/

SYS.ODCIVARCHAR2LIST는 Oracle에서 기본 제공하는 문자열 배열 타입입니다.


2. C/C++ 코드에서 데이터 준비

char insertmsg[1000][1024] 배열에 데이터를 준비합니다. 이 배열을 Oracle로 전달 가능한 형태로 변환해야 합니다.

OCI(Oracle Call Interface) 사용

OCI를 사용하여 데이터를 Oracle 프로시저에 전달할 수 있습니다.

예제 코드

#include <oci.h>

// OCI 핸들 및 환경 초기화
OCIEnv     *env;
OCIError   *err;
OCISvcCtx  *svc;
OCIStmt    *stmt;
OCIBind    *bind;
OCIArray   *array_data;

void bulkInsert(char insertmsg[1000][1024]) {
    // 환경 초기화
    OCIEnvCreate(&env, OCI_THREADED | OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL);
    OCIHandleAlloc(env, (void **)&err, OCI_HTYPE_ERROR, 0, NULL);
    OCIHandleAlloc(env, (void **)&svc, OCI_HTYPE_SVCCTX, 0, NULL);

    // Oracle 연결
    OCILogon(env, err, &svc, (text *)"username", strlen("username"), (text *)"password", strlen("password"), (text *)"db", strlen("db"));

    // 문자열 배열을 Oracle 배열 타입으로 변환
    OCIDescriptorAlloc(env, (void **)&array_data, OCI_DTYPE_TABLE, 0, NULL);
    for (int i = 0; i < 1000; i++) {
        OCIArrayAppend(array_data, (text *)insertmsg[i], strlen(insertmsg[i]), err);
    }

    // 프로시저 호출 준비
    OCIStmtPrepare(stmt, err, (text *)"BEGIN bulk_insert_proc(:data); END;", strlen("BEGIN bulk_insert_proc(:data); END;"), OCI_NTV_SYNTAX, OCI_DEFAULT);

    // 바인딩
    OCIBindByName(stmt, &bind, err, (text *)":data", strlen(":data"), (void *)array_data, sizeof(array_data), SQLT_TAB, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);

    // 실행
    OCIStmtExecute(svc, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT);

    // 종료
    OCILogoff(svc, err);
    OCIHandleFree(stmt, OCI_HTYPE_STMT);
    OCIHandleFree(err, OCI_HTYPE_ERROR);
    OCIHandleFree(svc, OCI_HTYPE_SVCCTX);
    OCIEnvFree(env, OCI_DEFAULT);
}

3. 장점

  • 네트워크 부하 감소: 데이터를 한 번에 묶어서 전달하여 네트워크 트래픽을 줄입니다.
  • Oracle 서버에서 처리: 대량 데이터를 Oracle 엔진이 직접 처리하므로 성능이 향상됩니다.

4. 주의사항

  1. 데이터 크기 제한:
    • SYS.ODCIVARCHAR2LIST는 한 요소당 최대 4000바이트까지만 허용됩니다. 초과할 경우 CLOB 등을 고려하세요.
  2. 트랜잭션 관리:
    • COMMIT 또는 ROLLBACK 처리를 적절히 설계해야 합니다.
  3. OCI 라이브러리 사용 환경:
    • OCI 라이브러리를 활용하려면 Oracle 클라이언트가 설치되어 있어야 합니다.

위 방법을 응용하여 네트워크 부하를 줄이고 효율적인 데이터 처리를 할 수 있습니다.

 

#참조(mysql 삭제)
https://velog.io/@michael00987/MYSQL-%EC%84%A4%EC%B9%98-%EC%9E%AC%EC%84%A4%EC%B9%98

 

 

 


#MySQL innoDB 에서 INSERT 하는 속도를 MyISAM 과 유사하게 변경하는 방법은 다음과 같다.

* innodb_flush_log_at_trx_commit 설정값을 확인한다.
mysql> show variables like 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     | 
+--------------------------------+-------+
1 row in set (0.00 sec)

* innodb_flush_log_at_trx_commit 설정값이 1 이면 아래와 같이 실행하여서 0 으로 수정한다.
  - 아래와 같이 설정하면 INSERT 할 때에 로그 파일에 기록하지 않기 때문에 INSERT 속도가 향상된다. 
단, 서버 비정상 종료 또는 정전과 같은 상황에서 INSERT 한 데이터를 잃어버릴 수 있다.

mysql> set global innodb_flush_log_at_trx_commit=0;

innodb_flush_log_at_trx_commit 옵션 설명은 다음과 같다.
이 옵션은 commit 을 하였을 경우 
그 즉시 commit된 데이타를 log file 에 기록할 것인지 아닌지를 설정하는 옵션입니다.  
즉시 로그 파일에 기록할 경우 급작스런 정전 같은 경우 데이타 손실을 막을 수 있지만 매번 로그를 기록해야 하므로 속도가 상당히 저하됩니다. 
0 으로 설정할 경우 매 트랜잭션 마다 데이타를 로그에 기록하지 않으므로 I/O부하를 줄일 수 있으며 여러 트랜잭션을 모아서 한번의 디스크 I/O로 기록하므로 I/O횟수 자체도 줄어듭니다. 



mysql> select @r:=@r+1 As rowNum, T2.t_regtime,T2.t_cnt from DUMMY T1, (select substr(regtime,1,17) as t_regtime, count(1) as t_cnt from RB_OCUS_POS_TEST2 group by substr(regtime,1,17)) T2, (Select @r:=0)r;
+--------+-------------------+-------+
| rowNum | t_regtime         | t_cnt |
+--------+-------------------+-------+
|      1 | 20190829 12:42:03 |   669 |
|      2 | 20190829 12:42:04 |  3021 |
|      3 | 20190829 12:42:05 |  5429 |
|      4 | 20190829 12:42:06 |  5005 |
|      5 | 20190829 12:42:07 |  3661 |
|      6 | 20190829 12:42:08 |  3310 |
|      7 | 20190829 12:42:09 |  2807 |
|      8 | 20190829 12:42:10 |  3950 |
|      9 | 20190829 12:42:11 |  4715 |
|     10 | 20190829 12:42:12 |  5130 |
|     11 | 20190829 12:42:13 |  4318 |
|     12 | 20190829 12:42:14 |  2918 |
|     13 | 20190829 12:42:15 |  2980 |
|     14 | 20190829 12:42:16 |  4156 |
|     15 | 20190829 12:42:17 |  5870 |
|     16 | 20190829 12:42:18 |  5236 |
|     17 | 20190829 12:42:19 |  5546 |
|     18 | 20190829 12:42:20 |  5367 |
|     19 | 20190829 12:42:21 |  3181 |
|     20 | 20190829 12:42:22 |  2807 |
|     21 | 20190829 12:42:23 |  2554 |
|     22 | 20190829 12:42:24 |  1379 |
|     23 | 20190829 12:42:25 |  4924 |
|     24 | 20190829 12:42:26 |  4724 |
|     25 | 20190829 12:42:27 |  5641 |
|     26 | 20190829 12:42:28 |  5661 |
|     27 | 20190829 12:42:29 |  3936 |
|     28 | 20190829 12:42:30 |  3557 |
|     29 | 20190829 12:42:31 |  4186 |
|     30 | 20190829 12:42:32 |  4821 |
|     31 | 20190829 12:42:33 |  4621 |
|     32 | 20190829 12:42:34 |  4697 |
|     33 | 20190829 12:42:35 |  3264 |
|     34 | 20190829 12:42:36 |  3706 |
|     35 | 20190829 12:42:37 |  2423 |
|     36 | 20190829 12:42:38 |  2043 |
|     37 | 20190829 12:42:39 |  4207 |
|     38 | 20190829 12:42:40 |  3524 |
|     39 | 20190829 12:42:41 |  4656 |
|     40 | 20190829 12:42:42 |  3582 |
|     41 | 20190829 12:42:43 |  2995 |
|     42 | 20190829 12:42:44 |   120 |
+--------+-------------------+-------+
42 rows in set (0.25 sec)

mysql>


 

다음과 같은 테이블이 존재한다. (테이블명 : ISS_HH)

SEQ_NO(PK) USER_ID INFO1 INFO2
1 10001 HH KK
2 10002 HH KK
3 10003 HH KK
4 10004 HH KK
5 10005 HH KK
6 10006 HH KK
7 10007 HH KK
8 10008 HH KK
9 10009 HH KK
10 10010 HH KK
11 10011 HH KK
12 10012 HH KK

 

위의 SEQ_NO를 1씩 증가시키기 위해서는 보통 아래와 같은 SQL을 생각하기 쉽다.

 

SQL>UPDATE ISS_HH SET SEQ_NO = SEQ_NO + 1 WHERE USER_ID > 10000

 

그러나 위를 실행하면, DUPLICATE ERROR가 발생한다. 이유는 멀까? 

 

PK인 SEQ_NO에 UPDATE시에 데이타가 중복으로 발생하게 된다. 즉 이런 경우는 가장큰 SEQ_NO를 증가시키는것이 일반적이다.

 

>>>>>>>>>OK QUERY

SQL>UPDATE ISS_HH SET SEQ_NO = SEQ_NO + 1 WHERE USER_ID > 10000 ORDER BY SEQ_NO DESC

 

-1 을 할경우는 반대로 생각하면 된다.

SQL>UPDATE ISS_HH SET SEQ_NO = SEQ_NO -1 WHERE USER_ID > 10000 ORDER BY SEQ_NO ASC

 

 

비고) 한번에 처리하지 않고, 하나씩 처리하는 프로그램으로 작성해보라,ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

비고) 한번에 처리하지 않고, 하나씩 처리하는 프로그램으로 작성해보라,ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

비고) 한번에 처리하지 않고, 하나씩 처리하는 프로그램으로 작성해보라,ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

비고) 한번에 처리하지 않고, 하나씩 처리하는 프로그램으로 작성해보라,ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

 

 

1. RB_OCUS_POS_TEST2테이블에 200,00개의 데이타를 넣는다.

2. 1초에 3,000개 이상의 데이타가 들어가는 횟수를 알고 싶다면?

3. 아래는 위의 문제를 구하기 위해서 구성한 쿼리이다.

 

 

mysql> show create table RB_OCUS_POS_TEST2;
+-------------------+-----------------------------------
| Table             | Create

+-------------------+-----------------------------------
| RB_OCUS_POS_TEST2 | CREATE TABLE `RB_OCUS_POS_TEST2` (
  `seqno` int(11) NOT NULL,
  `account_no` varchar(10) NOT NULL,
  `stock_symbol` varchar(20) NOT NULL,
  `start_volume` varchar(10) DEFAULT NULL,
  `start_amount` varchar(13) DEFAULT NULL,
  `start_price` varchar(13) DEFAULT NULL,
  `stock_type` varchar(2) DEFAULT NULL,
  `trustee_id` varchar(2) DEFAULT NULL,
  `regtime` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`seqno`,`account_no`,`stock_symbol`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------------------+-----------------------------------
1 row in set (0.00 sec)

mysql>

mysql> desc RB_OCUS_POS_TEST2;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| seqno        | int(11)     | NO   | PRI | NULL    |       |
| account_no   | varchar(10) | NO   | PRI | NULL    |       |
| stock_symbol | varchar(20) | NO   | PRI | NULL    |       |
| start_volume | varchar(10) | YES  |     | NULL    |       |
| start_amount | varchar(13) | YES  |     | NULL    |       |
| start_price  | varchar(13) | YES  |     | NULL    |       |
| stock_type   | varchar(2)  | YES  |     | NULL    |       |
| trustee_id   | varchar(2)  | YES  |     | NULL    |       |
| regtime      | varchar(30) | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
9 rows in set (0.00 sec)

mysql>

mysql> select * from RB_OCUS_POS_TEST2 limit 10;
+-------+------------+----------------------+--------------+---------------+---------------+------------+------------+------------------------+
| seqno | account_no | stock_symbol         | start_volume | start_amount  | start_price   | stock_type | trustee_id | regtime                |
+-------+------------+----------------------+--------------+---------------+---------------+------------+------------+------------------------+
|     1 | 0016100    | BBL                  | 0000001500   | 0000266962.22 | 000177.974813 | 02         |            | 20190828 11:19:25(140) |
|     2 | 0016100    | BPP                  | 0000002000   | 0000042000.00 | 000021.000000 | 02         |            | 20190828 11:19:25(141) |
|     3 | 0016100    | CK                   | 0000015375   | 0000296816.51 | 000019.305139 | 02         |            | 20190828 11:19:25(142) |
|     4 | 0016100    | IEC                  | 0012286603   | 0000308909.54 | 000000.025142 | 02         |            | 20190828 11:19:25(142) |
|     5 | 0016100    | IVL                  | 0000011769   | 0000309729.03 | 000026.317362 | 02         |            | 20190828 11:19:25(142) |
|     6 | 0016100    | KTB                  | 0000005000   | 0000103785.51 | 000020.757102 | 02         |            | 20190828 11:19:25(142) |
|     7 | 0055920    | ASAP                 | 0000001000   | 0000003106.87 | 000003.106870 | 02         |            | 20190828 11:19:25(142) |
|     8 | 0055920    | BCP                  | 0000001000   | 0000033574.22 | 000033.574220 | 02         |            | 20190828 11:19:25(142) |
|     9 | 0055920    | CBG                  | 0000000800   | 0000042844.70 | 000053.555875 | 02         |            | 20190828 11:19:25(143) |
|    10 | 0055920    | CHAYO                | 0000002000   | 0000008739.30 | 000004.369650 | 02         |            | 20190828 11:19:25(143) |
+-------+------------+----------------------+--------------+---------------+---------------+------------+------------+------------------------+
10 rows in set (0.00 sec)

mysql>

mysql> select T2.t_cnt from DUMMY T1, (select substr(regtime,1,17) as t_regtime, count(1) as t_cnt from RB_OCUS_POS_TEST2 group by substr(regtime,1,17)) T2 limit 10;
+-------+
| t_cnt |
+-------+
|  2149 |
|  2556 |
|  3462 |
|  2635 |
|  2780 |
|  3051 |
|  2450 |
|  2310 |
|  2695 |
|  2716 |
+-------+
10 rows in set (0.22 sec)

mysql> 
mysql> select T2.t_cnt from DUMMY T1, (select substr(regtime,1,17) as t_regtime, count(1) as t_cnt from RB_OCUS_POS_TEST2 group by substr(regtime,1,17)) T2 where T2.t_cnt > 3000;
+-------+
| t_cnt |
+-------+
|  3462 |
|  3051 |
|  3192 |
|  3761 |
|  3085 |
|  3418 |
|  3341 |
|  3066 |
|  3353 |
|  3287 |
|  3037 |
+-------+
11 rows in set (0.23 sec)

mysql>

mysql> select * from DUMMY;
+-------+------------+----------------------+--------------+---------------+---------------+------------+------------+
| seqno | account_no | stock_symbol         | start_volume | start_amount  | start_price   | stock_type | trustee_id |
+-------+------------+----------------------+--------------+---------------+---------------+------------+------------+
|     1 | 0016100    | BANPU                | 0000045000   | 0000645569.57 | 000014.345990 | 02         |            |
+-------+------------+----------------------+--------------+---------------+---------------+------------+------------+
1 row in set (0.00 sec)

mysql>

 

mysql> select T2.t_regtime,T2.t_cnt from DUMMY T1, (select substr(regtime,1,17) as t_regtime, count(1) as t_cnt from RB_OCUS_POS_TEST2 group by substr(regtime,1,17)) T2 where T2.t_cnt > 3000;
+-------------------+-------+
| t_regtime         | t_cnt |
+-------------------+-------+
| 20190828 11:19:27 |  3462 |
| 20190828 11:19:30 |  3051 |
| 20190828 11:19:38 |  3192 |
| 20190828 11:19:46 |  3761 |
| 20190828 11:19:47 |  3085 |
| 20190828 11:19:55 |  3418 |
| 20190828 11:20:00 |  3341 |
| 20190828 11:20:03 |  3066 |
| 20190828 11:20:12 |  3353 |
| 20190828 11:20:15 |  3287 |
| 20190828 11:20:20 |  3037 |
+-------------------+-------+
11 rows in set (0.19 sec)

mysql>  

 

mysql> select T2.t_regtime,T2.t_cnt from DUMMY T1, (select substr(regtime,1,17) as t_regtime, count(1) as t_cnt from RB_OCUS_POS_TEST2 group by substr(regtime,1,17)) T2 where T2.t_cnt > 3000 order by T2.t_cnt desc;
+-------------------+-------+
| t_regtime         | t_cnt |
+-------------------+-------+
| 20190828 11:19:46 |  3761 |
| 20190828 11:19:27 |  3462 |
| 20190828 11:19:55 |  3418 |
| 20190828 11:20:12 |  3353 |
| 20190828 11:20:00 |  3341 |
| 20190828 11:20:15 |  3287 |
| 20190828 11:19:38 |  3192 |
| 20190828 11:19:47 |  3085 |
| 20190828 11:20:03 |  3066 |
| 20190828 11:19:30 |  3051 |
| 20190828 11:20:20 |  3037 |
+-------------------+-------+
11 rows in set (0.00 sec)

mysql>

 

 

'데이타베이스 > MySQL' 카테고리의 다른 글

MySQL ROWNUM(select @r:=@r+1 As rowNum)  (0) 2019.10.31
TIP - SEQ증감  (0) 2019.10.31
FUNCTION 생성및 활용  (0) 2019.10.31
LINUX,프로그래밍을 통한 PROCEDURE 호출후 결과  (0) 2019.10.30
#LINUX,common.c(MySQL)  (0) 2019.10.30

 

#####FUNCTION 생성

 

DROP FUNCTION IF EXISTS GETMASTER_SYMB;

DELIMITER $$
CREATE FUNCTION GETMASTER_SYMB(intput1 TEXT, intput2 TEXT) RETURNS TEXT
BEGIN

    DECLARE p_result    TEXT;
    DECLARE p_input1    TEXT;
    DECLARE p_input2    TEXT;

 

    SET p_input1 = intput1;
    SET p_input2 = intput2;

 

    SET p_result = (SELECT  SYMB FROM fssmaster WHERE ( COD2 = p_input1 OR COD1 = p_input2 ))
    ;

    RETURN p_result;
END $$
DELIMITER ;

 

 

#####FUNCTION 활용

C:\Users\kiwoom\Downloads>
C:\Users\kiwoom\Downloads>mysql -u root -p
Enter password: ***********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.1.35-community MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use fss;
Database changed
mysql> SELECT fss.GETMASTER_SYMB('4262', '4263');
+------------------------------------+
| fss.GETMASTER_SYMB('4262', '4263') |
+------------------------------------+
| AAV                                |
+------------------------------------+
1 row in set (0.02 sec)

mysql>
mysql>
mysql>

 

/*

 * gcc -c sample.c

 * gcc -o sample sample.o libmysql.lib

 */

 

#include "C:\Program Files\MySQL\MySQL Connector C 6.1\include\mysql.h"
#include <string.h>
#include <stdio.h>

#define DB_HOST "127.0.0.1"
#define DB_USER "root"
#define DB_PASS "eogksalsrnr"
#define DB_NAME "fss"
    
int main(void)
{
    MYSQL *connection=NULL, conn;
    MYSQL_RES *sql_result;
    MYSQL_ROW sql_row;
    int query_stat; 
    
    mysql_init(&conn);

    connection = mysql_real_connect(&conn, DB_HOST, DB_USER, DB_PASS, DB_NAME, 3306, (char *)NULL, 0);

    if (connection == NULL)
    {
        fprintf(stderr, "Mysql connection error : %s", mysql_error(&conn));
        return 1;
    }

    query_stat = mysql_query(connection, "SELECT fss.GETMASTER_SYMB('4262', '4263')");
    if (query_stat != 0)
    {
        fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
        return 1;
    }
    
    sql_result = mysql_store_result(connection);
    
    while ( (sql_row = mysql_fetch_row(sql_result)) != NULL )
    {
        printf(">>>>>>%s\n", sql_row[0]);
    }

    mysql_free_result(sql_result);

    mysql_close(connection);

    return 0;​
}
 

+ Recent posts