當前位置:首頁 » 存儲配置 » 存儲過程全局變數

存儲過程全局變數

發布時間: 2022-09-29 00:49:12

sql 存儲過程問題, 全局變數@@ROWCOUNT

if應該沒有問題。
你的insert語句沒有寫完整,從結構來看,應該是insert...select ..from..where類型,表示從某表裡查詢記錄再插入到另一張表。如果查詢出的記錄數為0(即沒有相關記錄),則@rowcount=0,但不會報錯(這是正常邏輯及語法),即@retcode=0。
所以,你的存儲過程的意思是,如果插入的記錄為0條(也即查出的記錄為0條,不包括查詢出記錄但插入失敗的情況),則返回100,否則返回錯誤。

如果還有疑問,請Hi我~

❷ SQL中用戶可以定義局部變數,也可以定義全局變數對嗎

可以。在資料庫編程中很常用到,比如oracle中,聲明在包package體內的,對整個包中的存儲過程、函數等都可見,也就是整個包中的全局變數。而在函數體內或者存儲過程內定義的變數則屬於局部變數了

❸ C語言中全局變數存放在內存空間中的哪個位置

全局變數是編程術語中的一種,源自於變數之分。
變數分為局部與全局,局部變數又可稱之為內部變數。由某對象或某個函數所創建的變數通常都是局部變數,只能被內部引用,而無法被其它對象或函數引用。
全局變數既可以是某對象函數創建,也可以是在本程序任何地方創建。全局變數是可以被本程序所有對象或函數引用。一個局部變數在被其它對象引用時,會是一個空值。但全局變數卻不會出現這種情況。

全局變數全部存放在靜態存儲區,在程序開始執行時給全局變數分配存儲區,程序行完畢就釋放。在程序執行過程中它們占據固定的存儲單元,而不動態地進行分配和釋放;

❹ MySQL存儲過程里怎麼定義一個參數類型和表的變數類型一樣

MySQL存儲過程中,定義變數有兩種方式:
  1、使用set或select直接賦值,變數名以@開頭,可以在一個會話(即連接)的任何地方聲明,作用域是整個會話,稱為用戶變數。例如:set @var=1;
  2、 以declare關鍵字聲明的變數,只能在存儲過程中使用,稱為存儲過程變數,主要用在存儲過程中,或者是給存儲傳參數中。例如: declare var1 int default 0;

兩者的區別是:
    在調用存儲過程時,以declare聲明的變數都會被初始化為null。而會話變數(即@開頭的變數)則不會被再初始化,在一個會話(連接)內,只須初始化一次,之後在會話內都是對上一次計算的結果,就相當於在是這個會話內的全局變數。

❺ 存儲過程

--語 句 功 能
--數據操作
SELECT --從資料庫表中檢索數據行和列
INSERT --向資料庫表添加新數據行
DELETE --從資料庫表中刪除數據行
UPDATE --更新資料庫表中的數據
--數據定義
CREATE TABLE --創建一個資料庫表
DROP TABLE --從資料庫中刪除表
ALTER TABLE --修改資料庫表結構
CREATE VIEW --創建一個視圖
DROP VIEW --從資料庫中刪除視圖
CREATE INDEX --為資料庫表創建一個索引
DROP INDEX --從資料庫中刪除索引
CREATE PROCEDURE --創建一個存儲過程
DROP PROCEDURE --從資料庫中刪除存儲過程
CREATE TRIGGER --創建一個觸發器
DROP TRIGGER --從資料庫中刪除觸發器
CREATE SCHEMA --向資料庫添加一個新模式
DROP SCHEMA --從資料庫中刪除一個模式
CREATE DOMAIN --創建一個數據值域
ALTER DOMAIN --改變域定義
DROP DOMAIN --從資料庫中刪除一個域
--數據控制
GRANT --授予用戶訪問許可權
DENY --拒絕用戶訪問
REVOKE --解除用戶訪問許可權
--事務控制
COMMIT --結束當前事務
ROLLBACK --中止當前事務
SET TRANSACTION --定義當前事務數據訪問特徵
--程序化SQL
DECLARE --為查詢設定游標
EXPLAN --為查詢描述數據訪問計劃
OPEN --檢索查詢結果打開一個游標
FETCH --檢索一行查詢結果
CLOSE --關閉游標
PREPARE --為動態執行准備SQL 語句
EXECUTE --動態地執行SQL 語句
DESCRIBE --描述准備好的查詢
---局部變數
declare @id char(10)
--set @id = '10010001'
select @id = '10010001'
---全局變數
---必須以@@開頭

--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print 'x > y' --列印字元串'x > y'
else if @y > @z
print 'y > z'
else print 'z > y'

--CASE
use pangu
update employee
set e_wage =
case
when job_level = 』1』 then e_wage*1.08
when job_level = 』2』 then e_wage*1.07
when job_level = 』3』 then e_wage*1.06
else e_wage*1.05
end

--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
print @x --列印變數x 的值
while @y < 3
begin
select @c = 100*@x + @y
print @c --列印變數c 的值
select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end

--WAITFOR
--例 等待1 小時2 分零3 秒後才執行SELECT 語句
waitfor delay 』01:02:03』
select * from employee
--例 等到晚上11 點零8 分後才執行SELECT 語句
waitfor time 』23:08:00』
select * from employee

***SELECT***

select *(列名) from table_name(表名) where column_name operator
value
ex:(宿主)
select * from stock_information where stockid = str(nid)
stockname = 'str_name'
stockname like '% find this %'
stockname like '[a-zA-Z]%' --------- ([]指定值的范圍)
stockname like '[^F-M]%' --------- (^排除指定范圍)
--------- 只能在使用like關鍵字的where子句中使用通配符)
or stockpath = 'stock_path'
or stocknumber < 1000
and stockindex = 24
not stock*** = 'man'
stocknumber between 20 and 100
stocknumber in(10,20,30)
order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
order by 1,2 --------- by列號
stockname = (select stockname from stock_information where
stockid = 4)
--------- 子查詢
--------- 除非能確保內層select只返回一個行的值,
--------- 否則應在外層where子句中用一個in限定符
select distinct column_name form table_name ---------
distinct指定檢索獨有的列值,不重復
select stocknumber ,"stocknumber + 10" = stocknumber + 10 from
table_name
select stockname , "stocknumber" = count(*) from table_name
group by stockname
--------- group by 將表按行分組,指定列中有相同的值
having count(*) = 2 --------- having選定指定的組

select *
from table1, table2
where table1.id *= table2.id --------
左外部連接,table1中有的而table2中沒有得以null表示
table1.id =* table2.id -------- 右外部連接

select stockname from table1
union [all] ----- union合並查詢結果集,all-保留重復行
select stockname from table2

***insert***

insert into table_name (Stock_name,Stock_number) value
("xxx","xxxx")
value (select Stockname , Stocknumber from
Stock_table2)---value為select語句

***update***

update table_name set Stockname = "xxx" [where Stockid = 3]
Stockname = default
Stockname = null
Stocknumber = Stockname + 4

***delete***

delete from table_name where Stockid = 3
truncate table_name ----------- 刪除表中所有行,仍保持表的完整性
drop table table_name --------------- 完全刪除表

***alter table*** --- 修改資料庫表結構

alter table database.owner.table_name add column_name char(2)
null .....
sp_help table_name ---- 顯示表已有特徵
create table table_name (name char(20), age smallint, lname
varchar(30))
insert into table_name select ......... ----- 實現刪除列的方法(創建新表)
alter table table_name drop constraint Stockname_default ----
刪除Stockname的default約束

***function(/*常用函數*/)***

----統計函數----
AVG --求平均值
COUNT --統計數目
MAX --求最大值
MIN --求最小值
SUM --求和

--AVG
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id

--MAX
--求工資最高的員工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
from employee)

--STDEV()
--STDEV()函數返回表達式中所有數據的標准差

--STDEVP()
--STDEVP()函數返回總體標准差

--VAR()
--VAR()函數返回表達式中所有值的統計變異數

--VARP()
--VARP()函數返回總體變異數

----算術函數----

/***三角函數***/
SIN(float_expression_) --返回以弧度表示的角的正弦
COS(float_expression_) --返回以弧度表示的角的餘弦
TAN(float_expression_) --返回以弧度表示的角的正切
COT(float_expression_) --返回以弧度表示的角的餘切
/***反三角函數***/
ASIN(float_expression_) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression_) --返回餘弦是FLOAT 值的以弧度表示的角
ATAN(float_expression_) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression_1,float_expression_2)
--返回正切是float_expression_1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression_)
--把弧度轉換為角度返回與表達式相同的數據類型可為
--INTEGER/MONEY/REAL/FLOAT 類型
RADIANS(numeric_expression_) --把角度轉換為弧度返回與表達式相同的數據類型可為
--INTEGER/MONEY/REAL/FLOAT 類型
EXP(float_expression_) --返回表達式的指數值
LOG(float_expression_) --返回表達式的自然對數值
LOG10(float_expression_)--返回表達式的以10 為底的對數值
SQRT(float_expression_) --返回表達式的平方根
/***取近似值函數***/
CEILING(numeric_expression_) --返回>=表達式的最小整數返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
FLOOR(numeric_expression_) --返回<=表達式的最小整數返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
ROUND(numeric_expression_) --返回以integer_expression_
為精度的四捨五入值返回的數據
--類型與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
ABS(numeric_expression_) --返回表達式的絕對值返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
SIGN(numeric_expression_) --測試參數的正負號返回0 零值1 正數或-1 負數返回的數據類型
--與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
PI() --返回值為π 即3.1415926535897936
RAND([integer_expression_]) --用任選的[integer_expression_]做種子值得出0-1
間的隨機浮點數

----字元串函數----
ASCII() --函數返回字元表達式最左端字元的ASCII 碼值
CHAR() --函數用於將ASCII 碼轉換為字元
--如果沒有輸入0 ~ 255 之間的ASCII 碼值CHAR 函數會返回一個NULL 值
LOWER() --函數把字元串全部轉換為小寫
UPPER() --函數把字元串全部轉換為大寫
STR() --函數把數值型數據轉換為字元型數據
LTRIM() --函數把字元串頭部的空格去掉
RTRIM() --函數把字元串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING() --函數返回部分字元串
CHARINDEX(),PATINDEX() --函數返回字元串中某個指定的子串出現的開始位置
SOUNDEX() --函數返回一個四位字元碼
--SOUNDEX函數可用來查找聲音相似的字元串但SOUNDEX函數對數字和漢字均只返回0 值
DIFFERENCE() --函數返回由SOUNDEX 函數返回的兩個字元表達式的值的差異
--0 兩個SOUNDEX 函數返回值的第一個字元不同
--1 兩個SOUNDEX 函數返回值的第一個字元相同
--2 兩個SOUNDEX 函數返回值的第一二個字元相同
--3 兩個SOUNDEX 函數返回值的第一二三個字元相同
--4 兩個SOUNDEX 函數返回值完全相同

QUOTENAME() --函數返回被特定字元括起來的字元串
/*select quotename('abc', '{') quotename('abc')
運行結果如下
----------------------------------{
{abc} [abc]*/

REPLICATE() --函數返回一個重復character_expression_ 指定次數的字元串
/*select replicate('abc', 3) replicate( 'abc', -2)
運行結果如下
----------- -----------
abcabcabc NULL*/

REVERSE() --函數將指定的字元串的字元排列順序顛倒
REPLACE() --函數返回被替換了指定子串的字元串
/*select replace('abc123g', '123', 'def')
運行結果如下
----------- -----------
abcdefg*/

SPACE() --函數返回一個有指定長度的空白字元串
STUFF() --函數用另一子串替換字元串指定位置長度的子串

----數據類型轉換函數----
CAST() 函數語法如下
CAST() (<expression_> AS <data_ type>[ length ])
CONVERT() 函數語法如下
CONVERT() (<data_ type>[ length ], <expression_> [, style])

select cast(100+99 as char) convert(varchar(12), getdate())
運行結果如下
------------------------------ ------------
199 Jan 15 2000

----日期函數----
DAY() --函數返回date_expression_ 中的日期值
MONTH() --函數返回date_expression_ 中的月份值
YEAR() --函數返回date_expression_ 中的年份值
DATEADD(<datepart> ,<number> ,<date>)
--函數返回指定日期date 加上指定的額外日期間隔number 產生的新日期
DATEDIFF(<datepart> ,<number> ,<date>)
--函數返回兩個指定日期在datepart 方面的不同之處
DATENAME(<datepart> , <date>) --函數以字元串的形式返回日期的指定部分
DATEPART(<datepart> , <date>) --函數以整數值的形式返回日期的指定部分
GETDATE() --函數以DATETIME 的預設格式返回系統當前的日期和時間

----系統函數----
APP_NAME() --函數返回當前執行的應用程序的名稱
COALESCE() --函數返回眾多表達式中第一個非NULL 表達式的值
COL_LENGTH(<'table_name'>, <'column_name'>) --函數返回表中指定欄位的長度值
COL_NAME(<table_id>, <column_id>) --函數返回表中指定欄位的名稱即列名
DATALENGTH() --函數返回數據表達式的數據的實際長度
DB_ID(['database_name']) --函數返回資料庫的編號
DB_NAME(database_id) --函數返回資料庫的名稱
HOST_ID() --函數返回伺服器端計算機的名稱
HOST_NAME() --函數返回伺服器端計算機的名稱
IDENTITY(<data_type>[, seed increment]) [AS column_name])
--IDENTITY() 函數只在SELECT INTO 語句中使用用於插入一個identity column列到新表中
/*select identity(int, 1, 1) as column_name
into newtable
from oldtable*/
ISDATE() --函數判斷所給定的表達式是否為合理日期
ISNULL(<check_expression_>, <replacement_value>) --函數將表達式中的NULL
值用指定值替換
ISNUMERIC() --函數判斷所給定的表達式是否為合理的數值
NEWID() --函數返回一個UNIQUEIDENTIFIER 類型的數值
NULLIF(<expression_1>, <expression_2>)
--NULLIF 函數在expression_1 與expression_2 相等時返回NULL
值若不相等時則返回expression_1 的值

sql中的保留字

action add aggregate all
alter after and as
asc avg avg_row_length auto_increment
between bigint bit binary
blob bool both by
cascade case char character
change check checksum column
columns comment constraint create
cross current_date current_time current_timestamp
data database databases date
datetime day day_hour day_minute
day_second dayofmonth dayofweek dayofyear
dec decimal default delayed
delay_key_write delete desc describe
distinct distinctrow double drop
end else escape escaped
enclosed enum explain exists
fields file first float
float4 float8 flush foreign
from for full function
global grant grants group
having heap high_priority hour
hour_minute hour_second hosts identified
ignore in index infile
inner insert insert_id int
integer interval int1 int2
int3 int4 int8 into
if is isam join
key keys kill last_insert_id
leading left length like
lines limit load local
lock logs long longblob
longtext low_priority max max_rows
match mediumblob mediumtext mediumint
middleint min_rows minute minute_second
modify month monthname myisam
natural numeric no not
null on optimize option
optionally or order outer
outfile pack_keys partial password
precision primary procere process
processlist privileges read real
references reload regexp rename
replace restrict returns revoke
rlike row rows second
select set show shutdown
smallint soname sql_big_tables sql_big_selects
sql_low_priority_updates sql_log_off sql_log_update
sql_select_limit
sql_small_result sql_big_result sql_warnings straight_join
starting status string table
tables temporary terminated text
then time timestamp tinyblob
tinytext tinyint trailing to
type use using unique
unlock unsigned update usage
values varchar variables varying
varbinary with write when
where year year_month zerofill

--WAITFOR
--例 等待1 小時2 分零3 秒後才執行SELECT 語句
waitfor delay 』01:02:03』
select * from employee
--例 等到晚上11 點零8 分後才執行SELECT 語句
waitfor time 』23:08:00』
select * from employee

***SELECT***

select *(列名) from table_name(表名) where column_name operator
value
ex:(宿主)
select * from stock_information where stockid = str(nid)
stockname = 'str_name'
stockname like '% find this %'
stockname like '[a-zA-Z]%' --------- ([]指定值的范圍)
stockname like '[^F-M]%' --------- (^排除指定范圍)
--------- 只能在使用like關鍵字的where子句中使用通配符)
or stockpath = 'stock_path'
or stocknumber < 1000
and stockindex = 24
not stock*** = 'man'
stocknumber between 20 and 100
stocknumber in(10,20,30)
order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
order by 1,2 --------- by列號
stockname = (select stockname from stock_information where
stockid = 4)
--------- 子查詢
--------- 除非能確保內層select只返回一個行的值,
--------- 否則應在外層where子句中用一個in限定符
select distinct column_name form table_name ---------
distinct指定檢索獨有的列值,不重復
select stocknumber ,"stocknumber + 10" = stocknumber + 10 from
table_name
select stockname , "stocknumber" = count(*) from table_name
group by stockname
--------- group by 將表按行分組,指定列中有相同的值
having count(*) = 2 --------- having選定指定的組

select *
from table1, table2
where table1.id *= table2.id --------
左外部連接,table1中有的而table2中沒有得以null表示
table1.id =* table2.id -------- 右外部連接

select stockname from table1
union [all] ----- union合並查詢結果集,all-保留重復行
select stockname from table2

***insert***

insert into table_name (Stock_name,Stock_number) value
("xxx","xxxx")
value (select Stockname , Stocknumber from
Stock_table2)---value為select語句

***update***

update table_name set Stockname = "xxx" [where Stockid = 3]
Stockname = default
Stockname = null
Stocknumber = Stockname + 4

***delete***

delete from table_name where Stockid = 3
truncate table_name ----------- 刪除表中所有行,仍保持表的完整性
drop table table_name --------------- 完全刪除表

***alter table*** --- 修改資料庫表結構

alter table database.owner.table_name add column_name char(2)
null .....
sp_help table_name ---- 顯示表已有特徵
create table table_name (name char(20), age smallint, lname
varchar(30))
insert into table_name select ......... ----- 實現刪除列的方法(創建新表)
alter table table_name drop constraint Stockname_default ----
刪除Stockname的default約束

***function(/*常用函數*/)***

----統計函數----
AVG --求平均值
COUNT --統計數目
MAX --求最大值
MIN --求最小值
SUM --求和

--AVG
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id

--MAX
--求工資最高的員工姓名
use pangu
select e_name
from employee
where e_wage =
(select max(e_wage)
from employee)

--STDEV()
--STDEV()函數返回表達式中所有數據的標准差

--STDEVP()
--STDEVP()函數返回總體標准差

--VAR()
--VAR()函數返回表達式中所有值的統計變異數

--VARP()
--VARP()函數返回總體變異數

----算術函數----

/***三角函數***/
SIN(float_expression_) --返回以弧度表示的角的正弦
COS(float_expression_) --返回以弧度表示的角的餘弦
TAN(float_expression_) --返回以弧度表示的角的正切
COT(float_expression_) --返回以弧度表示的角的餘切
/***反三角函數***/
ASIN(float_expression_) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression_) --返回餘弦是FLOAT 值的以弧度表示的角
ATAN(float_expression_) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression_1,float_expression_2)
--返回正切是float_expression_1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression_)
--把弧度轉換為角度返回與表達式相同的數據類型可為
--INTEGER/MONEY/REAL/FLOAT 類型
RADIANS(numeric_expression_) --把角度轉換為弧度返回與表達式相同的數據類型可為
--INTEGER/MONEY/REAL/FLOAT 類型
EXP(float_expression_) --返回表達式的指數值
LOG(float_expression_) --返回表達式的自然對數值
LOG10(float_expression_)--返回表達式的以10 為底的對數值
SQRT(float_expression_) --返回表達式的平方根
/***取近似值函數***/
CEILING(numeric_expression_) --返回>=表達式的最小整數返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
FLOOR(numeric_expression_) --返回<=表達式的最小整數返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
ROUND(numeric_expression_) --返回以integer_expression_
為精度的四捨五入值返回的數據
--類型與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
ABS(numeric_expression_) --返回表達式的絕對值返回的數據類型與表達式相同可為
--INTEGER/MONEY/REAL/FLOAT 類型
SIGN(numeric_expression_) --測試參數的正負號返回0 零值1 正數或-1 負數返回的數據類型
--與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
PI() --返回值為π 即3.1415926535897936
RAND([integer_expression_]) --用任選的[integer_expression_]做種子值得出0-1
間的隨機浮點數

----字元串函數----
ASCII() --函數返回字元表達式最左端字元的ASCII 碼值
CHAR() --函數用於將ASCII 碼轉換為字元
--如果沒有輸入0 ~ 255 之間的ASCII 碼值CHAR 函數會返回一個NULL 值
LOWER() --函數把字元串全部轉換為小寫
UPPER() --函數把字元串全部轉換為大寫
STR() --函數把數值型數據轉換為字元型數據
LTRIM() --函數把字元串頭部的空格去掉
RTRIM() --函數把字元串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING() --函數返回部分字元串
CHARINDEX(),PATINDEX() --函數返回字元串中某個指定的子串出現的開始位置
SOUNDEX() --函數返回一個四位字元碼
--SOUNDEX函數可用來查找聲音相似的字元串但SOUNDEX函數對數字和漢字均只返回0 值
DIFFERENCE() --函數返回由SOUNDEX 函數返回的兩個字元表達式的值的差異
--0 兩個SOUNDEX 函數返回值的第一個字元不同
--1 兩個SOUNDEX 函數返回值的第一個字元相同
--2 兩個SOUNDEX 函數返回值的第一二個字元相同
--3 兩個SOUNDEX 函數返回值的第一二三個字元相同
--4 兩個SOUNDEX 函數返回值完全相同

❻ 程序的局部變數 全局變數 動態申請數據分別存儲在什麼地方

程序的局部變數全局變數動態申請數據分別存儲在棧里。

普通局部變數在堆棧空間上分配,當局部變數的函數被多次調用時,局部變數每次在堆棧上的位置都不相同。還可以在堆上動態分配局部變數(malloc),但是要記住在耗盡堆空間後釋放zd。

內存分配上的棧空間時要注意內存的,不能分配太多的內存。如果堆棧中的空間小於請求的空間大小,則系統將顯示堆棧溢出並給出相應的異常信息。但堆不同,堆可分配空間很大。

(6)存儲過程全局變數擴展閱讀:

注意事項:

對局部變數進行分類

1.位置:編譯器將靜態局部變數放在全局存儲區域中。數據,因此盡管它是本地的,但它存在於程序的整個生命周期中(它在定義時產生,並隨著程序的結束而結束)。

2.訪問許可權:靜態局部變數只能由其作用域內的變數或函數訪問。也就是說,盡管它將存在於程序的整個生命周期中,但是其他函數和源文件不能訪問它,因為它是靜態的。

3.值:如果用戶沒有初始化靜態局部變數,編譯器會自動將其賦值為0,每次調用靜態局部變數時都會使用最後一次調用後的值。

❼ 存儲過程中如何定義一個變數

存儲過程常見的變數:局部變數、用戶變數、系統變數

❽ @@X是一個全局變數嗎

全局變數 對於程序員來說,是程序 「同步」的一種最方便的 方式,我相信大多數的程序員 剛開始都是使用全局變數來實現「同步」操作的,但是隨著我們 編程理念的升華,我們會發現,原來全局變數不是我們想像的只有好用,而沒有缺點。

優點:

1)全局可見,任何 一個函數或線程都可以讀寫全局變數-同步操作簡單。

2)內存地址固定,讀寫效率比較高。

缺點:

1)全局變數存放在靜態存儲區,系統需要為其分配內存,一直到程序結束, 才會釋放內存,這一點就局部變數的動態分配,隨用隨從棧中申請,用完(函數調用完畢)就釋放。

2)影響函數的封裝性能:我們肯定是希望我們寫的函數具有重入性,就如一個黑盒子一般,只 通過函數參數就能得到返回,內部 實現要獨立,但是如果函數中使用了全局變數,這勢必就破壞了函數的封裝性,會造成對全局變數的依賴。

3)降低函數的移值性,原因同上。

4)降低代碼的可讀性,這也意味著系統維護會不方便,因為一個全局變數可能會出現程序中的各個環節,函數的 執行也會根據環境變化而變化,所以調試會不太方便。

5)全局變數的讀寫,可能會延遲,這主要是體現在「寫」操作上,由於寫操作,一般需要2個周期操作,所以有可能會出現,這邊沒寫完時,那邊已經讀了,結果 讀到的不是最終值,這個是一個概率事件,概率 很小,但是並不代表沒有。

小結:上面的說的缺點,可能有些人會覺得有些矯情,或者概率很小, 這個要分情況討論的,如果對於一個非常簡單的程序來說,代碼量少, 功能也少,那全局變數無疑是最適合的同步方式。但是對於代碼量大,功能有 多,邏輯又復雜的系統來講,「穩定」來源於方方面面,其中就需要嚴謹和方便維護,所以不適用全局變數能夠大大的避免出bug, 方便後期維護,這個時候就需要考慮下,盡量少用全局變數,替代全局變數的方式有很多,最簡單易用的就是信號量或者消息隊列。

熱點內容
android交叉編譯環境 發布:2024-04-20 13:00:10 瀏覽:182
伺服器怎麼搭建中間層 發布:2024-04-20 12:40:02 瀏覽:96
如何獲取網路的賬號和密碼 發布:2024-04-20 12:34:06 瀏覽:919
安卓現在哪個品牌用得最久 發布:2024-04-20 12:00:50 瀏覽:276
小拇指演算法 發布:2024-04-20 11:55:28 瀏覽:954
域名查看雲伺服器ip地址 發布:2024-04-20 11:49:17 瀏覽:551
反編譯軟體id 發布:2024-04-20 10:29:49 瀏覽:44
視頻太長怎麼壓縮發微信 發布:2024-04-20 10:00:14 瀏覽:384
顯卡怎麼保存配置 發布:2024-04-20 09:28:52 瀏覽:596
校園交易網站源碼 發布:2024-04-20 09:18:54 瀏覽:701