0

다른 사용자 정의 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의 내 사용자 정의 테이블에 참여할 수있는 방법을 안내 할 수 오라클 테이블?

+0

내가 임시 테이블을 만들 수 없습니다 우리는 바와 같이, 그것으로 모든 matching_criteria_list를 넣어 다중 스레드 응용 프로그램에서 SP를 호출 할 수 있습니다. –

+0

오라클은'DATETIME' 데이터 타입을 가지고 있지 않습니다.'DATE' (years to seconds) 또는'TIMESTAMP' (years to fractional seconds와 optional time zone)를 가지고 있습니다. – MT0

답변

0

이것은 나를 위해 일했습니다. 감사.

SELECT * FROM EMPLOYEE EMP 
INNER JOIN TABLE(IN_CRITERIA_LIST) MCL ON 
EMP.DOB = MCL.DOB 
AND EMP.SALARY = MCL.SALARY 
ORDER BY TD.TRANS_DASHBOARD_ID DESC; 
0

당신은 IDTYPE 개체 또는 모든 PL/SQL 루프를 필요로 (또는 결합)하지 않습니다

CREATE OR REPLACE PROCEDURE GET_FILTERED_EMPLOYEE (
    IN_CRITERIA_LIST IN  MATCHING_CRITERIA_LIST, 
    CUR_OUT   OUT  sys_refcursor 
) 
IS 
BEGIN 
    OPEN CUR_OUT FOR 
    SELECT * 
    FROM EMPLOYEE 
    WHERE CRITERIA(dob, salary) MEMBER OF IN_CRITERIA_LIST; 
END; 
/
+0

위의 기준 (dob, salary)은 EMPLOYEE 테이블의 각 열에 어떻게 매핑됩니까? 위의 대답과 같이 조인을 쓰는 것을 의미합니까? –

+0

@shrutisingh 조인이 없습니다. 바인드 매개 변수로 전달 된 컬렉션에 대한 필터 일뿐입니다. – MT0

+0

@shrutisingh 'SELECT * FROM EMPLOYEE WHERE CRITERIA (dob, salary) MEMBER OF MATCHING_CRITERIA_LIST (기준 (1970-01-01, 20000))'에 대한 설명 계획을보고 조인이 없음을 볼 수 있습니다. – MT0