【问题标题】:How do I run a SHOW WAREHOUSES command within a stored procedure?如何在存储过程中运行 SHOW WAREHOUSES 命令?
【发布时间】:2022-08-17 18:54:14
【问题描述】:

我正在尝试开发一个存储过程,用户可以运行该存储过程来更改他们的默认仓库,它只有一个输入变量:用户也想要更改默认仓库的仓库。我想在检查用户输入的仓库变量是否存在的地方添加验证。

所以我希望能够在存储过程中运行“SHOW WAREHOUSES LIKE :warehouse”查询,并在此执行 SELECT COUNT (*) 以计算有多少仓库,如输入变量 :warehouse 这样我就可以验证它是否存在。我不知道如何做到这一点,所以有谁知道我可以做到这一点的方法,有一个代码示例,所以我可以看到语法?

在步骤中,我想要做的是: (1) 运行 SHOW WAREHOUSES LIKE 查询, (2) 像输入变量 :warehouse 一样,统计有多少个仓库, (3) 然后执行一个 IF 语句,如 \"IF warehouse_check =0 THEN RETURN \'warehouse doesn\'texist\'\"。

到目前为止我尝试过的(无论如何都不是 SQL 专家,还在学习所以语法可能非常糟糕)

    sql_command := \'SHOW WAREHOUSES LIKE \'||:warehouse||\';\';
    EXECUTE IMMEDIATE :sql_command;
    
    warehouse_check := \'SELECT COUNT (*) FROM (RESULT_SCAN ( { LAST_QUERY_ID() } ))\';
    EXECUTE IMMEDIATE :warehouse_check;
    
    IF (warehouse_check =0) THEN
        RETURN \'No warehouse with that name\';
    END IF;

并且

    usage_check := \'SELECT (SHOW WAREHOUSES LIKE \'||:warehouse||\');\';
    
    warehouse_check := (select count(*) from table(result_scan(last_query_id(-1))) where \"name\" = :warehouse);
    
    IF (warehouse_check = 0) THEN
        RETURN \'No warehouse with that name\';
    END IF;

如果有人有任何想法,将不胜感激!

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    这一项为用户设置了默认仓库。 SP 应该由像 accountadmin 这样的强大角色创建:

    CREATE OR REPLACE PROCEDURE DEFAULT_WAREHOUSE( wname VARCHAR )
    RETURNS VARCHAR
    LANGUAGE SQL
    EXECUTE AS OWNER
    AS
    DECLARE
       sql_command VARCHAR;
       set_warehouse VARCHAR;
       warehouse_check VARCHAR;
       res RESULTSET;
    BEGIN
        sql_command := 'SHOW WAREHOUSES LIKE '''||:wname||''';';
        res := (EXECUTE IMMEDIATE :sql_command);
        let c1 cursor for res;    
        open c1;
        fetch c1 into warehouse_check;
        close c1;
        IF ( warehouse_check = UPPER(wname) ) THEN
            set_warehouse := 'ALTER USER ' || current_user() || ' SET DEFAULT_WAREHOUSE=' || warehouse_check;
            EXECUTE IMMEDIATE set_warehouse;
            RETURN 'Warehouse is set as default for user ' || current_user();
        END IF;
        RETURN 'No warehouse with that name';
    END;
    

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多