다른 사용자 정의 Oracle 유형 MATCHING_CRITERIA_LIST를 사용하여 EMPLOYEE 테이블에 참여하고 싶습니다. MATCHING_CRITERIA_LIST는 사용자 지정 Oracle 유형의 CRITERIA 테이블입니다. 모든 DDL은 다음과 같이오라클 데이터베이스 테이블에 사용자 정의 유형의 테이블이 있습니다.
CREATE OR REPLACE
type CRITERIA as object (
DOB DATETIME,
SALARY NUMBER
);
CREATE OR REPLACE TYPE
MATCHING_CRITERIA_LIST IS TABLE OF CRITERIA;
CREATE TABLE EMPLOYEE{
ID NUMBER PRIMARY KEY NOT NULL,
NAME VARCHAR(20 BYTE),
DOB DATETIME,
SALARY NUMBER
}
내가 실제로 달성하려고하는 것은,
var allEmployeeList = new List<Employee>();
var filteredList = new List<Employee>();
var matchingCriteria = new List<MatchingCritera>{
new MatchingCritera(){DOB = <date1>, salary = <sal1>},
new MatchingCritera(){DOB = <date2>, salary = <sal2>},
new MatchingCritera(){DOB = <date3>, salary = <sal1>}
}
foreach(var emp in allEmployeeList)
{
foreach(var criteria in matchingCriteria)
{
if(emp.DOB == criteria.DOB && emp.salary = criteria.salary)
{
filteredList.Add(emp);
}
}
}
나는이 같은 논리는 SP에 있어야합니다. 나는 현재 잘하고있는 다음과 같이하고있다.
CREATE OR REPLACE
type IDTYPE as object (
id NUMBER
);
CREATE OR REPLACE
type IDTABLETYPE IS TABLE OF IDTYPE;
CREATE OR REPLACE PROCEDURE GET_FILTERED_EMPLOYEE (
IN_CRITERIA_LIST IN MATCHING_CRITERIA_LIST,
CUR_OUT OUT sys_refcursor
)
IS
V_ID_TABLE IDTABLETYPE;
V_TEMP_ID_COLL EMPLOYEE_ID;
BEGIN
V_ID_TABLE := IDTABLETYPE();
V_TEMP_ID_COLL := EMPLOYEE_ID();
IF IN_CRITERIA_LIST.COUNT > 0 THEN
FOR i IN IN_CRITERIA_LIST.FIRST .. IN_CRITERIA_LIST.LAST
LOOP
SELECT EMP.ID BULK COLLECT INTO V_TEMP_ID_COLL FROM EMPLOYEE EMP WHERE
EMP.DOB = IN_CRITERIA_LIST(i).DOB
AND EMP.SALARY = IN_CRITERIA_LIST(i).SALARY
ORDER BY EMP.ID DESC;
IF (V_TEMP_ID_COLL.COUNT > 0) THEN
FOR j IN V_TEMP_ID_COLL.FIRST .. V_TEMP_ID_COLL.LAST
LOOP
V_ID_TABLE.extend();
V_ID_TABLE(V_ID_TABLE.count) := IDTYPE(TO_NUMBER(V_TEMP_ID_COLL(j)));
END LOOP;
END IF;
END LOOP;
END IF;
OPEN CUR_OUT FOR
SELECT * FROM EMPLOYEE EMP WHERE EMP.ID IN (SELECT * FROM TABLE(V_ID_TABLE));
END;
나는 다음과 같은 것을는 성능에 영향을 미치는 한, IN_CRITERIA_LIST에 for 루프를 제거하고 싶지 :
이SELECT * FROM EMPLOYEE EMP
INNER JOIN MATCHING_CRITERIA_LIST MCL ON
EMP.DOB = MCL.DOB
AND EMP.SALARY = MCL.SALARY
ORDER BY TD.TRANS_DASHBOARD_ID DESC;
누군가가 내가 함께 UDT의 내 사용자 정의 테이블에 참여할 수있는 방법을 안내 할 수 오라클 테이블?
내가 임시 테이블을 만들 수 없습니다 우리는 바와 같이, 그것으로 모든 matching_criteria_list를 넣어 다중 스레드 응용 프로그램에서 SP를 호출 할 수 있습니다. –
오라클은'DATETIME' 데이터 타입을 가지고 있지 않습니다.'DATE' (years to seconds) 또는'TIMESTAMP' (years to fractional seconds와 optional time zone)를 가지고 있습니다. – MT0