如何使用游标获取数据库名称列表?已知SQL语句实现方式
使用游标实现筛选特定前缀的数据库名称(Snowflake)
当然可以用游标实现这个需求,而且完全能把两条语句的逻辑整合到游标工作流里,不是必须分开执行。
两种实现方式
方式一:直接在游标定义中整合逻辑
把SHOW DATABASES和后续的筛选逻辑直接嵌套到游标查询里,一步到位:
CREATE OR REPLACE PROCEDURE list_dev_databases() RETURNS STRING LANGUAGE SQL AS $$ DECLARE -- 游标直接基于SHOW DATABASES的结果进行筛选 cur CURSOR FOR SELECT name FROM TABLE(result_scan((SHOW DATABASES))) WHERE name LIKE 'DEV_%'; db_name STRING; result STRING := ''; BEGIN -- 遍历游标中的每个数据库名称 FOR db_name IN cur DO result := result || db_name || ', '; END FOR; -- 返回整理后的结果(去掉末尾多余的逗号空格) RETURN IFF(LEN(result) > 0, LEFT(result, LEN(result)-2), '无符合条件的数据库'); END; $$;
方式二:先执行SHOW语句,再用游标扫描结果
如果想保留两条语句的执行顺序,也可以在存储过程中先执行SHOW DATABASES,再用游标扫描其结果:
CREATE OR REPLACE PROCEDURE list_dev_databases() RETURNS STRING LANGUAGE SQL AS $$ DECLARE cur CURSOR FOR SELECT name FROM TABLE(result_scan(-1)) WHERE name LIKE 'DEV_%'; db_name STRING; result STRING := ''; BEGIN -- 先执行SHOW语句,结果暂存到会话中 SHOW DATABASES; -- 遍历筛选后的结果 FOR db_name IN cur DO result := result || db_name || ', '; END FOR; RETURN IFF(LEN(result) > 0, LEFT(result, LEN(result)-2), '无符合条件的数据库'); END; $$;
关于“能否用两条语句创建游标”的疑问
不是不能用两条语句,而是可以通过存储过程把两条语句串联起来:先执行SHOW DATABASES生成结果集,再让游标基于这个结果集的扫描结果进行查询。或者像第一种方式那样,用嵌套语法把两条语句的逻辑合并成游标查询的一部分,本质上还是复用了原有的两条语句的逻辑。
游标本身就是用来遍历结果集的工具,它可以基于任何合法的SELECT查询(包括用result_scan生成的结果集)来创建,所以完全适配你的需求。
内容的提问来源于stack exchange,提问作者Eric Mamet
相关产品推荐
相关产品推荐

