+ -
当前位置:首页 → 问答吧 → 存储过程 报“ORA-06502: PL/SQL: 数字或值错误 ” 找到原因,找不到解决办法(更改长度行不通因为已超过32767),求各位大侠帮忙!

存储过程 报“ORA-06502: PL/SQL: 数字或值错误 ” 找到原因,找不到解决办法(更改长度行不通因为已超过32767),求各位大侠帮忙!

时间:2011-12-21

来源:互联网

同事写的一个获取权限的存储过程,里面用到了动态sql拼接,但由于权限过多时,拼接的sql长度过长 超过了32767 就报
“ORA-06502: PL/SQL: 数字或值错误 ”错误,因为是个 公用存储过程,系统也上线了,不可能改成 程序实现了。只能用修改存储过程......求各位大侠帮忙看 如何 改,下面 贴出 存储过程..

作者: qqw575   发布时间: 2011-12-21

存储过程 如下:swhere 长度 大于 32767 就报错。。
create or replace function GetJobPermissionSQL
 (psJobID varchar2,
  psPerTableName varchar2,
  psPerFieldName varchar2,
  psInitTree varchar2,
  psTree varchar2)
  return long
is
  Result long;
  sSql long;
  sWhere long;
  sIDField varchar2(100);
  spermissionId varchar2(20);
  iCount int;
begin
  select count(1) into iCount from s_permission a where upper(a.tablename)=upper(psPerTableName);
  if iCount = 1 then
  select a.table_idfield,a.id into sIDField,spermissionId from s_permission a where upper(a.tablename)=upper(psPerTableName);
  select count(1) into iCount from s_jobpermission where s_jobpermission.jobid =psJobID and s_jobpermission.permissionid=spermissionId;
  if iCount = 1 then
  select s_jobpermission.table_idvalue into sWhere from s_jobpermission where s_jobpermission.jobid =psJobID and s_jobpermission.permissionid=spermissionId;

  if sWhere is null then
  sSql:=' 1=2 ';
  else
  if psInitTree=1 then
  sWhere := replace(sWhere,'#####','b_.'||sIDField);
  sSql := ' select a_.'||sIDField||' from ' || psPerTableName || ' a_, ' || psPerTableName || ' b_ '
  || ' where ' || sWhere
  || ' and (a_.sortpath=substr(b_.sortpath,1,length(a_.sortpath)) '
  || ' or b_.sortpath=substr(a_.sortpath,1,length(b_.sortpath)))';

  sSql := psPerFieldName || ' in (' || sSql || ')';
  elsif psTree = '1' then
  sWhere := replace(sWhere,'#####','b_.'||sIDField);
  sSql := ' select a_.' || sIDField || ' from ' || psPerTableName || ' a_, ' || psPerTableName || ' b_ '
  || ' where ' || sWhere
  || ' and b_.sortpath=substr(a_.sortpath,1,length(b_.sortpath)) ';
  sSql := psPerFieldName || ' in (' || sSql || ')';
  else
  sWhere := replace(sWhere,'#####',psPerFieldName);
  sSql := sWhere;
  end if;

  end if;
  else
  sSql:=' 1=2 ';
  end if;
  end if;
  Result := sSql;
  return(Result);
end GetJobPermissionSQL;

作者: qqw575   发布时间: 2011-12-21

用clob

作者: lxpbs8851   发布时间: 2011-12-21

dbms_sql.parse()

作者: java3344520   发布时间: 2011-12-21