Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Plsql 如何使用表函数_Plsql - Fatal编程技术网

Plsql 如何使用表函数

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

我试图使用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  
   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;

如果以上解决了您的问题,请接受答案。如果没有,那么剩下的问题是什么。请不要只留下问题不回答。如果上述问题解决了你的问题,请接受答案。如果没有,那么剩下的问题是什么。请不要只留下这个问题没有回答。