2017-12-23 10 views
1

私は1968年以降にすべての従業員を返すユーザ定義関数を作成することになっています。Oracle PL/SQLでネストした表を表示するにはどうすればよいですか?

まず、emp_dobsという名前の新しいオブジェクトを作成して従業員を保持します「FIRSTNAME、LASTNAME、および生年月日、元従業員表と同じデータ型を使用して:私が作成し、

CREATE OR REPLACE TYPE emp_dobs_nested AS TABLE OF 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作成関数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; 
/

emp_dob_nestedコンパイルとの奇妙な癖がありますが、しかし、どこのOracle SQL Developerは、「出力変数 - ログインし、」ラベルされた新しいタブが表示され、唯一EMP_FNAMEとemp_lnameのを示しています。それにもかかわらず、すべてがコンパイルされます。

今、私は機能をテストし、それが動作することを証明するためにその結果を表示したいが、私はこれをしようとすると:

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

私はこのエラーを取得する:

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: 

は、私が何をしないのですここに?ありがとう。

答えて

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

また、リレーショナル結果セットにオブジェクトのコレクションをネスト解除するには、表関数を使用することができます。

select * from table(get_emp_dobs) 

ライブデモ:http://sqlfiddle.com/#!4/8cfb2/1

1

はなぜ代わりにビューを作成していませんか? OPは "割り当て" があるので

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)); 
関連する問題