使用主体中的过程参数动态创建语句

问题描述 投票:0回答:1

我正在尝试在动态创建的语句中使用为过程提供的参数。我设法做到了这一点,但我相信这必须以更“干净”的方式成为可能。对于我面临的问题,给出的例子是我能想到的最小的例子。

设置:

create database test_db;
create schema test_schema;
create table test_db.test_schema.test_table(my_val varchar);

以下程序有效:

create or replace secure procedure test_db.test_schema.test_2(my_table varchar)
returns integer
language SQL
execute as caller
as
declare
    my_count integer default 1;
    lookup resultset;
    statement varchar;
begin
    statement := 'select count(*) as count from test_db.test_schema.' || :my_table || ';';
    lookup := (execute immediate :statement);
    
    let c1 cursor for lookup;
    for row_variable in c1 do
        my_count := row_variable.count;
    end for;
    return my_count;
end;


call test_db.test_schema.test_2('test_table');

但是,这里我需要创建一个结果集并使用游标对其进行迭代。这感觉效率很低。所以我尝试将其重写为:

create or replace secure procedure test_db.test_schema.test_1(my_table varchar)
returns integer
language SQL
execute as caller
as
declare
    my_count integer default 1;
begin
    select count(*) into my_count from test_db.test_schema || :my_table;
    -- select count(*) into my_count from concat('test_db.test_schema', :my_table); 
    return my_count;
end;

使用

||
concat
的解决方案都会导致错误:

Syntax error: unexpected 'count'. (line 13)

这是为什么,您是否看到任何其他选项来改进此代码片段?

sql snowflake-cloud-data-platform
1个回答
0
投票

可以重写该过程以避免使用游标和 SQL 字符串连接:

create or replace secure procedure test_db.test_schema.test_1(my_table varchar)
returns integer
language SQL
execute as caller
as
declare
    my_count integer := 1;
    full_table_name text := 'test_db.test_schema.' || my_table;  
begin
    my_count := (select count(*)from IDENTIFIER(full_table_name));
    
    return my_count;
end;
© www.soinside.com 2019 - 2024. All rights reserved.