0

ストアド プロシージャのクエリの一部としてカンマ区切りの文字列を使用しようとしていますが、機能しません。文字列を次のようにしたい:

'db1''db2''db3'

これは手順の例です (読みやすくするために多くのコードを省略しています)。

CREATE PROCEDURE test(taskId int)
begin

declare done int default false;
declare ignore_db varchar(1024);

declare cur1 cursor for select schema_name from information_schema.schemata where schema_name not in (ignore_db);
declare continue handler for not found set done = true;

select value into ignore_db from dbw_parameters where upper(name)=upper('ignore db') and task_id = taskID;

select schema_name from information_schema.schemata where schema_name not in (ignore_db);
end;

私はもう試した:

set ignore_db=concat('\'',replace(ignore_db,',','\',\''),'\'');

ただし、結果('db1','db2','db3')は 1 つの文字列として認識されます。文字列を複数のデータベースとして扱うために必要です。

何か案は?

4

1 に答える 1

1

リストに引用符を追加する必要はありません。LOCATE関数を使用するだけです

CREATE PROCEDURE test(taskId int)
begin

declare done int default false;
declare ignore_db varchar(1024);

declare cur1 cursor for select schema_name from information_schema.schemata where schema_name not in (ignore_db);
declare continue handler for not found set done = true;

select value into ignore_db from dbw_parameters where upper(name)=upper('ignore db') and task_id = taskID;

select schema_name from information_schema.schemata
where LOCATE(CONCAT(',',schema_name,','),CONCAT(',',ignore_db,',')) > 0;

end;

LOCATE関数をこのように使用する生の例を次に示します。

mysql> select LOCATE(',db1,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db1,',',db1,db2,db3,') |
+---------------------------------+
|                               1 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select LOCATE(',db2,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db2,',',db1,db2,db3,') |
+---------------------------------+
|                               5 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select LOCATE(',db3,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db3,',',db1,db2,db3,') |
+---------------------------------+
|                               9 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select LOCATE(',db4,',',db1,db2,db3,');
+---------------------------------+
| LOCATE(',db4,',',db1,db2,db3,') |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (0.00 sec)

mysql>

ところで、ignore_dbを追加のコンマで囲む理由は、データベース名自体に関係しています。

共通のプレフィックスを持つデータベースがある場合、意図しないデータベースが重複しているように見えることがあります。たとえば、データベースdb1、db11、db2、db22、db111があるときにignore_dbがdb1、db2だった場合、結果として5つのatabaseすべてが表示されます。したがって、WHERE句のignore_dbとschema_nameの両方にコンマを追加しました

于 2012-06-19T16:44:21.833 に答える