큰 데이터 세트를 모으고 있습니다. 관리 가능한 쿼리의 반환 시간을 유지하고 Oracles의 목록 내 제한 사항 인 1000 개 항목을 유지하기 위해 하나의 키 집합을 제외하고 동일한 여러 쿼리를 실행하고 있습니다. PL / SQL은 쿼리를 컴파일하고 런타임에 제출 된 항목을 변경할 수있게 해주는 '바인드 변수'를 지원합니다. 이렇게하면 응답 속도가 크게 향상됩니다. JSL에서이 작업을 수행 할 수있는 방법이 있습니까? 예제 쿼리는 다음과 같습니다.
고르다
날짜, 시간, 온도, 일련 번호
에서
Data_Table
어디에
SerialNum IN ( '1234', '2345'.....) 그러나 이들 중 수천 개)
고맙습니다
레이
목록에서 1000 개 요소 사이의 UNION을 사용하여 하나의 SQL 문에서 모든 작업을 수행 할 수 있습니다. 이 함수는 다음을 수행합니다.
//------------------------------------------------------------------------------
/*
Function Name: get_sql_in_list
Description: Build an IN list from the list provided. If there are more than 1000
items in the list, separate them into 1000-element chunks connected
via UNION to avoid the 1000 limit in Oracle.
If the elements are of type String, single quotes will be replaced with
two single quotes, and single quotes will be put around each item.
Sample calls:
// List of Case IDs
case_id_list = {111, 222, 333, 444, 555};
preamble = "(SELECT ci1.case_id FROM jnjdss.case_info ci1 WHERE ci1.case_id IN (";
x = get_sql_in_list(case_id_list, preamble);
Returns: "((SELECT ci1.case_id FROM jnjdss.case_info ci1 WHERE ci1.case_id IN (111,222,333,444,555)))"
// List of product names
product_list = {"aaaaaaa", "bbbbbbbb", "cccccccc", "dddddddd"};
preamble = "(SELECT rc1.alert_name FROM brmsupport.rts_calendar rc1 WHERE rc1.alert_name IN (";
z = get_sql_in_list(product_list, preamble);
Returns: "((SELECT rc1.alert_name FROM brmsupport.rts_calendar rc1 WHERE rc1.alert_name IN ('aaaaaaa','bbbbbbbb','cccccccc','dddddddd')))"
Arguments:
_item_list List of items to create an IN list from
_preamble SQL string to preface the IN list with
Version Date Author Details of revision
--------------------------------------------------------------------------------
1.0 05-May-2016 Peter Mroz First Draft
*/
get_sql_in_list = function({_item_list, _preamble},
{Default Local},
pname = "get_sql_in_list";
nr = nitems(_item_list);
if (nr < 0,
throw("Empty list");
);
_sql_in_list = _preamble;
one_type = type(_item_list[1]);
if (one_type == "String",
single_quotes = 1;
// for strings replace single quotes with two single quotes
for (i = 1, i <= nr, i++,
one_item = _item_list[i];
if (contains(one_item, "'"),
_item_list[i] = substitute(one_item, "'", "''");
)
);
,
single_quotes = 0;
);
// This is the Oracle limit for IN lists
max_items = 1000;
keep_going = 1;
istart = 1;
iend = min(max_items, nr);
while(keep_going,
if (single_quotes,
// Convert a portion of the list to an IN list with each element surrounded by single quotes
if (nr > 1,
_sql_in_list = _sql_in_list || "'" || concat items(_item_list[istart::iend], "','") || "'";
,
_sql_in_list = _sql_in_list || "'" || _item_list[istart::iend] || "'";
)
,
// Convert a portion of the list to a string
one_segment = char(_item_list[istart::iend]);
// Strip off the leading and trailing curly braces
if (nr > 1,
_sql_in_list = _sql_in_list || substr(one_segment, 2, length(one_segment) - 2);
,
_sql_in_list = _sql_in_list || one_segment;
);
);
istart = istart + max_items;
iend = min(nr, (iend + max_items));
if (istart <= nr,
// then
_sql_in_list = _sql_in_list || ")) UNION " || _preamble;
,
// else we're done
keep_going = 0;
);
);
// Wrap it up
_sql_in_list = "(" || _sql_in_list || ")))";
); // end get_sql_in_list