儲存過程學習(一)

2021-08-30 01:57:02 字數 2705 閱讀 8549

在學《資料庫》這門課的時候老師講「過儲存過程」這東西,但一直沒有自己寫過,語法也不熟。現在公司要公升級erp系統了,這任務落在了我乙個人身上。前一段時間改寫了一部分程式功能但資料庫的操作一直都採用在**中拼接sql的方式。後來在網上看到說這種方式容易被注入,而且在處理大量資料時效率很低,所以正考慮將之前的操作全部換成儲存過程。

這次要處理的表比較簡單:

表名 atr_win_m

主要想實現的功能為:

1.根據id_win_b和clm_filed欄位查詢是否有相應記錄

2.有則更新,無則插入

3.插入時要呼叫另乙個已經寫好的儲存過程pr_amt_max_no來生成id號

4.插入完成後要呼叫儲存過程pr_amt_max_update 更新表atm_max_no中相應的字段值

為簡單起見,這裡就不列出表atm_max_no和上面兩個已經寫好的儲存過程的詳細內容了。

遇到了問題:pr_amt_max_no,和pr_amt_max_update這兩個儲存過程都是用select返回的結果集(雖然裡面只包含兩三個字段),網上有資料說乙個儲存過程中不能訪問另乙個儲存過程產生的結果集。

解決: 看來是不能在這個儲存過程中直接進行判斷並呼叫上面兩個儲存過程了,所以功能做了下修改:

根據id_win_b 和clm_filed欄位查詢是否有相應記錄,有則更新並返回0,無則返回1。然後在cs**中具體去處理。

儲存過程如下:

/*說明: 本儲存過程用於更新表 art_win_m 此過程先根據引數win_id,filedstr中的filedname 查詢是否有相應記錄,有則更新並返回0無則返回1 filedstr內容 : "clm_filed,clm_cap,clm_order,clm_width,clm_vis,clm_input" */ create procedure [dbo].[pr_atr_win_m_update] @win_id char (10), --視窗id號 @id_win_m char(10), --新建的記錄的id @username char(10), --當前使用者名稱 @userdate datetime , --時間 @filedstr varchar(200) --含有字段資訊的字串格式為"a,b,c,d" as declare @positiona int --指標1 declare @positionb int --指標2 declare @countno int --查詢出的記錄數 declare @filedname varchar(20) --存放取得的欄位名 declare @ccaption varchar(20) --顯示名稱 declare @corder int --列順序 declare @cwidth int --列寬 declare @cvis bit --是否可見 declare @cinput varchar(20) --資料顯示格式如99,999.99 set @positiona = 0 set @positionb = 0 set @countno = 0 set @countno = 0 begin transaction set @positiona=charindex(',',@filedstr) --取得第乙個豆號的位置 set @filedname=substring(@filedstr,@positionb+1,@positiona-@positionb-1) --取得欄位名字串,pa在前 set @positionb=charindex(',',@filedstr,@positiona+1) --第二個豆號位置 set @ccaption =substring(@filedstr,@positiona+1,@positionb-@positiona-1) --得顯示名,pb在前 set @positiona=charindex(',',@filedstr,@positionb+1) --第三個豆號位置 set @corder=cast (substring(@filedstr,@positionb+1,@positiona-@positionb-1) as int) --得順序號,pa在前 set @positionb=charindex(',',@filedstr,@positiona+1) --第四個豆號位置 set @cwidth=cast (substring(@filedstr,@positiona+1,@positionb-@positiona-1) as int) --得寬度,pb在前 set @positiona=charindex(',',@filedstr,@positionb+1) --第五個豆號位置 set @cvis=cast (substring(@filedstr,@positionb+1,@positiona-@positionb-1) as bit) --得顯示,pa在前 set @cinput=substring(@filedstr,@positionb+1,len(@filedstr)) --得顯示格式 select @countno= count(*) from atr_win_m where id_win_b =@win_id and clm_filed=@filedname if(@countno!=0) --有記錄.也許用@countno==1判斷更為合適? begin update art_win_m set user_name=@username, user_date=@userdate ,clm_filed=@filedname, clm_cap=@ccaption,clm_order=@corder,clm_width=@cwidth,clm_vis=@cvis,clm_input=@cinput return(0) end else return (1) go

學習儲存過程

儲存過程定義資訊檢視 column text format a30 column name format a20 select from user source where name select emp 修改 修改和建立一樣就是加上or replace 刪除儲存過程 drop procedure ...

Oracle儲存過程學習筆記 一

用了兩年 oracle 還沒寫過儲存過程,真是十分慚愧,從今天開始學習 oracle 儲存過程,完全零起點,爭取每日一篇學習筆記,可能開始認識的不全面甚至有錯誤,但堅持下來一定會有收穫。1.建立乙個儲存過程 create or replace procedure firstpro isbegin d...

oracle儲存過程學習筆記 一

1.基本結構 create or replace procedure 儲存過程名字 引數1 in number,is 變數1 integer 0 變數2 date begin end 儲存過程名字 2.select into statement 將select查詢的結果存入到變數中,可以同時將多個列...