如何在Oracle - PL / SQL中显示嵌套表?

时间:2017-12-23 03:18:48

标签: oracle plsql

我有一项任务,我应该创建一个用户定义的函数,该函数将在1968年之后返回所有员工。我的代码如下:

首先,我创建了一个名为emp_dobs的新对象来保存员工。姓名,姓氏和出生日期,使用与原始员工表相同的数据类型:

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

然后我创建emp_dobs_nested作为emp_dobs表:

CREATE OR REPLACE TYPE emp_dobs_nested AS TABLE OF emp_dobs;
/

最后,我创建了一个应该返回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将显示一个标签为&#34;输出变量 - 日志,&#34;并且只显示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:

我在这里缺少什么?感谢。

4 个答案:

答案 0 :(得分: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 :(得分:1)

您还可以使用TABLE函数来取消对象集合到关系结果集中:

select * from table( get_emp_dobs ) 

现场演示:http://sqlfiddle.com/#!4/8cfb2/1

答案 2 :(得分:1)

为什么不创建视图呢?

    let headerImageView = UIImageView.init(frame: Frame)

    headerImageView.image = Image

    self.tableView.tableHeaderView = headerImageView

你也可以试试这个,

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

答案 3 :(得分:0)

另一种显示方式是使用XML,尝试

DBMS_OUTPUT.PUT_LINE(XMLTYPE(dobs));