mysqlストレージ・プロシージャ:あるテーブルが別のテーブルをコピーするフィールドを実装する
2664 ワード
1.ストレージプロセス
機能:ログイン検証
論理:
(1)パラメータの説明:
v_name:ユーザーログイン名
v_psd:ユーザーパスワード
v_out:ユーザーが存在しないか、ユーザーパスワードが正しくないかv_out=1、そうでなければv_out=9
(2)手順:
a.ユーザテーブルuserからユーザ名v_を問い合わせるnameのユーザーが存在するかどうか
存在する場合は次のステップに進みます.そうでない場合はv_out=1
b.ユーザテーブルuserからユーザ名v_を問い合わせるnameのユーザーのパスワードpass
ユーザパスワードとv_を判断psdが等しいかどうか、等しい場合v_out=9そうでなければv_out=1
コード#コード#
2.最初のテーブルのフィールドを2番目のテーブルにコピー
機能:フィールドのコピー
論理:
1.1つのsql文ですべての異なるフィールドの情報を検索し、カーソルに格納する
SELECT * FROM information_schema.COLUMNS WHERE table_name = 'sp_usercoupon1' AND table_schema = 'cpdb_dev' AND COLUMN_NAME NOT IN
(SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name = 'sp_usercoupon' AND table_schema = 'cpdb_dev');
2.カーソルを巡回します.カーソルの各ローはrowtypeタイプの変数です.rowtype.フィールド名によるフィールドデータの取得
3.cloumn_の取得name,data_type,character_maximum_lengthパッチalter table文.
4.alter table文を1回実行します.
難点:mysqlはrowtypeのように正行のデータ型を表していません.
まとめ:問題は解決されず、異なるフィールド情報を取得しただけで、カーソルで巡回するのは単一のフィールドですが、プログラムは実行でき、カーソルは実行できます.
機能:ログイン検証
論理:
(1)パラメータの説明:
v_name:ユーザーログイン名
v_psd:ユーザーパスワード
v_out:ユーザーが存在しないか、ユーザーパスワードが正しくないかv_out=1、そうでなければv_out=9
(2)手順:
a.ユーザテーブルuserからユーザ名v_を問い合わせるnameのユーザーが存在するかどうか
存在する場合は次のステップに進みます.そうでない場合はv_out=1
b.ユーザテーブルuserからユーザ名v_を問い合わせるnameのユーザーのパスワードpass
ユーザパスワードとv_を判断psdが等しいかどうか、等しい場合v_out=9そうでなければv_out=1
コード#コード#
DELIMITER $$
CREATE PROCEDURE proc_login
(IN v_name VARCHAR(16),
IN v_psd VARCHAR(8),
OUT v_out INT)
BEGIN
DECLARE v_pass VARCHAR(8) ;
DECLARE v_num INT ;
SELECT COUNT(*) INTO v_num FROM USER WHERE NAME=v_name;
IF v_num<>0 THEN
SELECT pass INTO v_pass FROM USER WHERE NAME=v_name;
IF v_pass=v_psd THEN
SET v_out=9;
ELSE
SET v_out=1;
END IF;
ELSE
SET v_out=1;
END IF;
END$$
DELIMITER ;
2.最初のテーブルのフィールドを2番目のテーブルにコピー
機能:フィールドのコピー
論理:
1.1つのsql文ですべての異なるフィールドの情報を検索し、カーソルに格納する
SELECT * FROM information_schema.COLUMNS WHERE table_name = 'sp_usercoupon1' AND table_schema = 'cpdb_dev' AND COLUMN_NAME NOT IN
(SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name = 'sp_usercoupon' AND table_schema = 'cpdb_dev');
2.カーソルを巡回します.カーソルの各ローはrowtypeタイプの変数です.rowtype.フィールド名によるフィールドデータの取得
3.cloumn_の取得name,data_type,character_maximum_lengthパッチalter table文.
4.alter table文を1回実行します.
難点:mysqlはrowtypeのように正行のデータ型を表していません.
DELIMITER $$
CREATE PROCEDURE print
(OUT a VARCHAR(50),
OUT b VARCHAR(50),
OUT c VARCHAR(50))
BEGIN
DECLARE _kubauserid1 VARCHAR(50);
DECLARE _kubauserid2 VARCHAR(50);
DECLARE _kubauserid3 VARCHAR(50);
DECLARE flag INT;
DECLARE update_cursor CURSOR
FOR
SELECT column_name,data_type,character_maximum_length FROM information_schema.COLUMNS WHERE table_name = 'sp_usercoupon1' AND table_schema = 'cpdb_dev' AND COLUMN_NAME NOT IN
(SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name = 'sp_usercoupon' AND table_schema = 'cpdb_dev');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=1;
SET flag=0;
OPEN update_cursor;
REPEAT /* */
FETCH update_cursor INTO _kubauserid1,_kubauserid2,_kubauserid3;
SET a=_kubauserid1;
SET b=_kubauserid2;
SET b=_kubauserid3;
SELECT a,b,c;
/*update set where*/
UNTIL flag
END REPEAT;
CLOSE update_cursor ;
END$$
DELIMITER ;
CALL print(@a,@b,@c);
SELECT @a,@b,@c;
まとめ:問題は解決されず、異なるフィールド情報を取得しただけで、カーソルで巡回するのは単一のフィールドですが、プログラムは実行でき、カーソルは実行できます.