Plsql 从PL/SQL函数返回表-数据类型不正确
我的函数有问题,应该返回一个表。但是,当我想要运行这个函数时,返回错误“不正确的数据类型”。无论如何,程序包正在正确编译 我不知道问题出在哪里 这是我的密码:Plsql 从PL/SQL函数返回表-数据类型不正确,plsql,Plsql,我的函数有问题,应该返回一个表。但是,当我想要运行这个函数时,返回错误“不正确的数据类型”。无论如何,程序包正在正确编译 我不知道问题出在哪里 这是我的密码: create or replace package PKG_BORROW as type advertisement_header is record( id_advertisment number, title varchar2(100), date_added timestamp,
create or replace package PKG_BORROW as
type advertisement_header is record(
id_advertisment number,
title varchar2(100),
date_added timestamp,
username varchar2(100),
regionName varchar2(100),
id_category number
);
type adv_head_tab is table of advertisement_header;
enter code here
function get_adv_header_filter
(title varchar2,username varchar2,regionName varchar2,categoryName varchar2)
return adv_head_tab;
end ;
/
create or replace package body PKG_BORROW
as
function get_adv_header_filter
(title varchar2,username varchar2,regionName varchar2,categoryName varchar2)
return adv_head_tab as
l_tab adv_head_tab := adv_head_tab();
query varchar2(500);
TYPE CurTyp IS REF CURSOR;
v_adv_cursor CurTyp;
begin
query:='select a.id_advertisement,a.title,a.date_added,a.id_user,r.name,i.id_item_category from advertisement a,region r,item_category i
where a.id_region=r.id_region and a.id_item_category=i.id_item_category ';
open v_adv_cursor for query;
loop
fetch v_adv_cursor into l_tab(l_tab.last);
exit when v_adv_cursor%NOTFOUND;
end loop;
close v_adv_cursor;
dbms_output.put_line(l_tab(1).title);
return l_tab;
end;
end ;
/
select * from TABLE(PKG_BORROW.get_adv_header_filter('a','a','a','a'));
/
declare
TYPE CurTyp IS REF CURSOR;
v_adv_cursor CurTyp;
begin
open v_adv_cursor for PKG_BORROW.get_adv_header_filter('a','a','a','a');
end;
更新:我简化了我的代码,但仍然有00902错误“无效数据类型”。我在下面展示的新代码:
create or replace package PKG_BORROW as
type adv_head_tab is table of ADVERTISEMENT%ROWTYPE;
function get_adv_header_filter
return adv_head_tab;
end ;
/
create or replace package body PKG_BORROW
as
function get_adv_header_filter
return adv_head_tab as
l_tab adv_head_tab := adv_head_tab();
query varchar2(500);
TYPE CurTyp IS REF CURSOR;
v_adv_cursor CurTyp;
begin
query:='select * from ADVERTISEMENT';
open v_adv_cursor for query;
fetch v_adv_cursor bulk collect into l_tab;
close v_adv_cursor;
for rec in 1..l_tab.count
loop
dbms_output.put_line(l_tab(rec).title);
end loop;
return l_tab;
end;
end ;
/
select * from TABLE(PKG_BORROW.get_adv_header_filter);
关于无效数据类型的错误仍然存在。您的函数有问题。您正在尝试将光标值插入循环中的集合。你需要做批量收集。见下文:
function get_adv_header_filter
(title varchar2,username varchar2,regionName varchar2,categoryName varchar2)
return adv_head_tab as
l_tab adv_head_tab := adv_head_tab();
query varchar2(500);
TYPE CurTyp IS REF CURSOR;
v_adv_cursor CurTyp;
begin
query:='select a.id_advertisement,a.title,a.date_added,a.id_user,r.name,i.id_item_category from advertisement a,region r,item_category i
where a.id_region=r.id_region and a.id_item_category=i.id_item_category ';
open v_adv_cursor for query;
fetch v_adv_cursor bulk collect into l_tab;
close v_adv_cursor;
for rec in 1..l_tab.count
loop
dbms_output.put_line(l_tab(rec).title);
end loop;
return l_tab;
end;
PL/SQL表不是游标。感谢您的回答-您的固定代码可以工作。我还有一个问题-你看到我代码底部的select了吗?此选择的执行未运行->无效数据类型错误,因此我无法运行它。函数调用中的参数并不重要,只是我想运行这种类型的select。当我将我的结构放在架构级别时,我得到了这样的错误:“不一致的数据类型:预期的%s得到了%s”。提前感谢。请检查您的
记录
列数据类型是否与select语句中选择的列匹配。