declare sDeptCode VARCHAR(20) :='0001';
   sDeptCodeReturn  out  varchar2(20) ;
    sDeptName  out  Varchar2(50) ;
    nStopFlag  out   NUMBER ;
   dynamic_sql VARCHAR2(800);BEGIN
  SELECT deptcode,DeptName,StopFlag 
    INTO  sDeptCodeReturn, sDeptName,nStopFlag 
    FROM System.Pub_Department
   WHERE deptcode = '0001' ;
   
   exception 
     when no_data_found then 
         begin
           if sDeptCodeReturn is null THEN
             raise_application_error(-20016, '此部门不存在');
           end if;
         end;
   IF nStopFlag = 0 THEN
     raise_application_error(-20016, '此部门已停用');     
   END if;
    dynamic_sql :=' select ' + sDeptCodeReturn + ' as deptcode, ' + sDeptName + ' as  DeptName,' + nStopFlag + ' as StopFlag from System.Pub_Department' ;
    execute  immediate dynamic_sql; 
     
    
 end;

解决方案 »

  1.   

      declare sDeptCode VARCHAR(20) :='0001';
       sDeptCodeReturn    varchar2(20) ;
        sDeptName    Varchar2(50) ;
        nStopFlag     NUMBER ;
       dynamic_sql VARCHAR2(800);BEGIN
      SELECT deptcode,DeptName,StopFlag 
        INTO  sDeptCodeReturn, sDeptName,nStopFlag 
        FROM System.Pub_Department
       WHERE deptcode = '0001' ;
       
       exception 
         when no_data_found then 
             begin
               if sDeptCodeReturn is null THEN
                 raise_application_error(-20016, '此部门不存在');
               end if;
             end;
       IF nStopFlag = 0 THEN
         raise_application_error(-20016, '此部门已停用');     
       END if;
        dynamic_sql :=' select ' + sDeptCodeReturn + ' as deptcode, ' + sDeptName + ' as  DeptName,' + nStopFlag + ' as StopFlag from System.Pub_Department' ;
        execute  immediate dynamic_sql; 
         
        
     end;刚才多了几个关键字 out 
      

  2.   

    set serveroutput on
    了也没显示么?
      

  3.   

    我这是pl/sql界面,不是sqlplus界面,不用 设置set serveroutput on
      

  4.   

    数据肯定有,
    而且单独执行下面的语句是可以出数据的
     select 1 as deptcode,  2  as  DeptName, 3  as StopFlag from System.Pub_Department
      

  5.   

    你的写法有问题1. 你exception 后面语句都被认为 属于 exception  ,也就是 你第一个select 没有问题的话,下面的是不执行 的2. 你最后 execute 想要显示 结果集 ,但是oracle 没有这种写法 
      

  6.   

    这是oracle 不是 sql server 
      

  7.   


    去掉out   其他没什么问题 另外你最后的执行动态语句有何用 返回结果集?
    我这边调试没有任何问题 
      

  8.   

    declare sDeptCode VARCHAR(20) :='0001';
      sDeptCodeReturn varchar2(20) ;
      sDeptName Varchar2(50) ;
      nStopFlag NUMBER ;
      dynamic_sql VARCHAR2(800);BEGIN
      SELECT deptcode,DeptName,StopFlag  
      INTO sDeptCodeReturn, sDeptName,nStopFlag  
      FROM System.Pub_Department
      WHERE deptcode = '0001' ;
        
      exception  
      when no_data_found then  
      begin
      if sDeptCodeReturn is null THEN
      raise_application_error(-20016, '此部门不存在');
      end if;
      end;
      IF nStopFlag = 0 THEN
      raise_application_error(-20016, '此部门已停用');   
      END if;
      dynamic_sql :=' select ' + sDeptCodeReturn + ' as deptcode, ' + sDeptName + ' as DeptName,' + nStopFlag + ' as StopFlag from System.Pub_Department' ;
      execute immediate dynamic_sql;  
        
        
     end;为什么没有返回数据,有知道的么,请多关照,
      

  9.   

    怎么会有输出  你的代码全到exception里去了
    你的逻辑有问题啊  declare
      sDeptCode       VARCHAR(20) := '0001';
      sDeptCodeReturn varchar2(20);
      sDeptName       Varchar2(50);
      nStopFlag       NUMBER;
      dynamic_sql     VARCHAR2(800);
      
      
      --要么给nStopFlag附初值  nStopFlag       NUMBER  := 0;BEGIN  SELECT deptcode, DeptName, StopFlag
        INTO sDeptCodeReturn, sDeptName, nStopFlag
        FROM System.Pub_Department
       WHERE deptcode = '0001';
     --要么   dbms_output.put_line(nStopFlag);exception
      when no_data_found then
        begin
          if sDeptCodeReturn is null THEN
            raise_application_error(-20016, '此部门不存在');
          end if;
        end;
        IF nStopFlag = 0 THEN
          raise_application_error(-20016, '此部门已停用');
        END if;
        dynamic_sql := ' select ' + sDeptCodeReturn + ' as deptcode, ' +
                       sDeptName + ' as DeptName,' + nStopFlag +
                       ' as StopFlag from System.Pub_Department';
        execute immediate dynamic_sql;
     --要么   dbms_output.put_line(dynamic_sql);end;
      

  10.   

    ---nStopFlag =0就是有记录 你还放到no_data_found  异常里面去
    declare 
      sDeptCode VARCHAR(20) :='0001';
      sDeptCodeReturn varchar2(20) ;
      sDeptName Varchar2(50) ;
      nStopFlag NUMBER ;BEGIN
      SELECT deptcode,DeptName,StopFlag   
      INTO sDeptCodeReturn, sDeptName,nStopFlag   
      FROM System.Pub_Department
      WHERE deptcode = '0001' ;
      if sDeptCodeReturn is null THEN
      raise_application_error(-20016, '此部门不存在');
      end if;
      IF nStopFlag = 0 THEN
      raise_application_error(-20016, '此部门已停用');   
      END if;
      dbms_output.put_line(sDeptCodeReturn||' '||sDeptName ||' '||nStopFlag );
    exception 
    when others then
    dbms_output.put_line(sqlcode||' '||sqlerrm);
    end;
      

  11.   

    declare 
      sDeptCode VARCHAR(20) :='0001';
      sDeptCodeReturn varchar2(20) ;
      sDeptName Varchar2(50) ;
      nStopFlag NUMBER ;BEGIN
      SELECT deptcode,DeptName,StopFlag   
      INTO sDeptCodeReturn, sDeptName,nStopFlag   
      FROM System.Pub_Department
      WHERE deptcode = '0001' ;
      if sDeptCodeReturn is null THEN
      raise_application_error(-20016, '此部门不存在');
      end if;
      IF nStopFlag = 0 THEN
      raise_application_error(-20016, '此部门已停用');   
      END if;
      dbms_output.put_line(sDeptCodeReturn||' '||sDeptName ||' '||nStopFlag );
    exception 
    when others then
    dbms_output.put_line(sqlcode||' '||sqlerrm);
    end;
    如何把  sDeptCodeReturn,sDeptName ,nStopFlag 返回到C#的dataset里,C#执行的是一条SQL语句 
      

  12.   


    实际上已经有了。你在exception
    前面加上
    dbms_output.putline(sDeptCodeReturn)
    看看有没有数据就知道了。
      

  13.   

    值是有,问题是怎么返回到C#dataset里table里,C#执行的是一段SQl语句
      

  14.   

    值是有,问题是怎么返回到C#dataset里table里,C#执行的是一段SQl语句有知道的么,请多指教