【问题标题】:mysql insert statement as a variable [duplicate]mysql插入语句作为变量[重复]
【发布时间】:2015-03-07 07:16:57
【问题描述】:

是否可以在存储过程中将变量设置为插入语句?

类似:

set variable1 = insert into table(field1, field2, field3) values(val1, val2, variable2);

如果有,应该怎么写?

我一直在抛出错误,并且在野外的文档是不确定的。

我是为了简洁,但整个过程是这样的:

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_accession`(in barcode int, in accepted  varchar(11), in wt float(11,2), in wtunit varchar(3),in draw date, in chist varchar(256), in ghist varchar(256), in meds varchar(256), in diffdiag varchar(256),in diseasesus varchar(256),in volume int, in facility int, in patient int, in employ int, in compromised int, in receiving int, in test int)
BEGIN
declare accessionId int;
declare accessionTest int;
declare tkInsert varchar(256);
declare hptInsert varchar(256);
declare calInsert varchar(256);
declare pthInsert varchar(256);
declare vitdtkInsert varchar(256);
declare cnpInsert varchar(256);

if wtunit = 'lb' then set wt = convertLbKg(wt);
end if;

INSERT INTO accession(barcode_accession,accepted_accession,weight_accession,req_weight_units,draw_date_accession,cancer_history_accession,general_history_accession,medication_accession,differential_diagnosis_accession,disease_suspect_accession,volume_accession,facility_doctor_index_id_facility_doctor_index,patient_id_patient,employee_id_employee,accession_compromised_id_accession_compromised,receiving_id,accession_typeof_id_accession_typeof)
VALUES (barcode,accepted,wt,wtunit,draw,chist,ghist,meds,diffdiag,diseasesus,volume,facility,patient,employ,compromised,receiving,1);

set accessionId = last_insert_id();

set tkInsert = insert into pending(accession_facility_index,reagent_type,`status`)values(accessionId,1,'Pending');
set hptInsert = insert into pending(accession_facility_index,reagent_type,`status`)values(accessionId,2,'Pending');
set calInsert = insert into pending(accession_facility_index,reagent_type,`status`)values(accessionId,3,'Pending');
set pthInsert = insert into pending(accession_facility_index,reagent_type,`status`)values(accessionId,4,'Pending');

if test = 1 then tkInsert,calInsert;
elseif test =2 the hptInsert,pthInsert;
else pthInsert;
end if; 


END

【问题讨论】:

  • 您希望将变量设置为什么? INSERT 不返回结果集。
  • 我用整个存储过程更新了我的原始问题。这有点复杂,但我认为它可以理解这个想法。
  • 你想存储查询结果,还是定义一个执行查询的过程?
  • 我希望定义一个过程来执行插入查询。但是,插入有大约 8 种不同的变体,所以为了保持干燥,我认为会调用插入变量(如果存在)
  • 我猜你想要准备好的陈述:stackoverflow.com/questions/190776/…

标签: mysql


【解决方案1】:

不清楚您想要什么,但如果您的目标是存储 insert 的结果(受影响的行),您可以使用 ROW_COUNT()

ROW_COUNT() 返回更改、删除或插入的行数 如果是 UPDATE、DELETE 或 INSERT,则按最后一条语句。
对于其他语句,该值可能没有意义。

例如:

variable1 = (select ROW_COUNT());

【讨论】:

    【解决方案2】:

    我想你正在寻找prepared statements

    PREPARE tkInsert FROM CONCAT("insert into pending(accession_facility_index,reagent_type,`status`)values(?, 1,'Pending')";
    

    然后你执行它:

    EXECUTE tkInsert USING accessionId;
    

    【讨论】:

    • 准备好的查询是像过程或函数这样的通用查询吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多