2017-12-23 7 views
1

나는 1968 년 이후 모든 직원을 돌려 줄 사용자 정의 함수를 생성해야한다고 지정했다. 내 코드는 다음과 같다 :Oracle PL/SQL에서 중첩 테이블을 어떻게 표시합니까?

처음에는 emp_dobs라는 새 객체를 만들어 직원 '이름, 성, 생년월일, 원래 직원 테이블과 같은 데이터 유형을 사용 :

다음
CREATE OR REPLACE TYPE emp_dobs AS OBJECT (
    emp_fname VARCHAR2(20), 
    emp_lname VARCHAR2(20), 
    emp_dob DATE 
); 
/

내가 emp_dobs의 테이블로 emp_dobs_nested 만들 :

CREATE OR REPLACE TYPE emp_dobs_nested AS TABLE OF emp_dobs; 
/

마지막으로, 내가 만들 함수 th emp_dobs_nested 테이블을 반환 해야하는에서 :

CREATE OR REPLACE FUNCTION get_emp_dobs RETURN emp_dobs_nested 
AS 
    dobs emp_dobs_nested; 
BEGIN 
    SELECT emp_dobs(firstname, lastname, birthdate) BULK COLLECT INTO dobs 
    FROM employee 
    WHERE birthdate < TO_DATE('01-JAN-1968', 'DD-MON-YYYY'); 
    RETURN dobs; 
END; 
/

이 오라클 SQL 개발자가 표시된 새 탭이 표시됩니다 다만, emp_dob_nested의 컴파일 이상한 특질이다 "출력 변수 - 로그,"만 EMP_FNAME 및 EMP_LNAME을 보여줍니다. 그럼에도 불구하고 모든 것이 컴파일됩니다.

는 지금은 기능을 테스트하고 작동하는지 증명하기 위해 그 결과를 표시 할,하지만 난 때이 :

Error report - 
ORA-06550: line 5, column 5: 
PLS-00306: wrong number or types of arguments in call to 'PUT_LINE' 
ORA-06550: line 5, column 5: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

내가 놓친 게 무엇 :

DECLARE 
    dobs emp_dobs_nested; 
BEGIN 
    dobs := get_emp_dobs; 
    DBMS_OUTPUT.PUT_LINE(dobs); 
END; 
/

나는이 오류 이리? 감사.

답변

3

전체 모음을 DBMS_OUTPUT으로 전달할 수는 없지만 루프를 통해 반복하여 각 색인에 개별 열을 표시해야합니다.

DECLARE 
    dobs emp_dobs_nested; 
BEGIN 
    dobs := get_emp_dobs; 
    FOR i IN 1..dobs.COUNT 
    LOOP 
    DBMS_OUTPUT.PUT_LINE(dobs(i).emp_fname||','||dobs(i).emp_lname||','||dobs(i).emp_dob); 
    END LOOP; 
END; 
/
1

또한 관계형 결과 집합으로 개체의 컬렉션을 unnest하기 위해 표 기능을 사용할 수 있습니다

select * from table(get_emp_dobs) 

라이브 데모 : http://sqlfiddle.com/#!4/8cfb2/1

1

가 왜이보기를 대신 생성하지? 영업 이익은 "할당"이 있기 때문에

CREATE VIEW emp_view 
AS 
SELECT firstname, lastname, birthdate 
    FROM employee 
WHERE birthdate < TO_DATE('01-JAN-1968', 'DD-MON-YYYY'); 

당신이 시도 할 수 있습니다,

DECLARE 
    dobs emp_dobs_nested; 
    i NUMBER := 0; 
BEGIN 
    dobs := get_emp_dobs; 
    LOOP 
     i := dobs.NEXT(i); 
     DBMS_OUTPUT.PUT_LINE(dobs(i).emp_fname||','||dobs(i).emp_lname||','||dobs(i).emp_dob); 
     IF i = dobs.LAST THEN 
      EXIT; 
     END IF; 
    END LOOP; 
END; 
/
+0

시도 - 클래스 할당을 의미를, 그/그녀는 PL/SQL 클래스를 사용하고 있음을 의미합니다. 그는 PL/SQL 기술을 연습해야합니다. – mathguy

+0

아, 알았어, 내 업데이트 된 답변을 시도해 볼 수도 있습니다. 위의 승인 된 답변과 유사하게 보일 수 있습니다. – eifla001

0
디스플레이의 또 다른 방법은 XML을 사용하는 것입니다

,

DBMS_OUTPUT.PUT_LINE(XMLTYPE(dobs)); 
관련 문제