在存储过程MySQL中将列作为参数传递

cuxqih21  于 2023-01-08  发布在  Mysql
关注(0)|答案(2)|浏览(127)

我正在尝试使用phpMyAdmin创建一个存储过程,它有2列作为参数。下面是我必须转换为带参数的存储过程的SQL代码:

SELECT c1.tara, c2.tara
FROM clase c1 JOIN clase c2 ON (c1.clasa > c2.clasa)
WHERE c1.deplasament = c2.deplasament AND c1.tip = c2.tip;

以下是表格的定义:

CREATE TABLE Clase (
    clasa VARCHAR2(30),
    tip VARCHAR2(12),
    tara VARCHAR2(30),
    nr_arme NUMBER(4,0),
    diametru_tun VARCHAR2(20),
    deplasament VARCHAR2(20));

查询显示了具有相同去血浆和头端的国家对。
为了创建存储过程,我使用phpMyAdmin中的“create new routine”选项。我知道对于这类问题,我必须使用预准备语句。我做了以下操作:

SET @s=CONCAT('SELECT c1.tara, c2.tara FROM clase c1 JOIN clase c2 ON (c1.clasa > c2.clasa) WHERE c1.',p_col1,'=c2.',p_col1,' AND c1.',p_col2,'=c2.',p_col2);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

p_col1和p_col2是IN VARCHAR参数。当我单击“执行”时,我得到以下错误代码:#1064,这是一个语法错误,在第二行。我不知道语法哪里出了问题。其他的预准备语句的例子使用相同的语法。

nx7onnlm

nx7onnlm1#

你能在这里试试吗:https://dbfiddle.uk/drIJr39p
工作正常:

CREATE DEFINER=`root`@`localhost` PROCEDURE getData(p_col1 varchar(20), p_col2 varchar(20) )
BEGIN
    
    SET @s = CONCAT('SELECT c1.tara, c2.tara FROM clase c1 JOIN clase c2 ON (c1.clasa > c2.clasa) WHERE c1.',p_col1,'=c2.',p_col1,' AND c1.',p_col2,'=c2.',p_col2);
    -- select @s;
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
end
b0zn9rqh

b0zn9rqh2#

这里的问题似乎是phpMyAdmin对您的期望。
即使看起来你只需要在定义域中输入代码块,phpMyAdmin会处理剩下的事情(例如,如果需要的话,添加一个beginend),phpMyAdmin也会要求你在代码中包含BEGINEND,如果它有多个语句的话。
因此,在“定义”输入区,只需输入

BEGIN
  SET @s=CONCAT('SELECT c1.tara, c2.tara FROM clase c1 JOIN clase c2 
    ON (c1.clasa > c2.clasa) 
    WHERE c1.',p_col1,'=c2.',p_col1,' AND c1.',p_col2,'=c2.',p_col2);
  PREPARE stmt FROM @s;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END

其他的都很好。

相关问题