Oracle PL/SQL如何从create或replace函数返回用户定义的记录

Oracle PL/SQL如何从create或replace函数返回用户定义的记录,oracle,plsql,oracle-sqldeveloper,Oracle,Plsql,Oracle Sqldeveloper,我正在努力学习PL/SQL 我似乎不明白如何创建一个函数并让它返回一个记录 我正在尝试这样做: create or replace FUNCTION getMovie(movieID number) RETURN record IS titleAndYear record(title varchar(100), production_Year number); BEGIN if (titleAndYear is null) then titleAndYear:= MovieTitle

我正在努力学习PL/SQL 我似乎不明白如何创建一个函数并让它返回一个记录

我正在尝试这样做:

create or replace FUNCTION getMovie(movieID number)
RETURN record IS titleAndYear record(title varchar(100), production_Year number);
BEGIN
  if (titleAndYear is null) then
    titleAndYear:= MovieTitleAndYear('',0);
  end if;
  select TITLE ,YEAR into titleAndYear.title ,titleAndYear.production_Year from movie where MOVIE_ID = movieID;
  return titleAndYear;
END;
我知道这不起作用,但我不知道为什么

编辑1: 我也试过:

create or replace TYPE MovieTitleAndYear is OBJECT(title varchar(100), production_Year number);
/
create or replace FUNCTION getMovie(movieID number)
RETURN MovieTitleAndYear IS titleAndYear MovieTitleAndYear;
BEGIN
  if (titleAndYear is null) then
    titleAndYear:= MovieTitleAndYear('',0);
  end if;
  select TITLE ,YEAR into titleAndYear.title ,titleAndYear.production_Year from movie where MOVIE_ID = movieID;
  return titleAndYear;
END;
但当我运行此语句时,结果是:

select 
GETMOVIE(
2540943 
) from dual;
变成这样

  GETMOVIE(2540943)
1 [DB_036.MOVIETITLEANDYEAR]

而不是两个column title和productionyear。

使用记录的第一个示例将不起作用。对于start,函数不能返回仅在函数内部声明的类型的值。您可以尝试将记录类型声明移动到包中,但即使随后获得要编译的函数,运行查询select getMovie2540943 from dual将返回ORA-00902 invalid datatype错误

因此,我建议您改用类型

如果使用类型,则要分别获取电影和年份,需要分别访问类型中的字段,例如:

select getMovie(2540943).title, getMovie(2540943).production_year from dual
或者,如果希望避免调用getMovie两次,可以使用子查询:

注意,我们需要为子查询使用别名。以下内容将给出ORA-00904:MOVIE\u INFO.PRODUCTION\u YEAR:无效标识符错误:

这里的问题是Oracle正在查询中查找表movie_info,但找不到。它没有意识到电影信息实际上是一个专栏。如果我们引入别名x,Oracle就会意识到x.movie_info是一个列,因此x.movie_info.title是列中某个类型内的字段

试试这种方法。我想你的答案就在这个片段中。允许 我知道这是否有用


我真的被困在这里了,任何帮助,即使是指针,都会非常感激的。我甚至不知道解决这个问题需要看哪个方向或关键词。你的第二种方法几乎不错。它返回所需的记录,但结果只是您定义的PL/SQL类型的对象。您需要在SQL中使用FROM TABLE子句创建一个流水线函数来检索结果。
select x.movie_info.title, x.movie_info.production_year from (select getMovie(2540943) as movie_info from dual) x;
select movie_info.title, movie_info.production_year from (select getMovie(2540943) as movie_info from dual);
--Create object type
CREATE OR REPLACE type av_obj_test
IS
  object
  (
    col1 VARCHAR2(100),
    col2 VARCHAR2(100) );


--C reate table type    
CREATE OR REPLACE type av_ntt_test
IS
  TABLE OF av_obj_test;


--Createfunction
CREATE OR REPLACE FUNCTION AV_RECORD RETURN 
AV_NTT_TEST
AS
av_record av_ntt_test;
BEGIN
NULL;
SELECT av_obj_test(LEVEL,'av'||LEVEL) BULK COLLECT INTO av_record FROM DUAL
CONNECT BY LEVEL < 10;
RETURN av_record;
END;


--Calling function
SELECT * FROM TABLE(AV_RECORD);

--------------------------------OUTPUT-------------------------------------

COL1    COL2
1       av1
2       av2
3       av3
4       av4
5       av5
6       av6
7       av7
8       av8
9       av9


-------------------------------OUTPUT----------------------------------------