2011-09-22 7 views
0

이 객체와 테이블 유형 유무 : 내가 기능 getEmp 및 인수 이름을 가진 고용주를 얻을 수있는 방법개체 멤버 프로 시저에서 중첩 테이블 특성을 호출하는 방법은 무엇입니까?

CREATE TYPE Person_typ AS OBJECT 
( 
    name CHAR(20), 
    ssn CHAR(12), 
    address VARCHAR2(100) 
); 

CREATE TYPE Person_nt IS TABLE OF Person_typ; 

CREATE TYPE dept_typ AS OBJECT 
( 
    mgr Person_typ, 
    emps Person_nt, 
    MEMBER PROCEDURE getEmp(name IN CHAR(20)), 
); 

CREATE TABLE dept OF dept_typ; 

?

CREATE TYPE BODY dept_typ AS 
    MEMBER PROCEDURE getEmp(name IN CHAR(20)), 
    BEGIN 
     ????? What i put where ???? 
    END; 
END; 

내 문제는 ....

덕분에 내가 self.mgr로 할 수있는 것처럼 내가 self.emps을 할 수 없습니다 ... 왜 내가 아는 없다는 것입니다, 주앙

답변

0

내 생각 엔이

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE TYPE dept_typ AS OBJECT 
    2 (
    3  mgr Person_typ, 
    4  emps Person_nt, 
    5  MEMBER FUNCTION getEmp(p_name IN VARCHAR2) 
    6    RETURN person_typ 
    7*); 
SQL>/

Type created. 

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE TYPE BODY dept_typ AS 
    2  MEMBER FUNCTION getEmp(p_name IN VARCHAR2) 
    3    RETURN person_typ 
    4  AS 
    5  BEGIN 
    6   for i in 1 .. self.emps.count() 
    7   loop 
    8   if(self.emps(i).name = p_name) 
    9   then 
10    return self.emps(i); 
11   end if; 
12   end loop; 
13  END; 
14* END; 
SQL>/

Type body created. 
  1. 당신이 getEmp 뭔가를 반환 할 경우, 함수해야 뭔가를 원하는 것입니다. 또한 OUT 매개 변수가있는 프로 시저로 정의 할 수도 있지만 일반적으로 원하는 것은 아닙니다.
  2. 입력 및 출력 매개 변수에는 길이가 없습니다. 매개 변수를 CHAR (20)로 선언 할 수 없습니다. CHAR 또는 길이가없는 VARCHAR2로 선언 할 수 있습니다. 그러나 VARCHAR2보다 CHAR가 선호되는 사례는 거의 없으며 종업원 이름은 분명히 가까운 사례 중 하나가 아닙니다.
  3. 형식 스펙 또는 유형 본문에 멤버 함수 또는 프로 시저가 선언 된 후에는 쉼표가 없습니다. 또한 유형 본문의 멤버 함수 또는 프로 시저 정의에 IS 또는 AS이 필요합니다.
  4. PERSON_NT은 모음이므로 모음을 반복해야합니다. 이 코드에서는 콜렉션이 빽빽하다고 가정합니다. 컬렉션의 FIRST 및 NEXT 메서드를 사용하여 스파 스 컬렉션의 요소를 반복 할 수도 있습니다.

정말 컬렉션에서 선택하려면 TABLE 연산자를 사용해야합니다. 그러나이 방법은 단순히 컬렉션을 반복하는 것보다 효율적이지 않으며 일반적으로 성가시다. 컬렉션에 요소를 추가하려면

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE TYPE BODY dept_typ AS 
    2  MEMBER FUNCTION getEmp(p_name IN VARCHAR2) 
    3    RETURN person_typ 
    4  AS 
    5  BEGIN 
    6   for i in (select * from table(self.emps)) 
    7   loop 
    8   if(i.name = p_name) 
    9   then 
10    return new person_typ(i.name, i.ssn, i.address); 
11   end if; 
12   end loop; 
13  END; 
14* END; 
SQL>/

Type body created. 

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE TYPE dept_typ AS OBJECT 
    2 (
    3  mgr Person_typ, 
    4  emps Person_nt, 
    5  MEMBER FUNCTION getEmp(p_name IN VARCHAR2) 
    6    RETURN person_typ, 
    7  MEMBER PROCEDURE addEmp(p_person IN person_typ) 
    8*); 
SQL>/

Type created. 

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE TYPE BODY dept_typ AS 
    2  MEMBER FUNCTION getEmp(p_name IN VARCHAR2) 
    3    RETURN person_typ 
    4  AS 
    5  BEGIN 
    6  for i in 1 .. self.emps.count() 
    7  loop 
    8   if(self.emps(i).name = p_name) 
    9   then 
10   return self.emps(i); 
11   end if; 
12  end loop; 
13  END; 
14 MEMBER PROCEDURE addEmp(p_person IN person_typ) 
15 AS 
16 BEGIN 
17  self.emps.extend(); 
18  self.emps(self.emps.count) := p_person; 
19 END; 
20* END; 
SQL>/

Type body created. 
+0

ok ... 많이 고마워요.하지만 왜이게 작동하지 않는지 설명해 주시겠습니까? select * from self.emps; (당연한 기능) .. 그것은 테이블이나 뷰가 없다고 말하지만 동일한 "self.emps"를 사용하고 itworked ... – joao

+0

@joao -'EMPS'는 테이블이 아닌 콜렉션이므로 직접 선택할 수 없습니다. 당신은'TABLE' 연산자를 사용할 수 있습니다 (즉, SELECT * FROM TABLE (self.emps)), PL/SQL 컬렉션을 SQL 가상 시스템으로 전달한 다음 SQL 가상 시스템에서 PL/SQL 가상 시스템으로 반환 된 결과 만 가져올 것입니다. PL/SQL에 머무르고 컬렉션을 반복하는 것이 더 효율적입니다. –

+0

ok ... \t select * from table (self.emps); did not work too ... (INTO 절이 SELECT 문에서 예상됩니다.) .... 감사합니다. 이제 이해합니다! 그래서 ... 마지막 질문 하나 ... 컬렉션에 커서를 올려 놓을 수 있습니까? – joao

0

난 그냥 한 EMP 테이블에서 선택해야한다고 가정


member function getEmp (emp_name in char(20)) return Person_typ IS 
    declare 
    res Person_typ; 
    begin 
    select value (e) into res from self.emps e where e.name = emp_name; 
    return Person_typ; 
    end; 

there's more

+0

난 이미 문서를 읽어 (컬렉션은 이전에 초기화 된 가정) ... 그리고 난 이 내게 줄 ... 아무것도 얻을 항상이 오류 : ORA-00942 테이블 또는 뷰가 존재하지 않습니다. – joao

+0

그리고 모든 self.emps를 얻고 싶다면 ??? select * from self.emps; 도 작동하지 않았습니다 :-( – joao

관련 문제