INTERBASE的存储过程分为两种:1。选择性存储过程 2。执行性存储过程。你写的应该为第一类,所以它必须有返回值。 create procedure sub returns( id1 int, mc varchar(10) ...) as begin select id1,mc ..... INTO: id1, : mc,....; end
可以看看BCB版的版主TR写的一本关于Interbase的书,上面描述的比较详细
To 楼主:执行性的就是指不返回数据的操作,如Delete,Inser等DDL
xt_nibin(野人小子) 你说那bcb版在哪里?那书叫什么名
这种返回记录集的StoredProc必须有返回值,举个例子,假设你的yuan的结构是y integer not null, u varchar(10) not null, a varchar(10), n timestamp 那么SP应该定义为create procedure sub returns ( y integer, u varchar(10), a varchar(10), n timeastmp ) as begin for select y, u, a, n from yuan /* where clause here... */ into :y, :u, :a, :n do suspend; end^这个样子但是如果没有输入参数,用view就可以了,没有必要用sp, 他的性能比view差
create procedure sub(rk varchar(10)) as declare variable b_mc varchar(10); declare variable b_dw varchar(10); declare variable b_sl NUMERIC(15, 2); begin for select mc,dw,sl from bu where dh=:rk into :b_mc,:b_dw,:b_sl; do suspend; end 可为什么我这样写还错误呢?
不对,如果你是要编一个返回记录集的SP,那这个SP要有返回值create procedure sub ( rk varchar(10) ) RETURNS /* 应该有返回值 */ ( b_mc VARCHAR(10), b_dw VARCHAR(10), b_sl NUMERIC(15,2) ) as /* declare variable b_mc varchar(10); declare variable b_dw varchar(10); declare variable b_sl NUMERIC(15, 2); */ begin for /* select mc,dw,sl from bu where dh=:rk into :b_mc,:b_dw,:b_sl; * 上面这里语法错误,不应该有;分号终结符,应该是下面这样: */ select mc, dw, sl from bu where dh = :rk into :b_mc, :b_dw, :b_sl do suspend; /* 暂停,通知调用者取走返回参数(作为一个记录行) */ /* 整个for select ... do statement 为一个复合语句 */ end^调用语句是select * from sub ( '123434' )
谢谢,现在可以运行了,可现在有3个返回值,如果说我 想执行“select mc,dw,sl from bu where dh=:rk ” 而不想有返回值,那格式要怎么样呢? 还有的是interbase的游标格式是怎么样的?
在IB的SP或Trigger里面,select语句的结果必须存储起来 也就是说必须用 select mc, dw, sl from ... where ... INTO ,,,的形式 不能只是select而不存储结果(因为没有意义)如果select mc, dw, sl from bu where dh = :rk的返回记录要么是唯一要么没有找到匹配的记录,可以直接select mc, dw, sl from bu where dh = :rk into :b_mc, :b_dw, :b_sl ; /* 接着就可以使用b_mc, b_dw, b_sl了 */ ...如果该语句是多行的,必须用for select ... INTO do语句 for select mc, dw, sl from bu where dh = :rk into ... do /* 使用得到的各个字段值 */for select ... do 就是IB的游标形式, 但是IB的SP SQL和DSQL中没有 update ... where current of cursor_name 这样的语句,只有在使用embedded sql时才有 这使得你在for select语句体内update的时候必须检索需要更新的行, 即使更新的是游标的当前行, 不过不会很慢,因为记录已经在服务器的缓冲区中
if exists(select mc from bj where bh =:b_bh and mc=:b_mc) 请问exists要改为什么?我这个是判断记录有没有存在?
将条件括起来if (exists(select mc from bj where bh =:b_bh and mc=:b_mc)) then
>>for select ... do 就是IB的游标形式 >>是根据什么来循环的次数的呢?就是根据select的结果集的行数, for select field_name from table_name where condition into var_list do begin ... end相当于 declare cursor c for select field_name from table_name where condition into var_list ;open cursor;fetch cursor into var_list; while not eof of cursor do begin ... fetch next into var_list; endclose cursor;
create procedure sub
returns( id1 int,
mc varchar(10)
...)
as begin
select id1,mc ..... INTO: id1, : mc,....; end
你说那bcb版在哪里?那书叫什么名
u varchar(10) not null,
a varchar(10),
n timestamp
那么SP应该定义为create procedure sub
returns
(
y integer,
u varchar(10),
a varchar(10),
n timeastmp
)
as
begin
for
select
y,
u,
a,
n
from yuan
/* where clause here... */
into :y, :u, :a, :n
do
suspend;
end^这个样子但是如果没有输入参数,用view就可以了,没有必要用sp,
他的性能比view差
谢谢,基本有些明白,我能加你qq吗?我的是83011189
有没有怎么介绍这些的资料呢?
as
declare variable b_mc varchar(10);
declare variable b_dw varchar(10);
declare variable b_sl NUMERIC(15, 2);
begin
for
select mc,dw,sl from bu where dh=:rk into :b_mc,:b_dw,:b_sl;
do
suspend;
end
可为什么我这样写还错误呢?
(
rk varchar(10)
)
RETURNS /* 应该有返回值 */
(
b_mc VARCHAR(10),
b_dw VARCHAR(10),
b_sl NUMERIC(15,2)
)
as
/*
declare variable b_mc varchar(10);
declare variable b_dw varchar(10);
declare variable b_sl NUMERIC(15, 2);
*/
begin
for
/* select mc,dw,sl from bu where dh=:rk into :b_mc,:b_dw,:b_sl;
* 上面这里语法错误,不应该有;分号终结符,应该是下面这样:
*/
select mc, dw, sl from bu where dh = :rk into :b_mc, :b_dw, :b_sl
do
suspend; /* 暂停,通知调用者取走返回参数(作为一个记录行) */ /* 整个for select ... do statement 为一个复合语句 */
end^调用语句是select * from sub ( '123434' )
想执行“select mc,dw,sl from bu where dh=:rk ”
而不想有返回值,那格式要怎么样呢?
还有的是interbase的游标格式是怎么样的?
也就是说必须用
select mc, dw, sl from ... where ... INTO ,,,的形式
不能只是select而不存储结果(因为没有意义)如果select mc, dw, sl from bu where dh = :rk的返回记录要么是唯一要么没有找到匹配的记录,可以直接select mc, dw, sl from bu
where dh = :rk
into :b_mc, :b_dw, :b_sl
;
/* 接着就可以使用b_mc, b_dw, b_sl了 */
...如果该语句是多行的,必须用for select ... INTO do语句
for select mc, dw, sl from bu where dh = :rk into ...
do
/*
使用得到的各个字段值
*/for select ... do 就是IB的游标形式,
但是IB的SP SQL和DSQL中没有
update ... where current of cursor_name
这样的语句,只有在使用embedded sql时才有
这使得你在for select语句体内update的时候必须检索需要更新的行,
即使更新的是游标的当前行,
不过不会很慢,因为记录已经在服务器的缓冲区中
请问exists要改为什么?我这个是判断记录有没有存在?
是根据什么来循环的次数的呢?
http://delphi.buzzword.com/articles
>>是根据什么来循环的次数的呢?就是根据select的结果集的行数,
for select field_name from table_name
where condition
into var_list
do
begin
...
end相当于
declare cursor c for select field_name from table_name
where condition
into var_list
;open cursor;fetch cursor into var_list;
while not eof of cursor do
begin
...
fetch next into var_list;
endclose cursor;