我正在尝试在动态创建的语句中使用为过程提供的参数。我设法做到了这一点,但我相信这必须以更“干净”的方式成为可能。对于我面临的问题,给出的例子是我能想到的最小的例子。
设置:
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 字符串连接:
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;