大家帮我看看这段代码

时间:2021-09-11 21:06:40
create or replace package PROC_QUESTION_HALF is

  -- Author  : Jamin.Zhang
  -- Created : 2010-10-22 15:38:14
  -- Purpose : 半年后问卷
  -- Public type declarations
  type p_cursor is ref cursor;
  type t_ret_table is table of varchar2(4000);--用于pl/sql中的split()功能

 function get_pwd(
            t varchar2
            )return varchar2;
 function split_str(var_str   in varchar2,
                    var_split in varchar2)
   return t_ret_table;

  function str2tbl( p_str in varchar2 )
  return choicetype ;


------------------create or replace package body PROC_QUESTION_HALF is 中对应的代码-----------------


--转换in的条件

--处理字符串
--p_str  like 'a,b,c,d'
function str2tbl( p_str in varchar2 )
return choicetype
   as
        l_str   long default p_str || ',';
        l_n        number;
        l_data    choicetype  := choicetype();
    begin
        loop
            l_n := instr( l_str, ',' );
            exit when (nvl(l_n,0) = 0);
          l_data.extend;
          l_data( l_data.count ) := ltrim(rtrim(substr(l_str,1,l_n-1)));
          l_str := substr( l_str, l_n+1 );
      end loop;
      return l_data;
  end;

--------------------------------------------------------------------------------------------------
问题是在package 中没有声明choicetype
而在package body 中却使用了choicetype 
在创建package时一直报错,Compilation errors for PACKAGE SYSTEM.PROC_QUESTION_HALF

Error: PLS-00201: 必须声明标识符 'CHOICETYPE'
Line: 18
Text: return choicetype ;

Error: PL/SQL: Declaration ignored
Line: 17
Text: function str2tbl( p_str in varchar2 )

这个不是我写的,拷过来就是这样,不知道这是什么原因,难道是别人也没有定义就可以使用了?请大家帮我看看!

4 个解决方案

#1


function split_str(var_str in varchar2,
  var_split in varchar2)
  return t_ret_table;

  function str2tbl( p_str in varchar2 )
  return  choicetype ;
 这里的CHOICETYPE未定义,函数返回值应该是一个嵌套表,游标,或者其他pl/sql数据类型

#2


引用 1 楼 bobo12082119 的回复:
function split_str(var_str in varchar2,
  var_split in varchar2)
  return t_ret_table;

  function str2tbl( p_str in varchar2 )
  return choicetype ;
 这里的CHOICETYPE未定义,函数返回值应该是一个嵌套表,游标,或者其他pl/s……


返回的是return choicetype
  as
  l_str long default p_str || ',';
  l_n number;
  l_data choicetype := choicetype();
  begin
  loop
  l_n := instr( l_str, ',' );
  exit when (nvl(l_n,0) = 0);
  l_data.extend;
  l_data( l_data.count ) := ltrim(rtrim(substr(l_str,1,l_n-1)));
  l_str := substr( l_str, l_n+1 );
  end loop;
  return l_data;
  end;

那应该怎么处理,希望给予指导

#3


创建一个嵌套表类型就可以了

可以直接在包外面创建 (与创建表一样),如:
create or replace is table of varchar2(500);

或者放在包头声明
type choicetype is table of varchar2(500);

#4


你应该先定义一个类型:

type choicetype is table of varchar2(500);

#1


function split_str(var_str in varchar2,
  var_split in varchar2)
  return t_ret_table;

  function str2tbl( p_str in varchar2 )
  return  choicetype ;
 这里的CHOICETYPE未定义,函数返回值应该是一个嵌套表,游标,或者其他pl/sql数据类型

#2


引用 1 楼 bobo12082119 的回复:
function split_str(var_str in varchar2,
  var_split in varchar2)
  return t_ret_table;

  function str2tbl( p_str in varchar2 )
  return choicetype ;
 这里的CHOICETYPE未定义,函数返回值应该是一个嵌套表,游标,或者其他pl/s……


返回的是return choicetype
  as
  l_str long default p_str || ',';
  l_n number;
  l_data choicetype := choicetype();
  begin
  loop
  l_n := instr( l_str, ',' );
  exit when (nvl(l_n,0) = 0);
  l_data.extend;
  l_data( l_data.count ) := ltrim(rtrim(substr(l_str,1,l_n-1)));
  l_str := substr( l_str, l_n+1 );
  end loop;
  return l_data;
  end;

那应该怎么处理,希望给予指导

#3


创建一个嵌套表类型就可以了

可以直接在包外面创建 (与创建表一样),如:
create or replace is table of varchar2(500);

或者放在包头声明
type choicetype is table of varchar2(500);

#4


你应该先定义一个类型:

type choicetype is table of varchar2(500);