- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Postgres 中开发一个函数,旨在为查询的每条记录恢复一组函数中包含的检查结果的值。这些函数中只有一个会返回正确的值。这些函数有一个公共(public)前缀“fn_condicao_”,并接收一个“my_table”类型的对象作为参数。
由于进行检查的函数数量未知,我决定查阅 Postgres 目录,从表 pg_catalog.pg_proc
中搜索前缀为 'fn_condicao_' 的函数并动态执行它们执行。
我的问题是如何为 EXECUTE 传递正确的形状参数.
create or replace function test_conditions()
returns void as
$$
declare
v_record my_table%rowtype;
v_function pg_proc%rowtype;
begin
set search_path = 'pg_catalog';
for v_record in (select * from my_table where id in (1,2,3)) loop
for v_function in (
SELECT p.proname
FROM pg_namespace n
JOIN pg_proc p
ON p.pronamespace = n.oid
WHERE n.nspname = 'operacional'
and p.proname like ('fn_condition\\_%')
order by p.proname)
loop
--execute 'select ' || v_function.proname || '(' || v_record || ')';
end loop;
end loop;
end;
$$
language plpgsql;
如何在上面函数的注释EXECUTE
命令中正确传递v_record
?
execute 'select ' || v_function.proname || '(' || v_record || ')'; -- ???
示例函数:
create or replace function fn_condition_1(p_record my_table)
returns bigint as
$$
begin
if ($1.atributo1 > $1.atributo2) then
return 1;
end if;
return null;
end;
$$
language plpgsql;
最佳答案
我相信你的问题是你的函数中的 execute
命令试图插入 v_record
的值,这实际上将它变成了一个离散的参数列表,而不是函数期望的 native 行类型。
如果您愿意更改每个函数的参数类型,这可能是处理此问题的最简单方法。如果不是,那么您需要某种方式将 native 行类型传递给动态函数调用。尽管这看起来很糟糕,但我认为这样的事情会奏效:
create or replace function test_conditions()
returns void as
$$
declare
v_record my_table%rowtype;
v_function pg_proc%rowtype;
begin
set search_path = 'pg_catalog';
for v_record in (select * from my_table where id in (1,2,3)) loop
for v_function in (
SELECT p.proname
FROM pg_namespace n
JOIN pg_proc p
ON p.pronamespace = n.oid
WHERE n.nspname = 'operacional'
and p.proname like ('fn_condition_%')
order by p.proname)
loop
execute '
do $ZOOM$
declare
v_rec my_table%rowtype;
begin
select *
into v_rec
from my_table
where id = ' || v_record.id || ';
perform ' || func_name || '(v_rec);
end;
$ZOOM$
';
end loop;
end loop;
end;
$$
此外,我认为您需要将 select
更改为 perform
(如上所述)...或者执行 select into
.
关于sql - 在 EXECUTE 上传递 ROWTYPE 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34933753/
如何获取使用 %ROWTYPE 参数的 PLSQL 过程的真实签名? 例如 : clear screen; prompt > Table creation to support %ROWTYPE cr
我是 PL/SQL 的新手,并尝试创建一个引用表行的对象: CREATE OR REPLACE TYPE my_object AS OBJECT( table_row my_table%ROWTY
我在 PostgreSQL 9.2.9 中有一个 plpgsql 函数需要返回多个列。大多数列都来自一个表,所以我声明了虚拟表(这个术语正确吗?)rc 为: rc "Sequence"%rowtype
我需要一个模式级类型(从 C++ 代码引用它),它总是与表的 %rowtype 记录相同(相同的字段)。遗憾的是,我不能直接从代码中使用 %rowtype,只能使用声明为 的命名类型 create t
下面的 W.r.t 代码我不能将 fetch-into-variable 的类型声明为基础表的 %ROWTYPE,因为 SYS_REFCURSOR 位于连接两个表的选择上,并且还选择了一些在基础两个表
所以我有一个存储过程ONE create or replace PROCEDURE ONE ( A in number B in number ... ZZ out SYS_R
我有一个 Oracle 12c 数据库,其中有一个包含标识列的表: CREATE TABLE foo ( id NUMBER GENERATED ALWAYS AS IDENTITY PRI
我有一个变量定义如下: declare TYPE tnr_l IS VARRAY(30) of lve%ROWTYPE; 我希望通过从数据库中获取数据来初始化此变量: select * int
我在函数内部声明如下: SEL_USER APP.USER % ROWTYPE; 然后我做了选择 完美运行: SELECT * INTO SEL_USER FROM APP.USER WHE
将数据从 csv 加载到现有 Postgres 表后,我将有需要合并的重复记录。为此,我计划使用执行以下操作的存储过程: current_record airports%ROWTPE; n
我目前正在用 plpgsql 语言编写一个函数来创建分区,该分区将保存每个月的传感器数据(一个分区用于一个月和一个传感器)。我被这个错误困住了: ERROR: missing FROM-clause
我有一个 PostgreSQL 函数,如下所示: CREATE FUNCTION myFunc() returns myTable as $$ DECLARE my_row myTable%ROWTY
创建具有一种行类型的简单 TableView 相当容易。你只要设置 tableView.setNumberOfRows(yourArray.count, withRowType: "yourowtyp
我有一个看起来像的存储过程: PROCEDURE get_curx( p_buf IN ni_imsi%ROWTYPE, p_bufx
如果我有一个函数,它只返回包含表中某些列的一行。我需要在函数返回声明中添加%rowtype吗? CREATE OR REPLACE FUNCTION test(int n) RETURNS table
TYPE ref_cur IS REF CURSOR; ref_cur_name ref_cur; TYPE tmptbl IS TABLE OF ref_cur_name%ROWTYPE
我现在没有权限来测试这个,但是下面是——或者类似的东西,因为我的即兴代码可能并不完美! -- 在 Oracle 中可能: declare myRecord myTable%ROWTYPE; beg
我正在尝试在 postgres 中创建一个函数,该函数从一个表中检索数据并将其输入到另一个表中。我正在使用 %ROWTYPE 类型来存储来自 select 语句的临时数据,然后使用插入语句遍历它,但没
所需的设置 为了提高某些代码的优雅,我想知道是否/可以做与%ROWTYPE variable from table name相反的事情— 从 %ROWTYPE 或 RECORD 中提取表名(最相关的是
我正在 Postgres 中开发一个函数,旨在为查询的每条记录恢复一组函数中包含的检查结果的值。这些函数中只有一个会返回正确的值。这些函数有一个公共(public)前缀“fn_condicao_”,并
我是一名优秀的程序员,十分优秀!