關於oracle的一點備忘
阿新 • • 發佈:2017-07-07
oracle 存儲過程
數據庫無法回避的就是處理數據
情景:發票信息,很多公司員工在進行交易的時候,填寫的發票信息都是一樣的,所以公司員工往往想調用統一的發票信息,公司會計登錄系統可以填寫通用發票信息,為了生成訂單簡單,發票需要和員工號碼綁定,所以發票的表裏想要復制一份員工號為會計的發票信息,改動其中的員工號,發票id,創建時間,其余不變
不知道大家弄懂應用情境沒,敘述能力有限。
解決:可以使用select into,但是感覺不方便和靈活。所以考略利用右邊和存儲過程,因為沒有返回值,就不寫函數了
上代碼:
create or replace procedure myprocd( uid in varchar2 ) AS receipt_autoid number; BEGIN select SEQ_CHEM_DICT_RECEIPT.NEXTVAL into receipt_autoid from dual; for rs in (select * from CHEM_DICT_RECEIPT where user_id=‘0‘) loop rs.user_id:=uid; rs.id:=receipt_autoid; rs.receipt_id:=‘RE0215‘||receipt_autoid; rs.created_time:=sysdate; insert into chem_dict_receipt values rs; end loop; END myprocd; execute myprocd(‘002‘);
提醒:我實在是沒搞清楚序列如何在循環中增加,所以我更改了策略,我讓遊標只能讀取一次,也就是不再循環,所以更改如下
CREATE OR REPLACE procedure SIT_HXPGL.myproce( uid_re in varchar2, type_re in varchar2 )AS receipt_autoid number(12); BEGIN select SEQ_CHEM_DICT_RECEIPT.NEXTVAL into receipt_autoid from dual; for rs in (select * from CHEM_DICT_RECEIPT where user_id=‘0‘ and receipt_type=type_re) loop rs.user_id:=uid_re; rs.id:=receipt_autoid; rs.receipt_id:=‘RE0215‘||receipt_autoid; rs.created_time:=sysdate; insert into CHEM_DICT_RECEIPT values rs; end loop; END myproce; /
無奈:代碼裏沒有辦法標紅。我新加了一個變量
type_re
這樣我的遊標只能每次讀取一組數據。
最後加一句,關於執行存儲過程,好像是call和execute都可以,推薦使用call
小思路:好像可以吧獲取自增序列放在自定義函數,然後調用,可能不會有問題
關於函數和存儲過程或者遊標,這裏有個鏈接很好,可以參考下
http://wen866595.iteye.com/blog/1733887 程序點滴
其中有個小問題,我實在實踐中發現的,但是還沒看oracle的官方文檔。
問題:存儲過程的結束END;
解決:END myproc;
解釋:應該是要加上存儲過程的名字
本文出自 “一站式解決方案” 博客,請務必保留此出處http://10725691.blog.51cto.com/10715691/1945344
關於oracle的一點備忘