说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

【delphi三(两)层结构如何调用oracle中的存储过程(参数含游标)】

编辑:说三道四文库 发布时间:2018-07-17 09:11
HTML文档下载 WORD文档下载 PDF文档下载
ClientDataSet ,ADOStoredProc 两种组件分别如何实现?希望能写详细点!谢谢!!

包过程如下:
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;
clientDataset.commandText:='select * from pkName.ProName(...)';
clientDataset.Open;
找过网上的贴子,大致是两种方法,是一种用{call pkname.proname} ,一种是楼上所说的方法
我的疑问 ,是需要游标型参数的地方怎么传参数?????????????????希望能给祥细的代码!!!
孤独的up
SQL> select * from aa; 

       ID NAME 
---------- -------- 
        1 猪八戒 
        2 孙悟空 


CREATE OR REPLACE PACKAGE pkg_test 
AS 
TYPE myrctype IS REF CURSOR; 
END pkg_test; 


create or replace PROCEDURE get(p_rc OUT pkg_test.myrctype) 
  IS 
     sqlstr   VARCHAR2 (50); 
  BEGIN 
     sqlstr:='select * from aa'; 
     OPEN p_rc FOR sqlstr; 
END get; 


在窗体上放一个ADOStoredproc 
设置 procedurename=get 
    prepared = true 
    active = true 
还有 connectstring 
代码如下,好运! 

procedure TForm1.Button1Click(Sender: TObject); 
var mm : string; 
var nn : integer; 
begin 
mm:='myid'; 
nn:=2; 
ADOStoredProc1.Close; 
ADOStoredProc1.Parameters.Clear; 
ADOStoredProc1.Parameters.CreateParameter(mm,ftstring,Pdinput,0,0); --这个就是参数
adostoredproc1.Parameters.ParamByName(mm).value:=nn;      --设置参数值
adostoredproc1.open; 
label1.caption:= adostoredproc1.fields[1].asstring; 
while not adostoredproc1.eof do 
   begin 
     label2.caption:= adostoredproc1.fields[1].asstring; 
     adostoredproc1.Next; 
   end; 
end; 
SQL> select * from aa; 

       ID NAME 
---------- -------- 
        1 猪八戒 
        2 孙悟空 


CREATE OR REPLACE PACKAGE pkg_test 
AS 
TYPE myrctype IS REF CURSOR; 
END pkg_test; 


create or replace PROCEDURE get(p_rc OUT pkg_test.myrctype) 
  IS 
     sqlstr   VARCHAR2 (50); 
  BEGIN 
     sqlstr:='select * from aa'; 
     OPEN p_rc FOR sqlstr; 
END get; 


在窗体上放一个ADOStoredproc 
设置 procedurename=get 
    prepared = true 
    active = true 
还有 connectstring 
代码如下,好运! 

procedure TForm1.Button1Click(Sender: TObject); 
var mm : string; 
var nn : integer; 
begin 
mm:='myid'; 
nn:=2; 
ADOStoredProc1.Close; 
ADOStoredProc1.Parameters.Clear; 
ADOStoredProc1.Parameters.CreateParameter(mm,ftstring,Pdinput,0,0); --这个就是参数
adostoredproc1.Parameters.ParamByName(mm).value:=nn;      --设置参数值
adostoredproc1.open; 
label1.caption:= adostoredproc1.fields[1].asstring; 
while not adostoredproc1.eof do 
   begin 
     label2.caption:= adostoredproc1.fields[1].asstring; 
     adostoredproc1.Next; 
   end; 
end; 
要clientdataset 跟query的

CREATE OR REPLACE PACKAGE ZHT_TEST

AS

  TYPE crTmp IS REF CURSOR ;
  TYPE m is TABLE of  varchar2(21)
    INDEX BY BINARY_INTEGER;
  PROCEDURE ff(mm  out m);
  procedure  gg(crtemp out crTmp) ;
end;
/
CREATE OR REPLACE PACKAGE BODY "ZHT_TEST"

as
   procedure  ff(mm out m) 
   AS
     kk3 varchar(13);
 crtemp crTmp;
 a2 varchar2(20);
 a1 varchar2(20);
 percount NUMBER DEFAULT 1;

   BEGIN

     open crtemp for select f1,f2 from temptable ;
 Loop
   fetch  crtemp  into a2,a1;
 
EXIT WHEN crtemp%NOTFOUND;
mm(percount):=a1;
percount := percount + 1;
end loop;
    
   END;
   procedure  gg(crtemp out crTmp)  
   as
   --crtemp crTmp;
a1 varchar2(20);
a2 varchar2(20);
   BEGIN

     open crtemp for select *  from temptable;
 
 
   end;
END;
/

中间层:
ADOCn1->ConnectionString="Provider=MSDAORA.1;Password=xrmbauser;User ID=xrmbauser;Data Source=jennydb;Persist Security Info=True";
注意:provider一定要用微软的(msdaora)
客户端:

CData->Close();
CData->CommandText="{call zht_test.gg({resultset 0,crTemp})}";
CData->Open();

这样,调用没有问题,但是可能会造成内存泄漏,我正在测试中。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘