2013-05-05 3 views
0
DELIMITER $$ 

USE `RTList`$$ 

DROP PROCEDURE IF EXISTS `INSERT_INTO_MT_Tables`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `INSERT_INTO_MT_Tables`(
IN mtTableName VARCHAR(10) 
, IN mTableName VARCHAR(15) 
, IN mtField VARCHAR(15) 
, IN mtItemID VARCHAR(15) 
, IN mtItemName VARCHAR(15) 
, IN AdminID INT) 
BEGIN 

DECLARE @SQLString VARCHAR(200); 

SET @SQLString = 
'INSERT INTO ' + mtTableName + 
'(' + mtItemID + ', ' + mtField + ', User_Created, Date_Created, User_Modified, Date_Modified)' 
+ ' SELECT ' + mtItemID + ' , ' + mtField + ', AdminID, NOW(), AdminID, NOW() 
FROM ' + mTableName + ' 
WHERE ' + mtField + ' = ''' + mtItemName + ''' LIMIT 1;'; 

PREPARE test FROM @SQLString; 
EXECUTE test; 

END$$ 

DELIMITER ; 

CALL INSERT_INTO_MT_Tables('MT_Phone', 'M_Phone', 'Phone_Number', 'PhoneID', '12345678', 1); 

오류 메시지 (종료 후 cmd를 실행)되는 MYSQL 저장 프로 시저에 exec 명령을 실행할 수 없습니다 : 내가 전에 cmd를 실행 (변경 후 다음 내가 변경 한 후 다음

Error Code: 1064 
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXECUTE test; 
DELIMITER' at line 2 

오류 메시지입니다 끝) :이

Error Code: 1064 
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@SQLString VARCHAR(200); 
SET @SQLString = 
'INSERT INTO ' + mtTableName + 
'(' + ' at line 9 

안녕,

가 내 코딩 위의 참조하십시오. 저장 프로 시저에 대한 지식이 거의 없습니다. 하지만이 질문을 게시하기 전에 주위를 둘러 보려고했습니다. cmd가 간단하지만 여전히 운이없는 것 같습니다.이 cmd를 실행할 수 있습니다.

내가 잘못 작성하여 어디에 작동하지 않는지 알려 주실 수 있습니까?

이 기본 질문에 대한 귀하의 지식에 진심으로 감사드립니다.

감사합니다.

+2

는'문자열을 mtItemName'입니다 :

는 여기에 내가 MySQL을 5.5.30에서 테스트 스크립트의 버전입니까? –

+0

@JW 웃기지 마 .. – Febri

답변

2

PREPARE 및 EXECUTE 전에 END $$으로 프로 시저 정의를 종료했습니다. 이러한 진술은 절차 본문에 속해야합니다 (END$$ 앞에 있음).

오류의 특수한 이유는 PREPARE 문과 EXECUTE 문을 실행하면 현재 적용되는 구분 기호로 구분되지 않기 때문입니다.

두 문제를 해결하려면 PREPARE 및 EXECUTE 후에 END $$으로 줄을 옮기면됩니다. 귀하의 코멘트를 다시


: 코드 몇 가지 다른 문제가 있습니다

.

+ 연산자는 MySQL에서 문자열 연결을 수행하지 않습니다. (Microsoft SQL Server, Microsoft Access 및 Sybase의 동작입니다.) MySQL에서는 CONCAT(string1, string2, ...)을 사용하거나 SQL_MODE=PIPES_AS_CONCAT을 사용하고 || 연산자를 사용하여 ANSI SQL 구문과 일치시킵니다.

@ -prefixed user-defined variables을 선언 할 수 없습니다. 이러한 사용자 정의 변수는 세션에 범위가 지정된 전역 변수와 비슷합니다. 선언 할 필요는 없으며 사용하기 만하면됩니다. 모든 길이 문자열을 허용하므로 데이터 유형이나 길이를 선언 할 필요가 없습니다.

DECLARE로 작성된 로컬 변수가 아닌 PREPARE에는이 유형의 변수를 사용해야합니다. 따라서이 절차에서는 선언문이 필요하지 않습니다.

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `INSERT_INTO_MT_Tables`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `INSERT_INTO_MT_Tables`(
IN mtTableName VARCHAR(10) 
, IN mTableName VARCHAR(15) 
, IN mtField VARCHAR(15) 
, IN mtItemID VARCHAR(15) 
, IN mtItemName VARCHAR(15) 
, IN AdminID INT) 
BEGIN 

SET @SQLString = 
CONCAT('INSERT INTO ', mtTableName, 
'(', mtItemID, ', ', mtField, ', User_Created, Date_Created, User_Modified, Date_Modified)', 
' SELECT ', mtItemID, ' , ', mtField, ', AdminID, NOW(), AdminID, NOW() 
FROM ', mTableName, ' 
WHERE ', mtField, ' = ''', mtItemName, ''' LIMIT 1'); 

PREPARE test FROM @SQLString; 
EXECUTE test; 

END$$ 

DELIMITER ; 

CALL INSERT_INTO_MT_Tables('MT_Phone', 'M_Phone', 'Phone_Number', 'PhoneID', '12345678', 1); 
+0

조언을 주셔서 감사합니다 .. 여전히 같은 오류 코드로 실행하지 못했습니다 .. 내가 놓친 것이 있습니까? – Febri

+0

고마워요 @BillKarwin .. 지금 완벽하게 잘 작동하고 있습니다. + 기호가 작동하지 않는다는 것을 깨닫지 못했습니다. – Febri