hur.cn - 华软网

 热门搜索

存儲過程問題,在線等待,同志們救救我呀!

  作者:未知    来源:网络    更新时间:2018/10/11
CREATE PROCEDURE     p_ae902t
@prdt      varchar(1),
@prdt2     varchar(2),
@wide  int ,
@pm1  int,
@pm2 int,
@pm3  int ,
@ssa_qty1  float output,
@ssa_qty2  float  output,
@ssa_qty3  float output
AS
select  @ssa_qty1=sum(aps08sa.ssa_qty)
  from aps08sa
  where (substring(aps08sa.ssa_prdt,2,1)=@prdt and  substring(aps08sa.ssa_prdt,5,2)=@prdt2 and
         (left(aps08sa.ssa_prdt,1)= 'A' or  left(aps08sa.ssa_prdt,1)='E' ))  AND
        (convert(float,(substring(aps08sa.ssa_prdt,7,3))/100) between ( @wide/100 - 0.02 ) and (@wide/100 + 0.02)) and
                       convert(int,month(aps08sa.ssa_date))=@pm1
select  @ssa_qty2=sum(aps08sa.ssa_qty)
  from aps08sa
  where (substring(aps08sa.ssa_prdt,2,1)=@prdt and   substring(aps08sa.ssa_prdt,5,2)=@prdt2 and
         (left(aps08sa.ssa_prdt,1)= 'A' or left(aps08sa.ssa_prdt,1)='E' ))  AND
        (convert(float,(substring(aps08sa.ssa_prdt,7,3))/100) between  (@wide/100 - 0.02)  and (@wide/100 + 0.02)) and
                      convert(int,month(aps08sa.ssa_date))=@pm2
select  @ssa_qty3=sum(aps08sa.ssa_qty)
  from aps08sa
  where (substring(aps08sa.ssa_prdt,2,1)=@prdt and substring(aps08sa.ssa_prdt,5,2)=@prdt2 and
         (left(aps08sa.ssa_prdt,1)= 'A' or  left(aps08sa.ssa_prdt,1)='E' ))  AND
        (convert(float,(substring(aps08sa.ssa_prdt,7,3))/100) between  (@wide/100 - 0.02 ) and (@wide/100 + 0.02) )and
                      convert(int,month(aps08sa.ssa_date))=@pm3
GO
這是我寫的存儲過程,!
declare sgod procedure  for p_ae902t   @prdt=:prdt,
  @prdt2=:prdt2,
  @wide=:wide,
  @pm1=:pm[1],
  @pm2=:pm[2],
  @pm3=:pm[3],
  @ssa_qty1=:ssa_qty1  output,
  @ssa_qty2=:ssa_qty2  output,
  @ssa_qty3=:ssa_qty3  output
 using sqlca;
      execute sgod;
  fetch sgod into :ssa_qty1,:ssa_qty2,:ssa_qty3;
這是我在pb腳本中寫的儲存過程的調用!為些寫在for  next 語句中,為什麼循環的時候存儲過程的取值只可获得第一次的值,後來的值的取得都是和第一次的值一模一樣!我真的郁悶!難道存儲過程的調用不能用在for next中,可我有看到資料及例子是能够的呀!剛開始學寫存儲過程,請列位救救我呀,萬分感謝!在線期待啦!


------华软网友回答------
如果前往结果集,建议运用Datastore来猎取数据
------华软网友回复------
复杂,帮你UP吧!

=========================================================
我的回复,尽量为你分忧解难!
BLOG:blog.csdn.net/softj --欢迎光临,有更多信息等着你!
QQ群:8476022专研数据库          --大家进来聊一聊!
MSN:softj@msn.com --这不经常运用!
Mail:zj.wj@163.com --有什么问题能够和我来EMAIL!
=========================================================
------华软网友回复------
可我這種思維方式也沒有錯吧,然则就是不知道為什麼會出現這樣的現象,有看到過別人寫過樣的處理方式,為什麼我的卻得不到後面的取值,調試的時候也發現接收參數有變,而輸出參數卻不變,极可能說明是存儲過程寫的有問題,可我一時又找不到啦,請大家幫幫忙忙,救拯救啦,這個問題困擾我好多天啦!樓上說用datastore來獲取,可老出現轉換資料溢出,初學這些,查啦很久也查不到問題!
------华软网友回复------
看pb的帮助,关于proc的fetch,帮助上说得很明白
------华软网友回复------
这样执行当然每次都一样,由于每次存储进程都是重新执行
------华软网友回复------
pb腳本中沒有寫關閉sgod所致!可關閉後,卻發現執行的非常慢!還不如直接在腳本寫sql呢,現在不论是在循環中還是在循環外,都是那樣的現象!真的搞不明白,十分困难寫啦一個存儲過程卻出現這樣的現象!
------华软网友回复------
在pb腳本中聲明当地存儲過程的話在執行的時候是否是非常慢呀?怎麼沒人給我的問題以结果啦呢?好郁悶呀,不會因為第一次學的寫存儲過程就這樣夭折啦吧,還是因為其它的問題呢?現在真的是搞陌生!慢還不用怎麼說,而且還很占資源,我真的好納悶,怎麼會是這樣子呢?如果這樣的話還不如在腳本中寫sql,現在給我的感覺真的是以存儲過程並不像是大學說的那樣,執行的 很快,而且占用不是太大的客戶機資源!請大家幫幫我呀,謝啦!
------华软网友回复------
学习
------华软网友回复------
你能够这样做,你自定义一个transcation对象。
在他的外部进程里声明(local External function)的地方点右键:
paste Spercial -->SQL --> remute procedure ...
选择你的存储进程
这里声明的存储进程象函数一样调用,例如你的声明可能是:
function long p_ae902t(string a,string b,ref string c,ref string d,ref string c) RPCFUNC ALIAS FOR "dbo.p_ae902t"

请把你的系统默许的sqlca从这个对象继承。

调用就象用函数一样调用:
sqlca.p_ae902t(a,b,c,d,e)
前往值是存储进程的前往值,其实你需要的结果是c,d,e他们是通过传址方式获得。

试试吧。

------华软网友回复------
你的提的问题分太少了吧??
------华软网友回复------
剛進csdn,大哥我的分數本來就不多,以後多啦,再加吧!現在是共同學習,真誠期待大家的幫助!      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。