action common_proc2(data : String) returns Boolean;
기본적으로 프로시저를 cds에 선언할때 function으로 사용했었는데
그렇게되면 LargeBinary형식의 데이터나 LargeString 형식 데이터를 HANA DB에 전송함에있어 용량 제약이 있지만 action을 사용하면 POST 방식으로 BODY에 직접 데이터를 담아서 전송하기때문에 문제점을 해결할수있다.
let re = await modules.insert(`srv-api/ga/common_proc2`,{
data : JSON.stringify({
proc_name: "cswe_proc",
arr : [
_email,
"I",
data.cs_we_001_id,
data.req_date,
data.member_id_cm_004_id,
data.cswe_work_type,
data.start_date,
data.end_date,
data.cswe_work_title,
data.cswe_work_detail,
data.file,
data.cswe_work_time,
file.name,
file.mediatype,
file.content
]
})
});
modules.dir(re);
컨트롤러에서 data에 string형식으로 json을 전송
this.on('common_proc2', 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 cds 파일 node js 방식
PROCEDURE "cswe_proc" (
EMAIL NVARCHAR(50),
FLAG NVARCHAR(12),
CS_WE_001_ID NVARCHAR(12),
REQ_DATE NVARCHAR(50),
MEMBER_ID_CM_004_ID NVARCHAR(50),
CSWE_WORK_TYPE NVARCHAR(50),
START_DATE NVARCHAR(50),
END_DATE NVARCHAR(50),
CSWE_WORK_TITLE NVARCHAR(50),
CSWE_WORK_DETAIL NCLOB,
FILE NVARCHAR(50),
CSWE_WORK_TIME NVARCHAR(50),
NAME NVARCHAR(50),
MEDIATYPE NVARCHAR(50),
CONTENT NCLOB,
OUT RESULT BOOLEAN
)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
AS
BEGIN
예시로 파일 업로드에서 파일을 base64로 인코딩한 바이너리 데이터를 전송하여서
프로시저에서 NCLOB 타입으로 받는것이다.