Plsql 如何使用表函数
我试图使用tabel函数,但创建此块后:Plsql 如何使用表函数,plsql,Plsql,我试图使用tabel函数,但创建此块后: create table tmp_ft (field VARCHAR2 ( 1000 )); DECLARE TYPE names_nt IS TABLE OF VARCHAR2 ( 1000 ); FUNCTION lotsa_names ( base_name_in IN VARCHAR2 , count_in IN INTEGER ) RETURN names_nt IS
create table tmp_ft
(field VARCHAR2 ( 1000 ));
DECLARE
TYPE names_nt IS TABLE OF VARCHAR2 ( 1000 );
FUNCTION lotsa_names (
base_name_in IN VARCHAR2
, count_in IN INTEGER
)
RETURN names_nt
IS
retval names_nt := names_nt ( );
BEGIN
retval.EXTEND ( count_in );
FOR indx IN 1 .. count_in
LOOP
retval ( indx ) := base_name_in || ' ' || indx;
END LOOP;
RETURN retval;
END lotsa_names;
BEGIN
insert into tmp_ft
SELECT *
FROM TABLE ( lotsa_names ( 'Steven', 5 )) ;
END;
/
我得到以下错误:
ORA-06550: line 26, column 15:
PLS-00231: function 'LOTSA_NAMES' may not be used in SQL
为什么??看起来一切正常,但我不明白为什么它不起作用
谢谢 因为您正在使用的函数和类型是在匿名块的本地定义的。因此,它们不能在该区块外使用。在Oracle中,SQL和PLSQL有单独的引擎。因此,任何SQL实际上都是在块之外运行的。您需要在模式级别定义类型和函数
create table tmp_ft
(field VARCHAR2 ( 1000 ));
create type names_nt is table of varchar2 ( 1000 );
create or replace
function lotsa_names (
base_name_in in varchar2
, count_in in integer
)
return names_nt
is
retval names_nt := names_nt ( );
begin
retval.extend ( count_in );
for indx in 1 .. count_in
loop
retval ( indx ) := base_name_in || ' ' || indx;
end loop;
return retval;
end lotsa_names;
--==========测试==============
begin
insert into tmp_ft
select *
from table ( lotsa_names ( 'Steven', 5 )) ;
end;
select * from tmp_ft;
因为您使用的函数和类型是在匿名块的本地定义的。因此,它们不能在该区块外使用。在Oracle中,SQL和PLSQL有单独的引擎。因此,任何SQL实际上都是在块之外运行的。您需要在模式级别定义类型和函数
create table tmp_ft
(field VARCHAR2 ( 1000 ));
create type names_nt is table of varchar2 ( 1000 );
create or replace
function lotsa_names (
base_name_in in varchar2
, count_in in integer
)
return names_nt
is
retval names_nt := names_nt ( );
begin
retval.extend ( count_in );
for indx in 1 .. count_in
loop
retval ( indx ) := base_name_in || ' ' || indx;
end loop;
return retval;
end lotsa_names;
--==========测试==============
begin
insert into tmp_ft
select *
from table ( lotsa_names ( 'Steven', 5 )) ;
end;
select * from tmp_ft;
如果以上解决了您的问题,请接受答案。如果没有,那么剩下的问题是什么。请不要只留下问题不回答。如果上述问题解决了你的问题,请接受答案。如果没有,那么剩下的问题是什么。请不要只留下这个问题没有回答。