1

MySQL ストアド プロシージャで非常にうまくいかず、データベースにこのプロシージャを作成できません (MySQL 5.5.27)

変数宣言からの私の拒否、複数選択、そしてそうでなければ(コードエラーであることを願っています)コードを貼り付けているのはなぜだろうと思っています!

DELIMITER $$

DROP PROCEDURE IF EXISTS EditEnterprise

$$

CREATE PROCEDURE  EditEnterprise(    
    IN pEnterpriseId                VARCHAR(32),    
    IN pEnterpriseName              VARCHAR(64)    
) 

/* declare the new variables */    
DECLARE nEnterpriseId               VARCHAR(32);    
DECLARE nEnterpriseName             VARCHAR(64); 

/* declare the old variables */    
DECLARE oEnterpriseId               VARCHAR(32);    
DECLARE oEnterpriseName             VARCHAR(64);

BEGIN 

SET autocommit = 0;    

/* get the old variables */    
SELECT     
    Enterprise_ID = oEnterpriseId,    
    Enterprise_Name = oEnterpriseName    
FROM     
    enterprise    
WHERE    
    Enterprise_ID = pEnterpriseId;    

/* set the variables with the new inputs */  
IF pEnterpriseName = NULL    
    SET nEnterpriseName = oEnterpriseName    
ELSE IF pEnterpriseName = ''    
    SET oEnterpriseName = NULL    
ELSE
    SET nEnterpriseName = pEnterpriseName    


UPDATE enterprise    
SET     
    Enterprise_Name = nEnterpriseName    
WHERE Enterprise_ID = pEnterpriseId;

COMMIT;

END $$

DELIMITER ; 
4

2 に答える 2

2

SPにはいくつかの間違いがあり、次のようになります。

DELIMITER $$
DROP PROCEDURE IF EXISTS EditEnterprise
$$
CREATE PROCEDURE  EditEnterprise(
    IN pEnterpriseId                VARCHAR(32),
    IN pEnterpriseName              VARCHAR(64)
)

BEGIN

/* declare the new variables */
DECLARE nEnterpriseId               VARCHAR(32);
DECLARE nEnterpriseName             VARCHAR(64);

/* declare the old variables */
DECLARE oEnterpriseId               VARCHAR(32);
DECLARE oEnterpriseName             VARCHAR(64);

SET autocommit = 0;

/* get the old variables */
SELECT 
    @oEnterpriseID := Enterprise_ID,
    @oEnterpriseName := Enterprise_Name
FROM 
    enterprise
WHERE
    Enterprise_ID = pEnterpriseId;

/* set the variables with the new inputs */
IF pEnterpriseName = NULL THEN  
    SET @nEnterpriseName = @oEnterpriseName;
ELSEIF pEnterpriseName = '' THEN   
    SET @oEnterpriseName = NULL;
ELSE
    SET @nEnterpriseName = pEnterpriseName;
END IF;

UPDATE enterprise
SET 
    Enterprise_Name = nEnterpriseName,
    Enterprise_Established_Date = nEnterpriseCreateDate,
    Enterprise_Description = nEnterpriseDetails,
    Enterprise_Type = nEnterpriseType,
    Enterprise_Status = nEnterpriseStatus
WHERE Enterprise_ID = pEnterpriseId;
COMMIT;

END $$
DELIMITER ; 

指摘すべきいくつかのエラー

  • 複数の条件のELSEIFの場合は、代わりにそのELSEIF

  • 変数「DECLAREmyvarVARCHAR(32)」を宣言した後、SETコマンドを使用していない場合は、:=を使用して値を割り当てる必要があります。

于 2013-02-25T03:50:38.303 に答える
2

Mysql (Oracle とは異なります) では、DECLARE後に続きます。BEGIN

コードは次のようになります。

DELIMITER $$

DROP PROCEDURE IF EXISTS EditEnterprise$$

CREATE PROCEDURE  EditEnterprise(
    IN pEnterpriseId                VARCHAR(32),
    IN pEnterpriseName              VARCHAR(64)
) 
BEGIN 
/* declare the new variables */
DECLARE nEnterpriseId               VARCHAR(32);
DECLARE nEnterpriseName             VARCHAR(64);

/* declare the old variables */
DECLARE oEnterpriseId               VARCHAR(32);
DECLARE oEnterpriseName             VARCHAR(64);

SET autocommit = 0;

/* get the old variables */
SELECT 
    Enterprise_ID := oEnterpriseId,
    Enterprise_Name := oEnterpriseName
FROM 
    enterprise
WHERE
    Enterprise_ID = pEnterpriseId;

/* set the variables with the new inputs */


IF pEnterpriseName IS NULL THEN
    SET nEnterpriseName = oEnterpriseName;
ELSEIF pEnterpriseName = '' THEN
    SET oEnterpriseName = NULL;
ELSE
    SET nEnterpriseName = pEnterpriseName;
END IF;

UPDATE enterprise SET 
    Enterprise_Name = nEnterpriseName
WHERE Enterprise_ID = pEnterpriseId;

COMMIT;

END$$

DELIMITER ; 

欠落していた;,THENおよびEND IFキーワードも追加しました。また、次の行にタイプミスがある可能性があることに注意してください。

SET oEnterpriseName = NULL;

あなたはおそらく次のことを意味していました:

SET nEnterpriseName = NULL;

ここで、ストアド プロシージャを再検討する必要があると思います。実際、これはすべて単一の SQL クエリで実行できます。これには本当にストアドプロシージャが必要ですか? 制限的な許可ポリシーがある場合を除いて、それは不要かもしれません。

于 2013-02-24T16:40:31.163 に答える