iT邦幫忙

0

撰寫CREATE FUNCTION,內部執行CREATE TABLE(SELECT)錯誤問題詢問!

sql
ERR:Explicit or implicit commit is not allowed in stored function or trigger.
想請問大大們,小弟有地方寫錯就是找不出來-_-!!!
而且連單純SELECT也無法創建FUNCTION,網路上我查到的範例也很一直翻不到好的範例~!
不知道可指導小弟一下~謝謝!

delimiter $$
CREATE FUNCTION test (size INT) RETURNS  INT
BEGIN
	CREATE TABLE tmp (SELECT * FROM books WHERE type=size);
	RETURN size;
END$$
delimiter;
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

4
一級屠豬士
iT邦大師 1 級 ‧ 2014-08-27 21:00:46
<pre class="c" name="code">
CREATE PROCEDURE `sp_ithelp0827`()
	LANGUAGE SQL
	NOT DETERMINISTIC
	CONTAINS SQL
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
   CREATE TABLE ithelp0827(
   id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
   name CHAR(16) NOT NULL
   );
   
   SELECT "老大! Table: ithelp0827 我已經建立好了!!" AS '回報';
   
   INSERT INTO ithelp0827(name) VALUES
   ("小島みなみ"),("桜木凛"),("川上奈々美");
   
   SELECT "老大! Table: ithelp0827 我已經輸入三筆資料!!" AS '回報';
END

執行結果:

看更多先前的回應...收起先前的回應...

樓主最近問了好幾個問題,感覺好像遇到困難.
把問題Post上來吧.

codegeass iT邦新手 5 級 ‧ 2014-08-28 10:31:01 檢舉

其實就是上次那個 班上各科成績表TABLE
然後把每一科排名查出來並join學號 整理出一份班上各科排名TABLE
但後來知道join太多 會讓執行續卡住。
就改為一科整理出一個TABLE,
後來又想說寫看看mysql function傳入要查科目為參數,就卡關了
CREATE TABLE tmp_math (SELECT @rownum:=@rownum+1 AS 'rank', id, math FROM class_a, (SELECT @rownum:=0) AS b ORDER BY math desc)

上次那個啊,你把你的測試資料,還有想要達到的整理一下.
不然擠成一大坨,我年紀大了,老花眼看不清楚.

codegeass iT邦新手 5 級 ‧ 2014-08-28 11:24:30 檢舉

原本的TABLE:全校各科成績
+------------+------+-----+------+
| 學號| 國語| 英語| 數學|
+------------+------+-----+------+
| 49421101 | 30 | 90 | 100 |
| 49421102 | 50 | 60 | 50 |
| 49421103 | 70 | 80 | 0 |
+------------+- ----+-----+------+
想讓查詢結果變成全校各科排名
因為原本我異想天開的讓他每個結果JOIN 學號 成一張TABLE 如下面

codegeass iT邦新手 5 級 ‧ 2014-08-28 11:26:28 檢舉
<pre class="c" name="code">
codegeass 說:
NEW TABLE:全校各科RANK
+-----+--------+---------+---------+
| 學號| 國語RANK| 英語RANK| 數學RANK| 
+----------+------+-----+------+
| 49421101 |    1 |   1 |    1 |
| 49421102 |    2 |   2 |    2 | 
| 49421103 |    3 |   3 |    3 | 
+----------+- ----+-----+------+
codegeass iT邦新手 5 級 ‧ 2014-08-28 11:28:30 檢舉

因為科目也不止3科,學號也會很多
導致我當時JOIN結果超過4科以上,執行就卡在那邊了。
所以我後來就用一個科目查一個新表出來。

codegeass iT邦新手 5 級 ‧ 2014-08-28 11:29:27 檢舉

才衍生出後面最近問的事情~!

該JOIN就JOIN啊.....

codegeass iT邦新手 5 級 ‧ 2014-08-28 11:33:09 檢舉

剛剛打錯順序 (這是修改版)
NEW TABLE:全校各科RANK
+-----+--------+---------+---------+
| 學號| 國語RANK| 英語RANK| 數學RANK|
+----------+------+-----+------+
| 49421101 | 3 | 1 | 1 |
| 49421102 | 2 | 3 | 2 |
| 49421103 | 1 | 2 | 3 |
+----------+- ----+-----+------+

codegeass iT邦新手 5 級 ‧ 2014-08-28 11:34:43 檢舉

不懂?大大您說的?
該JOIN就JOIN啊.....
我原本是用JOIN可是會卡住。

codegeass iT邦新手 5 級 ‧ 2014-08-28 11:35:34 檢舉

我好糟糕....一直打好亂的回應....~!!

你的MySQL在哪種OS上跑?
版本是多少? 設定檔是怎樣?

codegeass iT邦新手 5 級 ‧ 2014-08-28 12:18:04 檢舉

目前是在PC用usbwebserver 在phpmyadmin 上測試
5.6.13 - MySQL Community Server (GPL)
之後是放到LINUX

codegeass iT邦新手 5 級 ‧ 2014-08-28 12:19:03 檢舉

是不是要調整可用快取記憶體嗎?來解決JOIN的卡住?

我建立1000筆,10科目,排名後JOIN,再依學號排序,
只要 31.68 sec.

codegeass iT邦新手 5 級 ‧ 2014-08-28 13:54:59 檢舉

哪尼~~我才14筆16科....就看到phpmyadmin 沒反應了...!!!

那是PHPMyAdmin的問題,不是MySQL的問題.

codegeass iT邦新手 5 級 ‧ 2014-08-28 14:12:00 檢舉

我等等搬到linux內 測看看~!
謝謝hitomitanaka 大大!

codegeass iT邦新手 5 級 ‧ 2014-08-28 14:14:50 檢舉

但我剛看到需要花31秒,我覺得我還是乖乖的把他拆開好了~!
因為這動作執行31秒,其他要執行的指令就必須等此指令完成,方可動作T-T

這個動作有需要時常作嗎??
考試一次才做一下排名吧.

codegeass iT邦新手 5 級 ‧ 2014-08-28 14:28:53 檢舉

我是計畫寫的crontab半夜執行,也不會常執行。
但我在想如果這功能用在(時間區段是小時為單位)時,就不能這樣做了。

既然排名有用,後面就是要等,你拆開的還是要等.
拆開也不見得會變快啦.
我有看你的code,第一個先order by 是多餘的.
定時也不必用crontab,這樣你要把usr/passwd 寫在script.
MySQL自己就能排程跑啦.

我要發表回答

立即登入回答