HANA DB PROCEDURE 사용

bow Rain·2021년 12월 12일
0

개발 관련 정리

목록 보기
16/19

1, 생성

.hdbprocedure라는 확장자명을 사용하며 db/ 경로에 생성을 해주면된다.

PROCEDURE "common_proc1" (
  
EMAIL NVARCHAR(50),
FLAG NVARCHAR(12),
TABLE_NAME NVARCHAR(50),
ID_NAME NVARCHAR(50),

  IN INTABLE TABLE(
        ID NVARCHAR(12)
    ),
    OUT RESULT BOOLEAN
 )
  LANGUAGE SQLSCRIPT
   SQL SECURITY INVOKER
    AS
    BEGIN
   /*************************************
       Write your procedure logic
   *************************************/

DECLARE I INT := 0;
DECLARE IN_ID NVARCHAR(12);

RESULT := false;

FOR I IN 1 .. RECORD_COUNT(:INTABLE)
DO
IN_ID := :INTABLE.ID[:I];

    -- 삭제
    IF  :FLAG = 'D' THEN

        EXEC 'UPDATE '||:TABLE_NAME||' SET DEL_DATE = CURRENT_TIMESTAMP, DEL_USER = '''||:EMAIL||''' WHERE '||:ID_NAME||' = '||:IN_ID;

    -- 승인
    ELSEIF :FLAG = 'U' THEN

        EXEC 'UPDATE '||:TABLE_NAME||' SET MOD_DATE = CURRENT_TIMESTAMP, APPROVAL_FLAG = ''Y'', MOD_USER = '''||:EMAIL||''' WHERE '||:ID_NAME||' = '||:IN_ID;

    -- 승인 취소
    ELSEIF :FLAG = 'UC' THEN
        EXEC 'UPDATE '||:TABLE_NAME||' SET MOD_DATE = CURRENT_TIMESTAMP, APPROVAL_FLAG = ''N'', MOD_USER = '''||:EMAIL||''' WHERE '||:ID_NAME||' = '||:IN_ID;

    ELSE
    END IF;

END FOR;

RESULT := true;
END

상단에 프로시저 이름을 명시하고 IN 파라미터와 OUT 파라미터를 선언
BEGIN 아래로 내부에서 사용할 변수를 선언하고 초기화등을 진행
본격적으로 로직을 수행하고 END로 프로시저가 종료되게된다.

참고로 프로시저가 제대로 실행됬냐를 판별하기 위해 RESULT 값으로 BOOLEAN값을 반환하도록 해놓은것이다.

2, 세팅

생성한 프로시저를 사용하려면 service.cds 파일에 function으로 프로시저를 세팅해줘야된다.

function common_proc1(data : String) returns Boolean;

const cds = require('@sap/cds')
module.exports = cds.service.impl(function () {

    this.on('common_proc1', async (req) => {
        try {
            let i = req.data.data;
            i = JSON.parse(i);
            console.log(i);

            const db = await cds.connect.to('db')
            const dbClass = require("sap-hdbext-promisfied")
            let dbConn = new dbClass(await dbClass.createConnection(db.options.credentials))
            const hdbext = require("@sap/hdbext")
            const sp = await dbConn.loadProcedurePromisified(hdbext, null, i.proc_name)
            // 데이터 넣는 곳
            const output = await dbConn.callProcedurePromisified(sp, i.arr)
            console.log(` =========== ${i.proc_name} output.results ========== `);
            console.log(output.results);
            console.log(` =========== ${i.proc_name} output ========== `);
            console.log(output);
            return output.outputScalar.RESULT
        } catch (error) {
            console.error(error);
            return false
        }
    })

그 후 service.js 파일에도 node js 형식으로 스크립트문을 작성해줘야된다.
앞서 cds에서 data 파라미터를 넣은걸 js 파일에서 req.data.data로 접근해서 가져올수있다.

컨트롤러단에서 프로시저로 보낼 데이터를 전달하면 js파일로 오게되고 여기서 프로시저에 파라미터를 넣어서 호출하게된다.

3, 실행

`srv-api/ga/common_proc1(data='${JSON.stringify({
                      proc_name: "common_proc1",
                      arr : [
                        _email,
                        "D",
                        "GILRO_GA_CS_WE_001",
                        "CS_WE_001_ID",
                        temp
                      ]
                    })}')`

ajax를 통해 프로시저 이름으로 데이터를 String으로 변환해서 url로 GET 요청을 보내게되면 js 파일을 거쳐서 프로시저에 파라미터값이 전달되고 SQL 로직이 실행 되게된다.

그리고 결과값으로 앞서 적어둔 true false값이 리턴되게되므로 이것으로 게시글 승인이 성공했는지 실패했는지 분기를 나눌수있다.

0개의 댓글