2013-08-21 7 views
0

Я борюсь ошибкой, которая останавливает мою хранимую процедуру от работы:SQL вставки с использованием хранимой процедуры

«У Вас есть ошибка в вашем синтаксисе SQL, проверьте руководство, которое соответствует Вашей версии сервера MySQL для правильного синтаксиса использовать вблизи 'IF (SELECTED_PROJECT_LOBSELECTION = 'Копирование всего проекта') THEN SET лоб' в строке 1:»

Вот часть моего заявления IF/ELSEIF:

IF (SELECTED_PROJECT_LOBSELECTION = 'Copy the Whole Project') THEN 
    SET lobInsertStmt = ' AND p.PROJECTION_PROJECT_NME = ' || SELECTED_PROJECT_NAME 
        || ' AND p.PROJECTION_PROJ_CATG_NME = ' || SELECTED_PROJECT_CATG 
        || ' AND p.FINANCIAL_PROJECTION_YEAR_NUM = ' || CAST(SELECTED_PROJECT_YEAR AS int) 
        || ' AND g.MODEL_GROUP_SNAPSHOT_TSP = ' || SELECTED_SNAPSHOT_TIMESTAMP; 

Что я делаю неправильно и почему моя работа не будет работать? Благодаря!


UPDATE: Мой вопрос не был IF/THEN сравнить. Именно так читались параметры ИИ. Вот решение, что:

IF (SELECTED_PROJECT_LOBSELECTION = 'Copy the Whole Project') THEN 
    SET lobInsertStmt = ' AND p.PROJECTION_PROJECT_NME = ''' || SELECTED_PROJECT_NAME || '''' 
        || ' AND p.PROJECTION_PROJ_CATG_NME = ''' || SELECTED_PROJECT_CATG || '''' 
        || ' AND p.FINANCIAL_PROJECTION_YEAR_NUM = ' || TRIM(CAST(SELECTED_PROJECT_YEAR AS int)) 
        || ' AND g.MODEL_GROUP_SNAPSHOT_TSP = ''' || SELECTED_SNAPSHOT_TIMESTAMP || ''''; 

Теперь, Я получаю SQLSTATE из 07005, который: «Курсор„Курсор-имя“не может быть использовано, как указано, поскольку подготовленный оператор, названный в заявлении для курсор не был выражением SELECT. "

Как я могу вставить хранимую процедуру без курсора?

Вот дополнительный код:

REPLACE PROCEDURE "SCHEMA"."PROCEDURE_NAME" (
    IN "SELECTED_PROJECT_NAME" VARCHAR(256) CHARACTER SET LATIN, 
    IN "SELECTED_PROJECT_CATG" VARCHAR(256) CHARACTER SET LATIN, 
    IN "SELECTED_PROJECT_YEAR" VARCHAR(4) CHARACTER SET LATIN, 
    IN "SELECTED_SNAPSHOT_TIMESTAMP" VARCHAR(28) CHARACTER SET LATIN, 
    IN "SELECTED_PROJECT_TYPE" VARCHAR(6) CHARACTER SET LATIN, 
    IN "SELECTED_PROJECT_LOBSELECTION" VARCHAR(256) CHARACTER SET LATIN, 
    IN "SELECTED_LOB_NUMBERS" VARCHAR(256) CHARACTER SET LATIN, 
    IN "COPY_TO_PROJECT_NAME" VARCHAR(256) CHARACTER SET LATIN, 
    IN "REQUESTER_ID" VARCHAR(8) CHARACTER SET LATIN, 
    OUT "TEST_OUT" VARCHAR(5000) CHARACTER SET LATIN, 
    OUT "SQLSTATE_OUT" VARCHAR(5) CHARACTER SET LATIN, 
    OUT "SQLCODE_OUT" INTEGER) 
DYNAMIC RESULT SETS 1 
P1: BEGIN 

DECLARE lobInsertStmt varchar(500); 
DECLARE mystmt varchar(5000); 

DECLARE CURSOR_C CURSOR WITH RETURN FOR PREPSTMT; 

DECLARE EXIT HANDLER FOR SQLEXCEPTION 

BEGIN 
     SET SQLCODE_OUT = SQLCODE; 
     SET SQLSTATE_OUT = SQLSTATE; 
     SET TEST_OUT = mystmt; 
END; 


IF (SELECTED_PROJECT_LOBSELECTION = 'Copy the Whole Project') THEN 
    SET lobInsertStmt = ' AND p.PROJECTION_PROJECT_NME = ''' || SELECTED_PROJECT_NAME || '''' 
        || ' AND p.PROJECTION_PROJ_CATG_NME = ''' || SELECTED_PROJECT_CATG || '''' 
        || ' AND p.FINANCIAL_PROJECTION_YEAR_NUM = ' || TRIM(CAST(SELECTED_PROJECT_YEAR AS int)) 
        || ' AND g.MODEL_GROUP_SNAPSHOT_TSP = ''' || SELECTED_SNAPSHOT_TIMESTAMP || ''''; 
-- Other ElseIFs 
END IF; 
SET mystmt = 'INSERT INTO D_FAR_WORK_VW.V_COPY_MODEL_PROCESS_WORK' 
      || ' SELECT reqt.RUN_ID,''' 
      || SELECTED_PROJECT_NAME || ''' AS TO_PROJECTION_PROJECT_NME,' 
      || ' m.PROJECTION_MODEL_SEQ_ID,' 
      || ' m.PROJECTION_MODEL_ROW_SEQ_ID,' 
      || ' p.PROJECTION_PROJECT_NME as FROM_PROJECTION_PROJECT_NME, ''' 
-- More insert code 
PREPARE PREPSTMT FROM mystmt; 

OPEN CURSOR_C; 

SET TEST_OUT = mystmt; 
SET SQLSTATE_OUT = SQLSTATE; 
SET SQLCODE_OUT = SQLCODE; 
END P1; 
+0

Вы должны запустить этот код в качестве триггера или процедуры. –

+0

Можете ли вы опубликовать оставшуюся часть SQL, связанную с этим? Динамический SQL должен обрабатываться в хранимой процедуре (или, возможно, триггере). –

+0

Ваше сообщение об ошибке указывает, что вы используете MySQL, почему вы помещаете [Teradata]? – dnoeth

ответ

0

Я ответил на мой вопрос. Я убрал курсор и добавил выполнить запрос

EXECUTE PREPSTMT; 

после Приготовьте