简体   繁体   English

使用存储过程进行SQL插入

[英]SQL insert using stored procedure

I am fighting an error which is stopping my stored procedure from working: 我正在解决一个错误,该错误使我的存储过程停止工作:

"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 'IF (SELECTED_PROJECT_LOBSELECTION = 'Copy the Whole Project') THEN SET lob' at line 1:" “您的SQL语法有错误;请在与MySQL服务器版本相对应的手册中找到在'IF(SELECTED_PROJECT_LOBSELECTION ='Copy整个项目')THEN SET lob'第1行附近使用的正确语法”

Here is a portion of my IF/ELSEIF statement: 这是我的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;

What am I doing incorrectly and why won't my compare work? 我做错了什么,为什么我的比较工作不起作用? Thanks! 谢谢!


UPDATE: My issue wasn't an IF/THEN compare. 更新:我的问题不是IF / THEN比较。 It was how the IN params were being read. 这就是IN参数的读取方式。 Here is the solution to that: 这是解决方案:

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 || '''';

Now, I am receiving an SQLSTATE of 07005 which is: "The cursor 'cursor-name' could not be used as specified because the prepared statement named in the declaration for the cursor was not a SELECT statement." 现在,我收到的SQLSTATE为07005:“无法按指定使用游标'cursor-name',因为在游标的声明中命名的准备好的语句不是SELECT语句。”

How can I do the insert with a stored procedure without the cursor? 如何在没有游标的情况下使用存储过程进行插入?

Here is additional code: 这是其他代码:

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;

I answered my question. 我回答了我的问题。 I removed the cursor and added an execute statement 我删除了游标并添加了一条execute语句

EXECUTE PREPSTMT;

after the Prepare 准备之后

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM