CREATE OR REPLACE PACKAGE pkg_test
AS
   TYPE myrctype IS REF CURSOR;   PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);
END pkg_test;
/CREATE OR REPLACE PACKAGE BODY pkg_test
AS
   PROCEDURE get (p_id NUMBER, p_rc OUT myrctype)
   IS
      sqlstr   VARCHAR2 (500);
   BEGIN
      IF p_id = 0 THEN
         OPEN p_rc FOR
            SELECT ID, NAME, sex, address, postcode, birthday
              FROM student;
      ELSE
         sqlstr :=
            'select id,name,sex,address,postcode,birthday
           from student where id=:w_id';
         OPEN p_rc FOR sqlstr USING p_id;
      END IF;
   END get;
END pkg_test;
/

解决方案 »

  1.   

    请问 beckhambobo(beckham) 你写这个包怎样在DELPHI中调用呀?参数怎么传,怎么处理返回的结果集呀?
      

  2.   

    CREATE OR REPLACE PACKAGE pkg_test 
    AS 
    TYPE myrctype IS REF CURSOR; 
    END pkg_test; 
    / create or replace PROCEDURE get(p_id in varchar2,p_rc OUT pkg_test.myrctype) 
      IS 
         sqlstr   VARCHAR2 (50); 
      BEGIN 
         sqlstr:='select * from aa where id>='||p_id; 
         OPEN p_rc FOR sqlstr; 
    END get; 
    / SQL> select * from aa;        ID NAME 
    ---------- -------- 
            1 猪八戒 
            2 孙悟空 procedure TForm1.Button1Click(Sender: TObject); 
    begin
    with  ADOStoredProc1 do
    begin
      Close;
      procedurename:='get';
      Parameters.CreateParameter('p_id',ftstring,Pdinput,20,'1');
      parameters[0].Name:='p_id';
      //Parameters[0].Value:='3';
     Open;
    end;
    end;
      

  3.   

    CREATE OR REPLACE PACKAGE pkg_test 
    AS 
    TYPE myrctype IS REF CURSOR; 
    END pkg_test; 
    / create or replace PROCEDURE get(p_id in varchar2,p_rc OUT pkg_test.myrctype) 
      IS 
         sqlstr   VARCHAR2 (50); 
      BEGIN 
         sqlstr:='select * from aa where id>='||p_id; 
         OPEN p_rc FOR sqlstr; 
    END get; 
    / SQL> select * from aa;        ID NAME 
    ---------- -------- 
            1 猪八戒 
            2 孙悟空 procedure TForm1.Button1Click(Sender: TObject); 
    begin
    with  ADOStoredProc1 do
    begin
      Close;
      procedurename:='get';
      Parameters.CreateParameter('p_id',ftstring,Pdinput,20,'1');
      parameters[0].Name:='p_id';
      //Parameters[0].Value:='3';
     Open;
    label1.caption:= ADOStoredProc1.fields[1].asstring; 
    while not adostoredproc1.eof do 
       begin 
         label2.caption:= ADOStoredProc1.fields[1].asstring; 
         adostoredproc1.Next; 
       end; end;
    end;
      

  4.   

    在DELPHI中调用时,显示错误信息:“参数数量或参数类型不一至”
      

  5.   

    你用的是PB?Delphi?有信箱吗?方便的话留一个!给你详细的代码!
      

  6.   

    我觉得不一定非要让ORACLE也和SQL SERVER一样有集合返回,如果用动态SQL的话也不好,不如创建个表,把你想要的放进去不就OK了。
      

  7.   

    ORACLE中拥有大类的数据字典,它也在不同程序传递结果的主要方法,为控制使用的安全性,最好不用动态SQL,提前建立临时表,便可以了,这也是ORACLE推荐作法
      

  8.   

    beckhambobo(beckham):,请发一份给我。谢谢
      

  9.   

    beckhambobo(beckham) :你的ADO引擎是Microsoft OLE DB Provider for Oracle吗?如果换成Oracle OLE DB Provider不知道行不行?
      

  10.   

    我也要详细代码,最好是VBS的谢谢
    EMAIL:[email protected]
      

  11.   

    这样调用,好像不行阿?DECLARE p_rc pkg_test.myrctype ;
    BEGIN
        pkg_test.getdata(p_rc);
        FOR rec_inv in  PKG_TEST.p_rc loop
           dbms_output.PUT_LINE(rec_inv.PROD_SPEC_ID||rec_inv.PROD_SPECIFICATION);
      END loop; 
    END;