【发布时间】:2012-05-22 12:24:46
【问题描述】:
谁能帮我解释为什么我不能在存储过程上创建临时表。
这是我的存储过程脚本
DELIMITER $$
DROP PROCEDURE IF EXISTS getProductionItem$$
CREATE DEFINER=pvtuser@`%` PROCEDURE getProductionItem(projectID BIGINT(20))
BEGIN
CREATE TEMPORARY TABLE tempProdItem(
prodType SET('JOB','BATCH','DOCGROUP'),
taskQueueId BIGINT(20),
jobBatchDocId BIGINT(20),
jobBatchDocName VARCHAR(255),
lockStatus SET('LOCKED','OPEN')
);
DECLARE done INT DEFAULT 0;
DECLARE prodType VARCHAR(10);
DECLARE taskQueueId BIGINT(20);
DECLARE jobBatchDocId BIGINT(20);
DECLARE jobBatchDocName VARCHAR(255);
DECLARE lockStatus VARCHAR(10);
DECLARE docCursor CURSOR
FOR SELECT 'DOCGROUP',
jq.taskqueueid,
jq.documentgroupid,
dgd.documentGroupName,
COALESCE(jql.lockStatus,'OPEN')
FROM jobdetails jd
INNER JOIN jobqueue jq
ON jd.jobid=jq.jobid
INNER JOIN documentgroupdetails dgd
ON jq.documentgroupid=dgd.documentgroupid
LEFT JOIN jobqueuelocked jql
ON jq.taskqueueid=jql.taskqueueid
GROUP BY jq.taskqueueid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
OPEN docCursor;
Loop1: LOOP
FETCH docCursor INTO prodType,taskQueueId,jobBatchDocId,jobBatchDocName,lockStatus;
IF done=1 THEN
LEAVE Loop1;
ELSE
/* TODO INSERT HERE IN TEMP TABLE */
END IF;
END LOOP;
CLOSE docCursor;
SELECT * FROM tempProdItem;
END
$$
DELIMITER;
【问题讨论】:
-
1.为什么要在例程中创建表? 2. 当你第二次执行例程试图创建一个已经存在的表时会发生什么。所以先放下它,然后重新创建它。
-
请问具体的错误是什么?
-
1.我需要临时表来存储不同游标结果集上的数据。
-
这是确切的错误:脚本行:4 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'DECLARE done INT DEFAULT 0; 附近使用的正确语法;声明 prodType VARCHAR(10);在第 15 行声明任务'
-
所有 DECLARE 语句都必须位于 BEGIN-END 子句的开头。在声明之后放置“CREATE TABLE”语句。
标签: mysql stored-procedures temp-tables