declare intablename varchar2(200):='test_zkm';
  pkfieldname varchar2(200);
  vsql        varchar2(500);
  swapvalue   integer:=0;
  outvalue    varchar2(500);
BEGIN
  --select count(1) into outvalue from test_zkm where tid='1';
  pkfieldname := '';
  vsql        := 'select a.column_name from user_cons_columns a,user_constraints b where a.constraint_name=b.constraint_name and b.TABLE_NAME=:itabname and b.constraint_type=''P''';
  --怎么处理数据为null的情况?
  execute immediate vsql into pkfieldname using upper(intablename);
  if nvl(pkfieldname,'')= '' then
    dbms_output.put_line('the result is null or is empty');
    outvalue := '';
  else
    dbms_output.put_line('the result is not null');
    --处理最大值
    vsql := 'select max(' || pkfieldname || ') from ' || intablename;
    --怎么处理数据为null的情况?
    execute immediate vsql  into swapvalue;
    swapvalue:= swapvalue +1;
    outvalue := swapvalue;
  end if;
  dbms_output.put_line(outvalue);
END;--备注
以上是代码,我的问题是在执行  execute immediate vsql into pkfieldname using upper(intablename);的时候当结果为null的情况下如何处理,除了在这之前用count先判断的方法,谢谢

解决方案 »

  1.   

    当结果为null的情况下:
     
     select 0 from dual where 1 = 0;
      

  2.   

    总体来讲没看明白你的匿名块是干嘛用的,不过你的要求倒是可以实现。
    declare 
      intablename varchar2(200):='test_zkm'; 
      pkfieldname varchar2(200); 
      vsql        varchar2(500); 
      swapvalue  integer:=0; 
      outvalue    varchar2(500); 
    BEGIN 
      pkfieldname := ''; --因为这里初始化是NULL,所以不用考虑第一个sql语句返回NULL的情况
      vsql        := 'select a.column_name from user_cons_columns a,user_constraints b where a.constraint_name=b.constraint_name and b.TABLE_NAME=:itabname and b.constraint_type=''P'''; --这里我没看懂,你找出主键所在列干嘛用,他存不存在和[result is null or is empty]有什么关系?况且如果是复合主键直接报too_many_rows异常。
      execute immediate vsql into pkfieldname using upper(intablename);
      if nvl(pkfieldname,'')= '' then 
        dbms_output.put_line('the result is null or is empty'); 
        outvalue := '';
      else 
        dbms_output.put_line('the result is not null'); 
        vsql := 'select nvl(max(' || pkfieldname || '),0) from ' || intablename;
        --这里加了一个nvl函数就能满足你的要求。 
        execute immediate vsql  into swapvalue; 
        swapvalue:= swapvalue +1; 
        outvalue := swapvalue; 
      end if; 
      dbms_output.put_line(outvalue); 
    END; 
      

  3.   

    declare intablename varchar2(200):='test_zkm'; 
      pkfieldname varchar2(200); 
      vsql        varchar2(500); 
      swapvalue  integer:=0; 
      outvalue    varchar2(500); 
    BEGIN 
      --select count(1) into outvalue from test_zkm where tid='1'; 
      vsql := 'select max(a.column_name) from user_cons_columns a,user_constraints b where a.constraint_name=b.constraint_name and b.TABLE_NAME=:itabname and b.constraint_type=''P'''; 
      --使用聚合函数,如果没有符合条件的记录,返回空值。 
      execute immediate vsql into pkfieldname using upper(intablename); 
      if pkfieldname is null then 
        dbms_output.put_line('the result is null or is empty'); 
        --outvalue := ''; 这个没有必要,没有赋值默认就是null
      else 
        dbms_output.put_line('the result is not null'); 
        --处理最大值 
        vsql := 'select max(' || pkfieldname || ') from ' || intablename; 
        --怎么处理数据为null的情况? 
        execute immediate vsql  into swapvalue; 
        swapvalue:= swapvalue +1; 
        outvalue := swapvalue; 
      end if; 
      dbms_output.put_line(outvalue); 
    END; 
      

  4.   

    vsql := 'select max(' || pkfieldname || ') from ' || intablename这句执行,如果pkfieldname指向的字段为空,也不会有语法错误,只会返回空值。可以不处理,也可以加nvl,decode等函数来转换
      

  5.   

    通过nvl可以处理的!也可以通过decode来转一下!