如何调用存储过程? (100分)

  • 主题发起人 主题发起人 xianguo
  • 开始时间 开始时间
X

xianguo

Unregistered / Unconfirmed
GUEST, unregistred user!
能用记录型变量作为存储过程的参数,调用Oracle的存储过程吗
(因为参数太多,一个一个的写很烦而且容易出错,有什么好办法吗?)
 
用Variant数组,我不习惯这样用,不过这样可以循环啊,用不着一个一个参数写!
 
参数名、类型都不一样,怎么循环?
 
Oracle 的过程函数的参数定义是可以用表的栏位作为参数类型来定义,所以你那个问题用这
个方法是很容易解决的。
 
但是在Delphi中如何定义数据类型才能调用?
 
定义一个数组:VList
将要传递的参数值依次存入;

StoredProc1.Close;
for i:=0 to 你的存储过程的参数个数 do
StoredProc1.Params.value:=VList
StoredProc1.ExecProc;
 
StoredProc1.close;
StoredProc1.params[0]:='1234321';
StoredProc1.params[1]:='HelloWorld';
try
StoredProc1.open;
except
raise exception.create('error');
end;

如果是在存储过程中直接调用记录中的变量作参数, 可以使用游标:
下面是SQL Server的游标(Cursor)的调用方法:
Declare @vTableName sysname
Declare @i int
set @i = 0
Declare cr_table CURSOR --定义游标
FOR
select name from sysobjects where xtype = 'U' and uid =
(select uid from sysusers where name = 'Createnew') --
open cr_table
FETCH NEXT FROM cr_table INTO @vtablename //取游标数据到变量@vtablename
WHILE (@@FETCH_status = 0)
begin
set @i = @i + 1
set @vTableName = 'Createnew.'+@vTableName
print @vTableName

FETCH Next FROM cr_table INTO @VtableName //取游标数据到变量@vtablename

end
CLOSE Cr_table //关闭游标
select @i
DEALLOCATE Cr_Table --Removes


下面是Oracle的游标的调用方法:

来自:arm 时间:2001-07-10 16:40:00 ID:585335
CREATE OR REPLACE PROCEDURE do_two_unrelated_actions
(tab_in IN VARCHAR2)
IS
cur INTEGER := DBMS_SQL.OPEN_CURSOR;

BEGIN
/* Piece together a CREATE INDEX statement. */
DBMS_SQL.PARSE (cur, 'Select * From' || tab_in , DBMS_SQL.NATIVE);
DBMS_SQL.EXECUTE (cur);
DBMS_SQL.CLOSE_CURSOR (cur);
END;


在DBMS_SQL.EXECUTE (cur)后怎么访问结果集?

ROCEDURE fill_block (where_clause_in IN VARCHAR2)
IS
c INTEGER := DBMS_SQL.OPEN_CURSOR;
emprec employee%ROWTYPE;
employee_id integer;
employee_nm varchar2(30);

fdbk INTEGER;
BEGIN
DBMS_SQL.PARSE (c, 'SELECT employee_id, last_name ' ||
' FROM employee' , DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN (c, 1, emprec.empno);
DBMS_SQL.DEFINE_COLUMN (c, 2, emprec.ename, 30);
fdbk:= DBMS_SQL.EXECUTE (c);
LOOP
EXIT WHEN DBMS_SQL.FETCH_ROWS (c) = 0;
DBMS_SQL.COLUMN_VALUE (c, 1, emprec.empno);
DBMS_SQL.COLUMN_VALUE (c, 2, emprec.ename);
employee_id := emprec.empno;
employee_nm := emprec.ename;
END LOOP;

/* Clean up the cursor */
DBMS_SQL.CLOSE_CURSOR (c);
END;



 
我的意思是在Oracle中定义了一存储过程,其中一参数为记录类型,如
PROCEDURE Test
(
p_Demo Demo%ROWTYPE
)
...

在Delphi中如何调用该存储过程
[ 说明:Demo为一表,其中有三个字段 A NUMBER, B CHAR(2), C DATE ]

另外请问在Delphi中有没有类似Oracle中的Replace函数
 
你用BDE还是用ADO?ADO的控件ADOStoredProc是不行的,要改变成ADODATASET才行。
BDE没有问题。。。
 
TO wumeng,: BDE
 
看了楼上各位大哥所写,颇有收获。

请各位老兄http://www.delphibbs.com/delphibbs/dispq.asp?lid=1317423 到这里看看,一样的问题。
顺便留言 拿分。

>>>>ADOStoredProc是不行的,要改变成ADODATASET才行。
我赶紧去试试~
 
>BDE没有问题
你先在设计状态下调试,通过了之后再改变成动态调用。。。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1321421
 
To All:
能不能在Oracle定义一数据类型(如 Type tDemo Demo%TYPE;)
而在Delphi中同样可以用该数据类型作为存储过程的参数????
 
我用的是SQL,用DELPHI傳過個VARIANT過去容易,但不知在SQL的儲存過程中怎樣分解出來.
從而進行處理.SQL的儲存過程的參數類型不知有沒有VARIANT,或者怎樣定義數組或記錄?
 
cdsSPDeputing.Params.Clear;
cdsSPDeputing.FetchParams;
cdsSPDeputing.Params.ParamByName('@ddType').AsString := 'Type';
cdsSPDeputing.Execute;//不返回数据
//.Active := True; 返回数据

这样的我已经测试成功了.
 
To wumeng:
在SQL儲存過程中,如何讀出在DELPHI中傳進來的VARIANT多維數組類型的參數?
例如:如何一次性傳下面這N組數據到SQL儲存過程中,以及讀出.
A11,A12,A13,A14
B21,B22,B23,B24
...
E51,E52,E53,E54
 
TO dragonx23
我还没有找到好的办法,或许是我的能力不行吧。
但我感觉,除非你传来的是SQL中能认识的TABLE(结构)类型的数据,SQL SERVER
有可能认识,其它的我感觉SQL 一定不认识。
当然,这都要作实验才能知道可不可行。
 
多人接受答案了。
 
后退
顶部