一、如何使一个结果集显示为1行?
例如:
    结果集如下:ID
                1
                2
                3
  使用一条SQL语句显示为1,2,3  二、如何用存储过程返回一个结果集?三、存储过程中的SQL命令包含根据参数变化的变量(如参数为1则取和,参数为2则取总数),应该如何写?
例如:
参数为@FLAG,在SQL中这么写
    IF @FLAG=1 
        @NN='SUM(COST)'
    ELSE IF @FLAG=2
        @NN='COUNT(*)'
执行的SQL语句为
    EXEC('SELECT '+@NN + ' FROM AAA')
    

解决方案 »

  1.   

    一,眼睛横过来看就好了!
    二,自己用手抓住
    三,人工智能就好了
    ----------------------------
    一,参考下面的
    WITH A AS (
    SELECT 1123 ID,'2008-9-19' DAY,'9:7:47' TIME FROM DUAL UNION  
    SELECT 1123 ID,'2008-9-19' DAY,'19:7:47' TIME FROM DUAL  UNION   
    SELECT 1123 ID,'2008-9-19' DAY,'13:7:47' TIME FROM DUAL  UNION   
    SELECT 1123 ID,'2008-9-19' DAY,'12:7:47' TIME FROM DUAL ) 
    select ID,DAY,WMSYS.WM_CONCAT(TIME) TIME FROM A GROUP BY ID,DAY  
    /  ID     DAY    TIME ---------- --------- ------------------------------------------------------------  
    1123 2008-9-19 12:7:47,13:7:47,19:7:47,9:7:4710G及以上的版本可以這樣寫第二中方法SQL codeWITH A AS (
    SELECT 1123 ID,'2008-9-19' DAY,'9:7:47' TIME FROM DUAL UNION 
    SELECT 1123 ID,'2008-9-19' DAY,'19:7:47' TIME FROM DUAL UNION  
    SELECT 1123 ID,'2008-9-19' DAY,'13:7:47' TIME FROM DUAL UNION  
    SELECT 1123 ID,'2008-9-19' DAY,'12:7:47' TIME FROM DUAL )  
    select ID,DAY,MAX(SYS_CONNECT_BY_PATH(TIME,',')) TIME FROM  
    (SELECT ID,DAY,TIME,ROW_NUMBER()OVER(PARTITION BY ID,DAY ORDER BY ID ) RN FROM A) 
    START WITH RN=1  
    CONNECT BY RN-1=PRIOR RN 
    GROUP BY ID,DAY 
    /
    二,返回游标就可以了,这只是一种方法。
    三,你写的大意是对的。不过你写的sql server的语法,就这问题
      

  2.   

    谢谢楼上的,以前没有接触过oracle,很多东西不懂,不好意思。
    第一个问题,数据库是8i的,能不能请你详细解释一下?
    第二个问题,返回游标,请问如何定义?
    第三个问题,变量直接加上SQL语句就可以了吗?
      

  3.   

    PROCEDURE LFGL.LK_BUILDRPT 编译错误错误:PLS-00103: 出现符号 "VARCHAR2"在需要下列之一时:
           :=.(@%;
           符号 ":=" 被替换为 "VARCHAR2" 后继续。
    行:4
    文本:ss varchar2;错误:PLS-00103: 出现符号 "end-of-file"在需要下列之一时:
           ;
              <an identifier><a double-quoted delimited-identifier>delete
              existsprior<a single-quoted SQL string>
           符号 ";" 被替换为 "end-of-file" 后继续。
    行:9
    文本:end请问以上两个错误是什么意思?存储过程中变量如何定义?
      

  4.   

    以前没有接触过oracle,
    你改的话会出很多问题,除非写的全部正确,你不需要修改的
    一,
    WITH A AS (
    SELECT 1 Id FROM DUAL UNION 
    SELECT 2 Id FROM DUAL UNION   
    SELECT 3 Id FROM DUAL )  
    Select substr(MAX(SYS_CONNECT_BY_PATH(id,',')),2) TIME FROM  
    (Select id,ROW_NUMBER()OVER( ORDER BY ID ) RN FROM A) 
    START WITH RN=1  
    CONNECT BY RN-1=PRIOR RN 
    三,
    create or replace function test1(FLAG in Int)
    RETURN varchar2 is 
    Result varchar2(30);
    NN varchar2(30);
    BeginIF FLAG=1 then NN:='SUM(COST)';
    ELSIF FLAG=2 then NN:='COUNT(*)';
    End If;
    --执行的SQL语句为
        execute   immediate   'SELECT '||NN||' into Result FROM AAA' ;
    Return Result;
    End test1;
      

  5.   

    第1题SQL> select * from test;ID TME---- ----------A 1B 1C 1D 1E 1F 2G 2已选择7行。SQL> select tme, substr(max(sys_connect_by_path(id, ',')), 2) catstr2 from (select id, tme, row_number() over(partition by tme order by 1) rn3 from test)4 start with rn = 15 connect by rn - 1 = prior rn and tme = prior tme6 group by tme;TME CATSTR---------- --------------------1 A,B,C,D,E2 F,GSQL>
     
      

  6.   

    第2题
    create or replace package sp_test
    is
      type ResultData is ref cursor;
      procedure getRecordSet(rst out ResultData);
    end sp_test;create or replace package body sp_test
    is  procedure getRecordSet(rst out ResultData) is
      begin
        open rst for select sysdate from daul;
      end;
    end;
      

  7.   

    第3题,结合第2题使用
    procedure sp_test(Flag int,rst out ResultData) is
    NN varchar2(100);
    begin
      if flag=1 then
        NN='sum(cost)';
      else 
        NN='Count(*)';
      end if;
      open rst for SELECT '+NN+' FROM AAA;
    end;
      

  8.   


    第3题应该是这样,sqlserver里的+在oracle里用||
    procedure sp_test(Flag int,rst out ResultData) is
    NN varchar2(100);
    Sql varchar2(1000);
    begin
      if flag=1 then
        NN='sum(cost)';
      else 
        NN='Count(*)';
      end if;
      Sql:='SELECT '||NN||' FROM AAA';
      open rst for sql;
    end;
      

  9.   

    谢谢hongqi162和helloworld_001,有问题还会请教你们