【问题标题】:how to get a unqiue result sets in PL/SQL cursor?如何在 PL/SQL 游标中获得唯一的结果集?
【发布时间】:2017-04-07 02:04:37
【问题描述】:

我想用这个程序来显示用户名和手机号码,当我使用 select 时结果集是这样的:

声明enter image description here

当程序运行时,我得到这个: enter image description here

错误 ORA-01722:无效号码
ORA-06512:在“ABPROD.SHAREPOOL”,第 24 行。

当我在光标中使用 unique 或 distinct 时,没有任何显示。 代码来源:

create or replace procedure sharepool (assignment  in varchar2,myorgname in varchar2)  is
rightid   T_CLM_AP30_RIGHT.RIGHT_ID%type;
orgid t_clm_ap30_org.org_id%type;

begin

  select t.right_id  into rightid   from T_CLM_AP30_RIGHT t where t.rightdesc=trim(assignment);
dbms_output.put_line(rightid||trim(myorgname)||assignment);
  select t.org_id into orgid  from t_clm_ap30_org t  where t.orgname=trim(myorgname);
  dbms_output.put_line(orgid);

      declare 
      cursor namelist  is select distinct a.username,a.mobile from t_clm_ap30_user a, T_CLM_AP30_RIGHT_AUTH t where a.user_id=t.user_id and t.right_id=rightid and  t.poolorgrange=orgid ;
      begin 
        for c in namelist
          loop

            dbms_output.put_line(c.username||'   '||c.mobile);
            end loop;
        end;



end sharepool;

【问题讨论】:

  • 您在此处发布的代码显然不是您正在执行的代码,因此真的不清楚您希望我们如何提供帮助。我们只能说 INVALID_NUMBER 错误表明将字符串转换为数字失败。可能这意味着您的连接条件之一是将字符串列与数字列进行比较,并且您在字符串列中有无法转换为数字的值。
  • 我已经发布了我的完整代码。当我运行它时,我得到了这个:ORA-01722:无效号码 ORA-06512:在“ABPROD.SHAREPOOL”,第 24 行 ORA-06512:在第 1 行

标签: plsql cursor unique distinct


【解决方案1】:

INVALID_NUMBER 错误表示将字符串转换为数字失败。这意味着您的连接条件之一是将字符串列与数字列进行比较,并且您在字符串列中有无法转换为数字的值。

ORA-06512:在“ABPROD.SHAREPOOL”,第 24 行

第 24 行与您发布的代码不一致,可能是在您的实际来源的翻译中丢失了。此外,您还没有发布表格描述,因此我们无法确定要查看哪些列。

所以这是一个猜测。

这些连接中的一个(或多个)具有隐式数字转换:

where a.user_id = t.user_id 
and t.right_id = rightid 
and  t.poolorgrange = orgid 

也就是说,t_clm_ap30_user.user_id 是数字,T_CLM_AP30_RIGHT_AUTH.user_id 不是,反之亦然。或者T_CLM_AP30_RIGHT_AUTH.right_id 是数字而T_CLM_AP30_RIGHT.right_id 不是,反之亦然。或者T_CLM_AP30_RIGHT_AUTH.poolorgrange 是数字而t_clm_ap30_org.org_id 不是,反之亦然。

只有您自己才能弄清楚,因为只有您才能看到您的架构。一旦您确定了将字符串列与数字列进行比较的连接,您需要查询该列以查找无法转换为数字的数据。

假设T_CLM_AP30_RIGHT_AUTH.poolorgrange 是流氓字符串。您可以通过此查询查看哪些是麻烦的行:

select * from T_CLM_AP30_RIGHT_AUTH
where translate (poolorgrange, 'x1234567890', 'x') is not null;

translate() 函数去除数字。所以剩下的任何东西都不能转换成数字。

“T_CLM_AP30_RIGHT_AUTH.poolorgrange 是 varchar2,t_clm_ap30_org.org_id 是数字。”

您可以通过将t_clm_ap30_org.org_id 显式转换为字符串来避免该错误:

select distinct a.username, a.mobile 
from t_clm_ap30_user a, 
    T_CLM_AP30_RIGHT_AUTH t 
where a.user_id = t.user_id 
and t.right_id = rightid 
and  t.poolorgrange = to_char(orgid) ;

显然,您不会在这些字母数字值上获得匹配项,但查询会运行。

【讨论】:

  • 谢谢。你是对的。T_CLM_AP30_RIGHT_AUTH.poolorgrange 是 varchar2,t_clm_ap30_org.org_id 是数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多