我有一项任务,我应该创建一个用户定义的函数,该函数将在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:
我在这里缺少什么?感谢。
答案 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 )
答案 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));