create or replace procedure kkkk(a in number ) is
begin
  select * from function_points where func_point_id=a        
end kkkk;这个写法为什么不行 哈?

解决方案 »

  1.   

    是啊,你知道?就说嘛不要小气
    如果不行也想知道如何才能实现相同的功能在oracal下!
      

  2.   

    sqlserver和sybase在存储过程中能直接返回结果集!
    但是oracle不能这样写:select * from 
    你要先定义一个cursor type!
    然后用这个cursor来返回!!
    1、
    CREATE OR REPLACE  PACKAGE "SCOTT"."HWTYPE" as
      TYPE HWCURSOR IS REF CURSOR;
    end;
    2、
    CREATE OR REPLACE  PROCEDURE "SCOTT"."PROC_TEST_CURSOR" (DDD OUT 
        HWTYPE.HWCURSOR)
     as
    var_DEPTNO DEPT.DEPTNO%TYPE;
    var_DNAME  DEPT.DNAME%TYPE;
    var_LOC    DEPT.LOC%TYPE;
    begin
     
     --这样可以动态设置游标了。
     AA:='SELECT DEPTNO,DNAME,LOC FROM DEPT';
     open DDD for aa;
     
     
     --用起来和一般游标一样。
     FETCH DDD INTO var_DEPTNO,var_DNAME,var_LOC;  
     WHILE DDD%FOUND LOOP
     
      DBMS_OUTPUT.PUT_LINE(var_DEPTNO);   
      DBMS_OUTPUT.PUT_LINE(var_DNAME);
      DBMS_OUTPUT.PUT_LINE(var_LOC);
      FETCH DDD INTO var_DEPTNO,var_DNAME,var_LOC; 
     END LOOP;
     CLOSE DDD;
     
    EXCEPTION
    WHEN OTHERS THEN
      IF DDD%ISOPEN THEN
        CLOSE DDD;
      END IF; 
      
      
     
    end;
    3、sqlplus中进行测试:set serverout on
    var aa REFCURSOR
    exec scott.PROC_TEST_CURSOR(:aa);
    print :aa;这么用就行了!
      

  3.   

    create or replace procedure kkkk(a in number ) is
    begin
      select * from function_points where func_point_id=a        
    end kkkk;这个写法为什么不行 哈?
    没什么为什么,ORACLE就是不给你返回在ORACLE中不能象MSSQL一样直接返回一个结果集,至少目前不能。
    但ORACLE可以返回游标,间接的达到返回结果集的目的。
      

  4.   

    ashzs((可以包含中文字符)) 大哥为什么要用package啊?不用不行么?
    不是有存储过程啊?
    还有打算今天去买本书来看,给推荐一本吧?主要介绍Oracal下面SQL的语法,还有创建过程,函数包啊之类的东西的书
      

  5.   

    因为这个例子中是要返回结果集,而负责返回结果集的是一个输出refcursor变量。
    这个变量在这个存储过程中是无法声明的。