0

すべてのテーブルから UserId の数を見つけたい call searchUser(3,'UserId') エラー: 0 14:30:14 コール searchUser(3,'UserId') エラー コード: 1064 SQL 構文にエラーがあります。1行目の「NULL」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください

DELIMITER $$

CREATE PROCEDURE `searchUser`( in_search int(11),in_column_name varchar(50) )
    READS SQL DATA
BEGIN
    DECLARE trunc_cmd VARCHAR(50);
    DECLARE searchUserId int (11);
    DECLARE db,tbl,clmn CHAR(50);

   DECLARE done INT DEFAULT 0;
    DECLARE COUNTER INT;


    DECLARE table_cur CURSOR FOR


    SELECT concat('SELECT COUNT(*) INTO @CNT_VALUE FROM `',table_name,'` WHERE `', in_column_name,'` = "',in_search,'"') ,table_name,column_name FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = 'comments' and column_name=in_column_name ;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

    PREPARE trunc_cmd FROM "TRUNCATE TABLE temp_details;";
    EXECUTE trunc_cmd ; 
    OPEN table_cur;

table_loop:LOOP
        FETCH table_cur INTO db, tbl, clmn;


    SET @searchUserId = searchUserId;
    SELECT  searchUserId;
    PREPARE searchUserId FROM @searchUserId;
    EXECUTE searchUserId;

    SET COUNTER = @CNT_VALUE;
    SELECT COUNTER;

    IF COUNTER>0 THEN

        INSERT INTO temp_details VALUES(db,tbl,clmn);
    END IF;

        IF done=1 THEN
            LEAVE table_loop;
        END IF;

END LOOP;
CLOSE table_cur;
SELECT * FROM temp_details;
    END
4

2 に答える 2

0

問題はこのステートメント作成ステートメントにあると思います:

SELECT concat('SELECT COUNT(*) INTO @CNT_VALUE FROM `',table_name,'` WHERE `', in_column_name,'` = "',in_search,'"') ,table_name,column_name FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = 'comments' and column_name=in_column_name ;

ステートメントをスタンドアロンで実行し、結果を確認してください。

于 2012-07-26T13:31:29.207 に答える
0

問題の原因は次のとおりです。

DECLARE searchUserId int (11);  

と:

SET @searchUserId = searchUserId;
SELECT  searchUserId;
PREPARE searchUserId FROM @searchUserId;
EXECUTE searchUserId;

あなたが考えsearchUserIdていることには価値があると思います。しかし、コードのどこにも値を割り当てていません。デフォルトでは、NULL. したがって、ステートメントEXECUTE searchUserIdは に変換されEXECUTE NULLます。これにより、指定したエラーが発生しました。

これを解決するには、まずsearchUserId宣言された変数に適切な値を割り当てる必要があります。

ところで、なぜsearchUserIdローカル変数、グローバル変数、およびステートメント エイリアスに同じ変数名を使用しているのですか? これはプログラムの読者を混乱させるため、実行することはお勧めしません。

于 2012-07-26T13:23:23.473 に答える