CREATE PROCEDURE SUB
AS
BEGIN
  select * from yuan;
END
请问这个错在那里,要怎么改,谢谢
还有,interbase的游标的格式是怎么样的?

解决方案 »

  1.   

    INTERBASE的存储过程分为两种:1。选择性存储过程 2。执行性存储过程。你写的应该为第一类,所以它必须有返回值。
    create procedure sub
    returns( id1 int,
             mc  varchar(10)   
             ...)
    as begin
        select id1,mc ..... INTO: id1, : mc,....;  end
      

  2.   

    可以看看BCB版的版主TR写的一本关于Interbase的书,上面描述的比较详细
      

  3.   

    To 楼主:执行性的就是指不返回数据的操作,如Delete,Inser等DDL
      

  4.   

    xt_nibin(野人小子) 
    你说那bcb版在哪里?那书叫什么名
      

  5.   

    这种返回记录集的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差
      

  6.   

    alphax(多喝了三五杯) 
    谢谢,基本有些明白,我能加你qq吗?我的是83011189
    有没有怎么介绍这些的资料呢?
      

  7.   

    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
    可为什么我这样写还错误呢?
      

  8.   

    不对,如果你是要编一个返回记录集的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' )
      

  9.   

    谢谢,现在可以运行了,可现在有3个返回值,如果说我
    想执行“select mc,dw,sl from bu where dh=:rk ”
    而不想有返回值,那格式要怎么样呢?
    还有的是interbase的游标格式是怎么样的?
      

  10.   

    在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的时候必须检索需要更新的行,
    即使更新的是游标的当前行,
    不过不会很慢,因为记录已经在服务器的缓冲区中
      

  11.   

    if exists(select mc from bj where bh =:b_bh and mc=:b_mc)
    请问exists要改为什么?我这个是判断记录有没有存在?
      

  12.   

    将条件括起来if (exists(select mc from bj where bh =:b_bh and mc=:b_mc)) then
      

  13.   

    for select ... do 就是IB的游标形式
    是根据什么来循环的次数的呢?
      

  14.   

    资料主要是Interbase document set,里面很多问题都有讲另外,下面这两个网站有一些关于ib和fb的信息:http://www.ibphoenix.com/
    http://delphi.buzzword.com/articles
      

  15.   

    >>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;