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

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

编辑:说三道四文库 发布时间:2018-01-23 06:21
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();

这样,调用没有问题,但是可能会造成内存泄漏,我正在测试中。
控制光驱门的开关 -VB资料 VB利用 窗口函数监视系统的运行情况(VB类) VB判断是否在VB5环境下运行 VB判断一个32位程序是否结束 VB判断一个程序启动完成(不是结束) ASP新闻的问题 中国移动和中国建设银行用的是什么服务器啊?weblogic,websphere? 求部分组件讲义与实例,进来看一下吧!! 网络打印机的通病 在空间获得焦点或鼠标进入时,弹出小提示框(vb,vc很好实现),如何实现,在线等待! AIX,HA,WebSphere,WebSphere Network Deployment以及hostname的问题 如何通过程序获得打印机的品牌??例如:惠普、Epson等等 中国移动和中国建设银行用的是什么服务器啊?weblogic,websphere? sql语句问题? 木工刀具的前角、后角的定义? 牧童与画明白了什么道理 nh4铵根为几价 醋酸洗必泰/盐酸洗必泰/葡萄糖酸洗必泰/,国内有哪 今年的网络流行词 下列关于世界陆地和海洋的叙述,正确的是()A.全球 关于世界陆地河海洋的叙述,正确的是( )A 全球海 世界是先有海洋还是先有陆地啊? 地面吸收太阳辐射能增温,有以什么的形式把热量传递给 钓鱼岛史上从未属日本2000万港元赔款大多来自华人捐助印火星探测器欲争亚洲第一老虎VS小麦,谁是王中王?“娜”功败垂成5:1恒大辣手摧樱花体育老师捐造血干细胞救8岁女孩5人售伪劣卷烟受审企业卖非国Ⅳ汽柴油将停业出境出岛精品线路剑武昊天灵武纪元枪神风暴生化求生手册天之玺天主教艺术博物馆旅游南澳旅游海滨中心旅游江阴大桥旅游江阴军事文化博物馆旅游江阴文庙旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘