我有一个带有SELECT
的函数,它使用了一个带有变量的SIMILAR TO
表达式,但我不知道如何操作:
DECLARE pckg_data cl_data;
DECLARE contacts contacts_reg%ROWTYPE;
DECLARE sim_name varchar;
BEGIN
SELECT client_reg._name,
client_reg.last_name,
client_reg.id_card,
client_reg.address
INTO pckg_data
FROM client_reg WHERE(client_reg._name = (cl_name ||' '|| cl_lastname));
RETURN NEXT pckg_data;
SELECT ('%'||cl_name || ' ' || cl_lastname ||'%') INTO sim_name;
FOR contacts IN SELECT contacts_reg.id
FROM contacts_reg, contactscli_asc, client_reg
WHERE(contacts_reg._name SIMILAR TO sim_name) LOOP
SELECT client_reg._name, client_reg.last_name, client_reg.id_card,
client_reg.address, client_reg.id
INTO pckg_data
FROM client_reg, contactscli_asc WHERE(contactscli_asc.contact = contacts.id
AND client_reg.id = contactscli_asc.client);
END LOOP;
END;
字符串
1条答案
按热度按时间nr9pn0ug1#
你的循环查询有
CROSS JOIN
超过三个(!)表。我删除了最后两个表,因为它们不需要。其中一个在循环体中重复。也考虑@kgrittn关于CROSS JOIN
的注解。在循环体中,你重复地将数据选择到一个变量中,这 * 什么也不做 *。我假设您希望返回这些行--无论如何,我编辑的版本就是这样做的。
我用一个简单的
SELECT
和RETURN QUERY
重写了LOOP
结构,因为这样更快更简单。事实上,我把所有的东西都重写了一遍,以一种有意义的方式。你所展示的仍然是不完整的(缺少函数头),语法和逻辑上都是一团糟。
这是一个受过教育的猜测,没有更多:
字符串
否则,考虑使用的功能。
有人建议:
DECLARE
只需要一次。WHERE
子句括在括号中。SIMILAR TO
andLIKE
做这项工作更快。我从来不使用SIMILAR TO
。LIKE
或正则表达式(~
)做得更好: