SnowConvert: Oracle PL/SQL 변환 헬퍼¶
Between 연산자 헬퍼¶
참고
사용자는 Between 연산자 변환에도 관심이 있을 수 있습니다.
Between 연산자 헬퍼 함수 정의¶
var BetweenFunc = function (expression,startExpr,endExpr) {
if ([expression,startExpr,endExpr].some((arg) => arg == null)) {
return null;
}
return expression >= startExpr && expression <= endExpr;
};
Concat 값 헬퍼¶
참고
이 헬퍼는 IS NULL 헬퍼도 사용합니다.
Concat 헬퍼 함수 정의¶
JavaScript 템플릿 리터럴의 값을 연결하는 데 사용되는 헬퍼 메서드입니다. 값이 null인지 여부를 확인하는 데 필요합니다. Oracle은 연결에서 null 값을 빈 문자열로 처리합니다.
var concatValue = (arg) => IS_NULL(arg) ? "" : arg;
커서 도우미¶
커서 도우미 함수 정의¶
var FETCH_INTO_COLLECTIONS = function (collections,fetchValues) {
for(let i = 0;i < collections.length;i++) {
collections[i].push(fetchValues[i]);
}
};
var CURSOR = function (stmt,binds,isRefCursor,isOut) {
var statementObj, result_set, total_rows, ISOPEN = false, result_set_table = '', self = this, row_count, found;
this.CURRENT = new Object;
this.INTO = function () {
return self.res;
};
this.OPEN = function (openParameters) {
if (ISOPEN && !isRefCursor) RAISE(-6511,"CURSOR_ALREADY_OPEN","cursor already open");
var finalStmt = openParameters && openParameters.query || stmt;
var parameters = openParameters && openParameters.binds || [];
var finalBinds = binds instanceof Function ? binds(...parameters) : binds;
finalBinds = finalBinds || parameters;
try {
if (isOut) {
if (!temptable_prefix) {
temptable_prefix = `${procname}_TEMP_${(EXEC(`select current_session() || '_' || to_varchar(current_timestamp, 'yyyymmddhh24missss')`,{
sql : 0
}))[0]}_`;
}
if (!result_set_table) {
result_set_table = temptable_prefix + outCursorResultNumber++;
EXEC(`CREATE OR REPLACE TEMPORARY TABLE ${result_set_table} AS ${finalStmt}`,{
sql : 0
});
}
finalStmt = "SELECT * FROM " + result_set_table
}
[result_set,statementObj,total_rows] = [EXEC(finalStmt,finalBinds,{
sql : 0,
row : 2
}),_RS,_RS.getColumnCount()]
ISOPEN = true;
row_count = 0;
} catch(error) {
RAISE(error.code,"error",error.message);
}
return this;
};
this.NEXT = function () {
if (total_rows && result_set.next()) {
this.CURRENT = new Object;
for(let i = 1;i <= statementObj.getColumnCount();i++) {
(this.CURRENT)[statementObj.getColumnName(i)] = result_set.getColumnValue(i);
}
return true;
} else return false;
};
this.FETCH = function (record) {
var recordKeys = record ? Object.keys(record) : undefined;
self.res = [];
if (!ISOPEN) RAISE(-1001,"INVALID_CURSOR","invalid cursor");
if (recordKeys && recordKeys.length != statementObj.getColumnCount()) RAISE(-6504,"ROWTYPE_MISMATCH","Return types of Result Set variables or query do not match");
self.res = fetch(statementObj,result_set);
if (self.res && self.res.length > 0) {
found = true;
row_count++;
if (recordKeys) {
for(let i = 0;i < self.res.length;i++) {
record[recordKeys[i]] = (self.res)[i];
}
return false;
}
return true;
} else found = false;
return false;
};
this.CLOSE = function () {
if (!ISOPEN) RAISE(-1001,"INVALID_CURSOR","invalid cursor");
found = row_count = result_set_table = total_rows = result_set = statementObj = undefined;
ISOPEN = false;
};
this.FETCH_BULK_COLLECT_INTO = function (variables,limit) {
if (variables.length != statementObj.getColumnCount()) RAISE(-6504,"ROWTYPE_MISMATCH","Return types of Result Set variables or query do not match");
if (limit) {
for(let i = 0;i < limit && this.FETCH();i++)FETCH_INTO_COLLECTIONS(variables,self.res);
} else {
while ( this.FETCH() )
FETCH_INTO_COLLECTIONS(variables,self.res);
}
};
this.FOUND = () => ISOPEN ? typeof(found) == "boolean" ? found : null : RAISE(-1001,"INVALID_CURSOR","invalid cursor");
this.NOTFOUND = () => ISOPEN ? typeof(found) == "boolean" ? !found : null : RAISE(-1001,"INVALID_CURSOR","invalid cursor");
this.ROWCOUNT = () => ISOPEN ? row_count : RAISE(-1001,"INVALID_CURSOR","invalid cursor");
this.ISOPEN = () => ISOPEN;
this.SAVE_STATE = function () {
return {
tempTable : result_set_table,
position : row_count
};
};
this.RESTORE_STATE = function (tempTable,position) {
result_set_table = tempTable
if (result_set_table) {
isOut = true
this.OPEN();
for(let i = 0;i < position;i++)this.FETCH();
}
};
this.ROWTYPE = () => ROWTYPE(stmt,binds());
};
var outCursorResultNumber = 0;
EXEC 헬퍼¶
참고
EXEC 헬퍼는 IS NULL 헬퍼.에 종속됩니다
구문¶
EXEC(stmt)
EXEC(stmt, binds[])
EXEC(stmt, opts{})
EXEC(stmt, binds[], opts{})
매개 변수¶
stmt¶
실행할 SQL 문의 문자열입니다.
바인딩(선택 사항)¶
SQL 문에 바인딩할 값 또는 변수가 포함된 배열입니다.
옵션(선택 사항)¶
실행이 반환하는 값의 형식을 설명하는 Javascript 오브젝트로, SELECT 문에 사용됩니다.
옵션 매개 변수에 유효한 인자¶
다음 테이블은 EXEC 호출에서 옵션 매개 변수에 인자를 전송하는 방법을 설명합니다.
쿼리가 단일 행을 반환하는 경우의 옵션¶
옵션 |
설명 |
---|---|
{ } |
옵트가 비어 있거나 실행 호출로 전송되지 않은 경우, 데이터는 배열 안에 반환됩니다. |
{vars: 0} |
이 옵션은 기본 옵션과 동일한 효과가 있습니다. 이 함수는 배열 내부의 데이터를 반환합니다. |
{vars: 1} |
쿼리에서 1개의 열과 1개의 행만 반환할 때 사용됩니다. EXEC 는 값을 직접 반환합니다. 이는 EXEC(stmt)[0]에 해당합니다 |
{rec:recordVariable} |
쿼리에서 반환된 값을 레코드 내에 저장하려는 경우에 사용합니다. 레코드 변환은 레코드 변환 참조에 설명되어 있습니다. 레코드 변수를 인자로 전달해야 합니다. |
{row: 1} |
이 옵션은 ResultSet 의 복사본을 반환합니다. 즉, 반환되는 오브젝트에는 ResultSet Snowflake 설명서 에 설명된 메서드가 포함되어 있습니다. |
쿼리가 여러 행을 반환하는 경우의 옵션¶
옵션 |
설명 |
---|---|
{row:2} |
이 옵션을 사용하면 EXEC 에서 반환하는 행 수에 관계없이 항상 ResultSet 의 복사본을 반환합니다. |
일반 옵션¶
옵션 |
설명 |
---|---|
{sql:0} |
문을 실행한 후 SQL 암시적 커서 특성이 수정되지 않았는지 확인합니다. |
EXEC 헬퍼 함수 정의¶
var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
var fixBind = function (arg) {
arg = arg instanceof Date ? formatDate(arg) : IS_NULL(arg) ? null : arg;
return arg;
};
var _RS, _ROWS, SQLERRM = "normal, successful completion", SQLCODE = 0;
var getObj = (_rs) => Object.assign(new Object(),_rs);
var getRow = (_rs) => (values = Object.values(_rs)) && (values = values.splice(-1 * _rs.getColumnCount())) && values;
var fetch = (_RS,_ROWS,fmode) => _RS.getRowCount() && _ROWS.next() && (fmode ? getObj : getRow)(_ROWS) || (fmode ? new Object() : []);
var EXEC = function (stmt,binds,opts) {
try {
binds = !(arguments[1] instanceof Array) && ((opts = arguments[1]) && []) || (binds || []);
opts = opts || new Object();
binds = binds ? binds.map(fixBind) : binds;
_RS = snowflake.createStatement({
sqlText : stmt,
binds : binds
});
_ROWS = _RS.execute();
if (opts.sql !== 0) {
var isSelect = stmt.toUpperCase().trimStart().startsWith("SELECT");
var affectedRows = isSelect ? _RS.getRowCount() : _RS.getNumRowsAffected();
SQL.FOUND = affectedRows != 0;
SQL.NOTFOUND = affectedRows == 0;
SQL.ROWCOUNT = affectedRows;
}
if (opts.row === 2) {
return _ROWS;
}
var INTO = function (opts) {
if (opts.vars == 1 && _RS.getColumnCount() == 1 && _ROWS.next()) {
return _ROWS.getColumnValue(1);
}
if (opts.rec instanceof Object && _ROWS.next()) {
var recordKeys = Object.keys(opts.rec);
Object.assign(opts.rec,Object.fromEntries(new Map(getRow(_ROWS).map((element,Index) => [recordKeys[Index],element]))))
return opts.rec;
}
return fetch(_RS,_ROWS,opts.row);
};
var BULK_INTO_COLLECTION = function (into) {
for(let i = 0;i < _RS.getRowCount();i++) {
FETCH_INTO_COLLECTIONS(into,fetch(_RS,_ROWS,opts.row));
}
return into;
};
if (_ROWS.getRowCount() > 0) {
return _ROWS.getRowCount() == 1 ? INTO(opts) : BULK_INTO_COLLECTION(opts);
}
} catch(error) {
RAISE(error.code,error.name,error.message)
}
};
사용법 샘플¶
참고
모든 샘플의 경우 SnowConvert 헬퍼 코드가 제거되었습니다.
다음 코드 예제는 EXEC 작동 방식을 설명합니다.
EXEC 단순 케이스¶
Oracle
--Additional Params: -t JavaScript
CREATE OR REPLACE PROCEDURE EXECUTE_PROC AS
BEGIN
--CREATES HARDWARE TABLE WITH COLUMNS ID, DEVICE AND COLOR
--THIS IS AN EXECUTE IMMEDIATE JUST WITH AN STATEMENT
EXECUTE IMMEDIATE 'CREATE TABLE HARDWARE (ID NUMBER, DEVICE VARCHAR2(15), COLOR VARCHAR(15))';
END;
Snowflake
CREATE OR REPLACE PROCEDURE EXECUTE_PROC ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
//CREATES HARDWARE TABLE WITH COLUMNS ID, DEVICE AND COLOR
//THIS IS AN EXECUTE IMMEDIATE JUST WITH AN STATEMENT
EXEC(`CREATE OR REPLACE TABLE HARDWARE (ID NUMBER(38, 18),
DEVICE VARCHAR(15),
COLOR VARCHAR(15))`);
$$;
바인딩 포함 EXEC¶
Oracle
--Additional Params: -t JavaScript
CREATE OR REPLACE PROCEDURE EXECUTE_PROC AS
ID_VAR NUMBER;
DEVICE_VAR VARCHAR2(15);
DEV_COLOR VARCHAR2(15);
COLOR_VAR VARCHAR2(15);
BEGIN
--EXEC WITH BINDINGS
--INSERTS A ROW WITH | 12 | MOUSE | BLACK | VALUES USING DIRECT BINDING FOR MOUSE
EXECUTE IMMEDIATE 'INSERT INTO HARDWARE VALUES (12, :MOUSE, ''BLACK'')' USING 'MOUSE';
--INSERTS A ROW WITH | 13 | KEYBOARD | WHITE | VALUES USING DIRECT BINDING FOR 13 AND KEYBOARD
EXECUTE IMMEDIATE 'INSERT INTO HARDWARE VALUES (:ID, :KEYBOARD, ''WHITE'')' USING 13, 'KEYBOARD';
--INSERTS A ROW WITH | 14 | HEADSET | GRAY | VALUES USING BINDING VARIABLES
ID_VAR := 14;
DEVICE_VAR := 'HEADSET';
COLOR_VAR := 'GRAY';
EXECUTE IMMEDIATE 'INSERT INTO HARDWARE VALUES (:DEV_ID, :DEV_VAR, :DEV_COLOR)' USING ID_VAR, DEVICE_VAR, COLOR_VAR;
END;
Snowflake
CREATE OR REPLACE PROCEDURE EXECUTE_PROC ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let ID_VAR;
let DEVICE_VAR;
let DEV_COLOR;
let COLOR_VAR;
//EXEC WITH BINDINGS
//INSERTS A ROW WITH | 12 | MOUSE | BLACK | VALUES USING DIRECT BINDING FOR MOUSE
EXEC(`INSERT INTO HARDWARE
VALUES (12, ?, 'BLACK')`,[`MOUSE`]);
//INSERTS A ROW WITH | 13 | KEYBOARD | WHITE | VALUES USING DIRECT BINDING FOR 13 AND KEYBOARD
EXEC(`INSERT INTO HARDWARE
VALUES (?, ?, 'WHITE')`,[13,`KEYBOARD`]);
//INSERTS A ROW WITH | 14 | HEADSET | GRAY | VALUES USING BINDING VARIABLES
ID_VAR = 14;
DEVICE_VAR = `HEADSET`;
COLOR_VAR = `GRAY`;
EXEC(`INSERT INTO HARDWARE
VALUES (?, ?, ?)`,[ID_VAR,DEVICE_VAR,COLOR_VAR]);
$$;
옵션 포함 EXEC¶
Oracle
--Additional Params: -t JavaScript
CREATE OR REPLACE PROCEDURE EXECUTE_PROC AS
BEGIN
--STORES THE ID INTO ID_VAR
EXECUTE IMMEDIATE 'SELECT ID FROM HARDWARE WHERE COLOR = ''BLACK''' INTO ID_VAR;
DBMS_OUTPUT.PUT_LINE(ID_VAR);
--STORES THE ID AND DEVICE INTO ID_VAR AND DEV_VAR, USING BINDING FOR COLOR
COLOR_VAR := 'BLACK';
EXECUTE IMMEDIATE 'SELECT ID, DEVICE FROM HARDWARE WHERE COLOR = :DEV_COLOR' INTO ID_VAR, DEVICE_VAR USING COLOR_VAR;
DBMS_OUTPUT.PUT_LINE(ID_VAR || ' ' || DEVICE_VAR);
END;
Snowflake
CREATE OR REPLACE PROCEDURE EXECUTE_PROC ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
//STORES THE ID INTO ID_VAR
[ID_VAR] = EXEC(`SELECT ID FROM
HARDWARE
WHERE COLOR = 'BLACK'`);
EXEC(`--** SSC-FDM-OR0035 - CHECK UDF IMPLEMENTATION FOR DBMS_OUTPUT.PUT_LINE_UDF. **
CALL DBMS_OUTPUT.PUT_LINE_UDF(ID_VAR)`);
//STORES THE ID AND DEVICE INTO ID_VAR AND DEV_VAR, USING BINDING FOR COLOR
COLOR_VAR = `BLACK`;
[ID_VAR,DEVICE_VAR] = EXEC(`SELECT ID, DEVICE FROM
HARDWARE
WHERE COLOR = ?`,[
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT COLOR_VAR MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
COLOR_VAR]);
EXEC(`--** SSC-FDM-OR0035 - CHECK UDF IMPLEMENTATION FOR DBMS_OUTPUT.PUT_LINE_UDF. **
CALL DBMS_OUTPUT.PUT_LINE_UDF(NVL(ID_VAR :: STRING, '') || ' ' || NVL(DEVICE_VAR :: STRING, ''))`);
$$;
다음 샘플의 경우 EXEC 호출은 object destructuring ID_VAR
stores 12와 함께 [12]를 반환합니다.
[ID_VAR] = EXEC(`SELECT ID FROM PUBLIC.HARDWARE WHERE COLOR = 'BLACK'`);
다음 2개의 EXEC 호출은 object destructuring을 사용하지 않는 이전 샘플의 대체 방법입니다.
ID_VAR = EXEC(`SELECT ID FROM PUBLIC.HARDWARE WHERE COLOR = 'BLACK'`)[0];
ID_VAR = EXEC(`SELECT ID FROM PUBLIC.HARDWARE WHERE COLOR = 'BLACK'`, {vars:1});
Object destructuring은 다음 문에서 볼 수 있듯이 바인딩과도 작동합니다(EXEC 호출은 [12, “MOUSE”] 값을 반환):
COLOR_VAR = `BLACK`;
[ID_VAR,DEVICE_VAR] = EXEC(`SELECT ID, DEVICE FROM PUBLIC.HARDWARE WHERE COLOR = ?`,[COLOR_VAR]);
Snowflake가 반환한 실제 결과 세트를 얻으려면 다음 구문을 사용할 수 있습니다.
let RESULT_SET_COPY;
RESULT_SET_COPY = EXEC(`SELECT * FROM PUBLIC.HARDWARE WHERE COLOR = 'BLACK'`, {row:1});
/* RETURNS
{
"COLOR": "BLACK",
"DEVICE": "MOUSE",
"ID": 12,
"getColumnCount": {},
...
"next": {}
}*/
레코드 유형 포함 EXEC¶
참고
사용자는 레코드 변환에 관심이 있을 수 있습니다.
Oracle
--Additional Params: -t JavaScript
CREATE OR REPLACE PROCEDURE EXECUTE_PROC AS
TYPE DEVTRECTYP IS RECORD (
ID NUMBER(4) NOT NULL := 0,
DEV_TYPE VARCHAR2(30) NOT NULL := 'UNKNOWN',
COLOR VARCHAR2(30) := 'GREEN'
);
DEV_VARIABLE DEVTRECTYP;
BEGIN
--STORES THE ROW VALUES IN THE RECORD
EXECUTE IMMEDIATE 'SELECT * FROM HARDWARE WHERE COLOR = ''BLACK''' INTO DEV_VARIABLE;
DBMS_OUTPUT.PUT_LINE(DEV_VARIABLE.ID || ' ' || DEV_VARIABLE.DEV_TYPE || ' ' || DEV_VARIABLE.COLOR);
END;
Snowflake
CREATE OR REPLACE PROCEDURE EXECUTE_PROC ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
class DEVTRECTYP {
ID = 0
DEV_TYPE = `UNKNOWN`
COLOR = `GREEN`
constructor() {
[...arguments].map((element,Index) => this[(Object.keys(this))[Index]] = element)
}
}
let DEV_VARIABLE = new DEVTRECTYP();
//STORES THE ROW VALUES IN THE RECORD
EXEC(`SELECT * FROM
HARDWARE
WHERE COLOR = 'BLACK'`,{
rec : DEV_VARIABLE
});
EXEC(`--** SSC-FDM-OR0035 - CHECK UDF IMPLEMENTATION FOR DBMS_OUTPUT.PUT_LINE_UDF. **
CALL DBMS_OUTPUT.PUT_LINE_UDF(NVL(? :: STRING, '') || ' ' || NVL(? :: STRING, '') || ' ' || NVL(? :: STRING, ''))`,[DEV_VARIABLE.ID,DEV_VARIABLE.DEV_TYPE,DEV_VARIABLE.COLOR]);
$$;
경고
이 작업은 아직 진행 중입니다. 레코드 값을 올바르게 저장하기 위한 변환은 다음과 같습니다.
EXEC(`SELECT * FROM PUBLIC.HARDWARE WHERE COLOR = 'BLACK'`, {rec:DEV_VARIABLE});
알려진 문제 ¶
문제가 발견되지 않았습니다.
암시적 커서 특성 헬퍼¶
개요¶
다음은 이 헬퍼를 사용하여 Snowflake 저장 프로시저 내에서 사용할 수 있는 특성입니다.
FOUND
NOTFOUND
ROWCOUNT
ISOPEN
Snowflake 코드의 프로시저 내부에서 이러한 특성의 초기화를 찾을 수 있습니다.
var SQL = {
FOUND : false,
NOTFOUND : false,
ROWCOUNT : 0,
ISOPEN : false
};
특성의 값: FOUND, NOTFOUND, ROWCOUNT 는 EXEC 헬퍼 내에서 업데이트됩니다..
ISOPEN 특성은 Oracle에서와 마찬가지로 항상 false입니다.
사용법 샘플¶
입력¶
--Additional Params: -t JavaScript
CREATE OR REPLACE PROCEDURE PROC1
IS
VAR1 VARCHAR(100) := '';
BEGIN
SELECT COL1 INTO VAR1 FROM TABLE1 WHERE COL1 = 1;
VAR1 := 'Rows affected: ' || TO_CHAR(SQL%ROWCOUNT);
VAR1 := 'Error: ' || SQLERRM;
PKG.TEST_PROC1(SQL%ROWCOUNT, SQL%FOUND, SQL%NOTFOUND);
PKG.TEST_PROC2(SQLCODE);
SELECT SQL%ROWCOUNT FROM DUAL;
END;
출력¶
CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
let VAR1 = undefined;
[VAR1] = EXEC(`SELECT
COL1
FROM
TABLE1
WHERE COL1 = 1`);
VAR1 = `Rows affected: ${concatValue((EXEC(`SELECT
TO_CHAR(?)`,[SQL.ROWCOUNT]))[0])}`;
VAR1 = `Error: ${concatValue(SQLERRM)}`;
EXEC(`CALL
PKG.TEST_PROC1(?, ?, ?)`,[SQL.ROWCOUNT,SQL.FOUND,SQL.NOTFOUND]);
EXEC(`CALL
PKG.TEST_PROC2(?)`,[SQLCODE]);
EXEC(`SELECT
?
FROM DUAL`,[SQL.ROWCOUNT]);
$$;
참고
SQLCODE 및 SQLERRM 은 같은 이름의 헬퍼 변수로 변환되며 커서 변수와 같은 방식으로 바인딩됩니다.
알려진 문제 ¶
문제가 발견되지 않았습니다.
관련 EWIs ¶
관련 EWIs 없음.
IS NULL 헬퍼¶
참고
사용자는 IS [NOT] NULL transformation.에도 관심이 있을 수 있습니다
IS NULL 헬퍼 함수 정의¶
이 헬퍼 메서드는 NULL 조건자를 변환하는 데 사용됩니다. 다른 헬퍼가 값이 null인지 확인하는 데도 사용됩니다. 이는 NaN 또는 빈 문자열과 같은 값을 null로 처리하는 데 필요합니다.
Oracle은 빈 문자열을 null 값으로 처리합니다. 이 헬퍼는 이러한 점을 고려합니다.
var IS_NULL = (arg) => !(arg || arg === 0);
연산자 헬퍼처럼¶
참고
사용자는 Like 연산자 변환에도 관심이 있을 수 있습니다
Like 연산자 헬퍼 함수 정의¶
function LIKE(expr,pattern,esc,cs) {
function fixPattern(pattern,esc) {
const specials = '/.*+?|(){}[]\\'.split('');
var newPattern = "";
var fix = (c) => specials.includes(c) ? '\\' + c : c;
for(var i = 0;i < pattern.length;i++) {
var c = pattern[i];
if (c === esc) {
newPattern += pattern[i + 1]
i++
} else if (c === '%') {
newPattern += ".*?"
} else if (c === '_') {
newPattern += "."
} else if (c === '[' || ']') {
newPattern += c
} else newPattern += fix(c)
}
return newPattern;
}
return new RegExp(`^${fixPattern(pattern,esc)}$`,cs ? '' : 'i').exec(expr) != null;
}
패키지 변수 헬퍼¶
참고
사용자는 변수 선언 및 프로시저 내부의 패키지 변수에도 관심이 있을 수 있습니다
패키지 변수 헬퍼 함수 정의¶
프로시저 내에서 패키지 변수를 사용하면 다음과 같은 헬퍼가 생성됩니다.
프로시저 내에서 패키지 변수를 사용하면 다음과 같은 헬퍼가 생성됩니다.
function StateManager(packageName,keepInCache) {
function getTypeChar(arg) {
if (arg instanceof Date) {
return "&";
} else if (typeof arg == "number") {
return "#";
} else if (IS_NULL(arg)) {
return "~";
} else {
return "$";
}
}
function deserialize(arg) {
if (arg === null) return undefined;
let prefix = arg[0];
let rest = arg.substr(1);
switch(prefix) {
case "&":return new Date(rest);
case "#":return parseFloat(rest);
case "$":return rest;
case "~":return undefined;
default:return arg;
}
}
function saveVar(varName,value) {
let varPackageName = `${packageName}.${varName}`;
let fixedValue = `${getTypeChar(value)}${fixBind(value)}`;
EXEC("SELECT SETVARIABLE(?,?)",[varPackageName,fixedValue]);
}
function readVar(varName) {
let varPackageName = `${packageName}.${varName}`;
return deserialize((EXEC("SELECT GETVARIABLE(?)",[varPackageName]))[0]);
}
this.saveState = function () {
let keys = Object.keys(this.cache);
for(let key of keys) {
saveVar(key,(this.cache)[key]);
}
}
this.cache = new Object();
let c = this.cache;
let rsProxy = new Proxy(this,{
get : function (target,prop,receiver) {
if (!target[prop]) {
c[prop] === undefined && (c[prop] = readVar(prop));
return c[prop];
}
return Reflect.get(...arguments);
},
set : function (target,prop,value) {
if (target[prop]) return;
c[prop] = value;
if (!keepInCache) {
saveVar(prop,value);
}
}
});
return rsProxy;
};
var PACKAGE_VARIABLES = new StateManager("PACKAGE_VARIABLES",true);
변수에 액세스하는 데 사용되는 각 패키지에 대해 헬퍼 인스턴스가 생성됩니다. 변수가 패키지 이름으로 정규화되지 않은 경우 패키지 이름으로 정규화됩니다.
프로시저가 끝나면 사용되는 변수의 상태가 헬퍼를 사용하여 저장됩니다.
다음 문에서는 변수 이름이 패키지 이름과 일치하도록 변경됩니다.
var PACKAGE_VARIABLES = new StateManager("PACKAGE_VARIABLES",true);
헬퍼 올리기¶
참고
사용자는 오류 및 예외 처리에 관심이 있을 수 있습니다
Raise 헬퍼 함수 정의¶
var RAISE = function (code,name,message) {
message === undefined && ([name,message] = [message,name])
var error = new Error(message);
error.name = name
SQLERRM = `${(SQLCODE = (error.code = code))}: ${message}`
throw error;
};
ROWTYPE 헬퍼¶
참고
사용자는 ROWTYPE 레코드 선언에 관심이 있을 수 있습니다.
ROWTYPE 헬퍼 함수 정의 ¶
var ROWTYPE = (stmt, binds = [], obj = new Object()) => {
EXEC(`SELECT * FROM (${stmt}) LIMIT 0`,binds);
for(let i = 1;i <= _RS.getColumnCount();i++)obj[_ROWS.getColumnName(i)] = null;
return obj;
};