简体   繁体   English

如何将存储过程参数传递给雪花中的游标?

[英]How can I pass a stored procedure parameter into a cursor in snowflake?

I am currently trying to pass a parameter into a stored procedure and use this parameter when creating a cursor unsuccessfully.我目前正在尝试将参数传递到存储过程中,并在创建游标失败时使用此参数。 Here is a simplified snippet of the code I currently have for creating the stored procedure:这是我目前用于创建存储过程的代码的简化片段:

     CREATE OR REPLACE PROCEDURE PROC_MODEL_CREATE_TABLE_PROFILE(TABLE2PROFILE string)
        RETURNS TABLE()
        LANGUAGE SQL
        AS
        $$
        
       
        
        declare
        
            sql string;
            final_sql string;
            c1 cursor for (
            
        
        SELECT
    
        TABLE_NAME as TABLENAME
        from TABLE_OF_TABLES
        WHERE tablename LIKE ANY (' ||:TABLE2PROFILE|| ')
        ORDER BY TABLENAME;
            res resultset;
        begin
        
          final_sql := '';
          
          for record in c1 do
    sql := 'SELECT COUNT(*) AS Number_Of_Rows'
    FROM '||record.tablename||';

    final_sql := final_sql || sql;
        
  end for;
  
   final_sql := 'create or replace table data_profiles_LATEST as (' || final_sql || ')';

  res := (execute immediate :final_sql);
return table(res);

I then call the stored procedure using:然后我使用以下方法调用存储过程:

CALL PROC_MODEL_CREATE_TABLE_PROFILE('TABLE_OF_INTEREST');

However, when this stored procedure is run, it just runs the string ' ||:TABLE2PROFILE||但是,当运行此存储过程时,它只运行字符串 ' ||:TABLE2PROFILE|| ' without passing the parameter. ' 不传递参数。 I can hard code 'TABLE2PROFILE' with 'TABLE_OF_INTEREST' it works fine.我可以用“TABLE_OF_INTEREST”硬编码“TABLE2PROFILE”,它工作正常。 How can I pass a parameter into the stored procedure and use it in the cursor?如何将参数传递到存储过程并在游标中使用?

There are syntactical issue in the code shared.共享代码中存在语法问题。 As I understand you want to pass a multi-valued string, select based on that and then do further operations.据我了解,您想传递一个多值字符串,根据它进行选择,然后进行进一步的操作。

Please refer sample code below that shows same.请参考下面显示相同的示例代码。

Notice how to use multi-values variable for LIKE ANY .注意如何为LIKE ANY使用多值变量。

Notice how to use parameter in cursor variable.注意如何在游标变量中使用参数。 Refer this for details on passing parameter to cursor variables.有关将参数传递给游标变量的详细信息,请参阅this

CREATE OR REPLACE PROCEDURE PROC_MODEL_CREATE_TABLE_PROFILE(TABLE2PROFILE string)
        RETURNS string
LANGUAGE SQL
AS
        $$
        declare
            sql string;
            final_sql string;
            c1 cursor for
SELECT *
from test_tab
where name like ANY (select value from table(split_to_table(?,',')));

        begin
  open c1 using (:TABLE2PROFILE);
          final_sql := '';
          for record in c1 do
    sql := 'SELECT  '
||record.name||';';
    final_sql := final_sql || sql;
  end for;
return final_sql;
end;
$$;

Procedure execution -程序执行 -

call PROC_MODEL_CREATE_TABLE_PROFILE('%oh%,%ar%');
PROC_MODEL_CREATE_TABLE_PROFILE PROC_MODEL_CREATE_TABLE_PROFILE
SELECT John;SELECT Mark;SELECT Gary;选择约翰;选择马克;选择加里;

Source table used in procedure -过程中使用的源表 -

select * from test_tab limit 1;
ID ID NAME姓名 CREATED已创建
1 1 John约翰 14/03/2022 14/03/2022

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM