MYSQL不支持返回游標(biāo)
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比慶陽(yáng)網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式慶陽(yáng)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋慶陽(yáng)地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
只有把SP1的結(jié)果集插入臨時(shí)表
在SP2中查詢出來(lái)
Mysql存儲(chǔ)過(guò)程查詢結(jié)果賦值到變量的方法
把查詢結(jié)果賦值到變量,大部分情況下使用游標(biāo)來(lái)完成,但是如果明確知道查詢結(jié)果只有一行(例如統(tǒng)計(jì)記錄的數(shù)量,某個(gè)字段求和等),其實(shí)可以使用set或into的方式來(lái)實(shí)現(xiàn)賦值。示例代碼:
drop table if exists test_tbl;
create table test_tbl (name varchar(20), status int(2));
insert into test_tbl values('abc', 1),('edf', 2),('xyz', 3);
drop procedure IF EXISTS pro_test_3;
delimiter //
create procedure pro_test_3()
begin
DECLARE cnt INT DEFAULT 0;
select count(*) into cnt from test_tbl;
select cnt;
-- 多個(gè)列的情況下似乎只能用 into 方式
select max(status), avg(status) into @max, @avg from test_tbl;
select @max, @avg;
end
delimiter ;
call pro_test_3();
update t1 set aa=now() where id=1 ;
select aa from t1 where id=1;
或者
update t1 set aa=now() where id=1 and @now:=now();
select @now();
一樓的SQL語(yǔ)句效率比較低,試試我這條:
SELECT a.ztid FROM phome_ecms_article a,phome_enewszt b WHERE a.ztid=b.ztid
-----------------------------
幫你解釋一下哈,這條SQL語(yǔ)句的意思是:
從表phome_ecms_article(并指定了縮寫表名a)和表phome_enewszt(并指定了縮寫表名b)里去查找兩個(gè)表的ztid相同的數(shù)據(jù),并返回表phome_ecms_article的ztid字段
如果要返回更多的字段數(shù)據(jù),可以自己再添加字段,例如
SELECT a.ztid,a.username,a.password FROM phome_ecms_article a,phome_enewszt b WHERE a.ztid=b.ztid
提示哈:我這里寫的是例子,字段都是我自己編的,你得根據(jù)你表的實(shí)際結(jié)構(gòu)來(lái)寫SQL語(yǔ)句。
~記得給我分哦~ 不懂的話再發(fā)消息給我~
一、變量的定義
mysql中變量定義用declare來(lái)定義一局部變量,該變量的使用范圍只能在begin...end
塊中使用,變量必須定義在復(fù)合語(yǔ)句的開(kāi)頭,并且是在其它語(yǔ)句之前,也可以同時(shí)申明多個(gè)變量,如果需要,可以使用default賦默認(rèn)值。
定義一個(gè)變量語(yǔ)法如下:
declare
var_name[,...]
type[default
value]看一個(gè)變量定義實(shí)例
declare
last
date;二、mysql存儲(chǔ)過(guò)程變量賦值
變量的賦值可直接賦值與查詢賦值來(lái)操作,直接賦值可以用set來(lái)操作,可以是常量或表達(dá)式如果下
復(fù)制代碼
代碼如下:
set
var_name=
[,var_name
expr]...給上面的last變量賦值方法如下
set
last
=
date_sub(
current_date(),interval
1
month);下面看通過(guò)查詢給變量賦值,要求查詢返回的結(jié)果必須為一行,具體操作如下
select
col
into
var_name[,...]
table_expr我們來(lái)通過(guò)查詢給v_pay賦值。
create
function
get
_cost(p_custid
int,p_eff
datetime)
return
decimal(5,2)
deterministic
reads
sql
data
begin
declare
v_pay
decimail(5,2);
select
ifnull(
sum(pay.amount),0)
into
vpay
from
payment
where
pay.payd=p_eff
and
pay.custid=pid
reutrn
v_rent
+
v_over
-
v_pay;
end
$$
好了,這篇簡(jiǎn)單的存儲(chǔ)過(guò)程中變量的定義賦值教程就到這里了,下面我們會(huì)接著講關(guān)于myql存儲(chǔ)過(guò)程的條件的定義與處理。
以下是其它網(wǎng)友的補(bǔ)充
在MySQL的存儲(chǔ)過(guò)程中,可以使用變量,它用于保存處理過(guò)程中的值。
定義變量使用DECLARE語(yǔ)句,語(yǔ)法格式如下:
DECLARE
var_name[,...]
type
[DEFAULT
value]
其中,var_name為變量名稱,type為MySQL支持的任何數(shù)據(jù)類型,可選項(xiàng)[DEFAULT
value]為變量指定默認(rèn)值。一次可以定義多個(gè)同類型的變量,各變量名稱之間以逗號(hào)“,”隔開(kāi)。
定義與使用變量時(shí)需要注意以下幾點(diǎn):
◆
DECLARE語(yǔ)句必須用在DEGIN…END語(yǔ)句塊中,并且必須出現(xiàn)在DEGIN…END語(yǔ)句塊的最前面,即出現(xiàn)在其他語(yǔ)句之前。
◆
DECLARE定義的變量的作用范圍僅限于DECLARE語(yǔ)句所在的DEGIN…END塊內(nèi)及嵌套在該塊內(nèi)的其他DEGIN…END塊。
◆
存儲(chǔ)過(guò)程中的變量名不區(qū)分大小寫。
定義后的變量采用SET語(yǔ)句進(jìn)行賦值,語(yǔ)法格式如下:
SET
var_name
=
expr
[,var_name
=
expr]
...
其中,var_name為變量名,expr為值或者返回值的表達(dá)式,可以使任何MySQL支持的返回值的表達(dá)式。一次可以為多個(gè)變量賦值,多個(gè)“變量名=值”對(duì)之間以逗號(hào)“,”隔開(kāi)。
例如:
復(fù)制代碼
代碼如下:
begin
declare
no
varchar(20);
declare
title
varchar(30);
set
no='101010',title='存儲(chǔ)過(guò)程中定義變量與賦值';
end
提示:存儲(chǔ)過(guò)程中所有的關(guān)鍵字也是不區(qū)分大小寫的,如BEGIN可以寫出begin。
mysql中要獲得存儲(chǔ)過(guò)程的返回值,可以增加一個(gè)out參數(shù),用來(lái)返回。
mysql中存儲(chǔ)過(guò)程的例子:
CREATE PROCEDURE addvoucher (
IN userid INT,
IN voucherid INT,
OUT result INT
)
BEGIN
SELECT
@endate_a := endate ,@batch_a := batch ,@c_count_a := c_count,
@isdead_a := isdead
FROM
t_voucher
WHERE
id = voucherid;
SET autocommit = 0;
IF EXISTS (
SELECT
*
FROM
t_user_voucher tuv,
t_voucher tv
WHERE
tv.id = tuv.voucherid
AND tv.batch =@batch_a
) THEN
SET result = 1;-- 已存在
SELECT
result;
ELSE
IF @c_count_a 0 THEN
IF (
TO_DAYS(@endate_a) - TO_DAYS(NOW())
) 0 THEN
IF @isdead_a = 1 THEN
INSERT INTO t_user_voucher (userid, voucherid, isdead)
VALUES
(userid, voucherid, 1);
UPDATE t_voucher SET c_count = c_count-1 where id = voucherid;
SET result = 0;-- 成功
END;