PostgreSQL 存储过程详细案例

返回多行单列

又分为几种方式

1. return next,用在 for 循环中

CREATE OR REPLACE FUNCTION funcname ( in_id integer)
RETURNS SETOF varchar as $$
DECLARE
    v_name varchar;
BEGIN
   for v_name in  ( (select  name  from test_result1  where id = in_id) union (select  name  from test_result2  where id = in_id) ) loop
     RETURN NEXT v_name;
   end loop;
   return;
END;
$$
LANGUAGE PLPGSQL;

注意

1. 循环外还有个 return

2. 需要实现声明 v_name

2. return query,无需 for 循环

CREATE OR REPLACE FUNCTION funcname ( in_id integer)
RETURNS SETOF varchar as $$
DECLARE
    v_rec RECORD;
BEGIN
   return query  ( (select  name  from test_result1  where id = in_id) union (select  name  from test_result2  where id = in_id) );
   return;
END;
$$
LANGUAGE PLPGSQL;

注意:如果 返回类型为 setof,最好用如下方法

RETURN QUERY EXECUTE SQL

不要这么用

execute sql into  out;
return out;

返回多行多列

也有多种方式

1. 使用 return next 和  setof record ,需要 for 循环

CREATE OR REPLACE FUNCTION funcname ( in_id integer)
RETURNS SETOF RECORD as $$
DECLARE
    v_rec RECORD; 
BEGIN
   for v_rec in  ( (select id , name  from test_result1  where id = in_id) union (select id , name  from test_result2  where id = in_id) )loop
    RETURN NEXT v_rec;
   end loop;
   return;
END;
$$
LANGUAGE PLPGSQL;

注意

1. 读取表的整行数据时才能用 record

2. 如果读取的数据不是整行,需要自定义 复合数据类型,否则会报如下错误

ERROR:  a column definition list is required for functions returning "record"

定义复合类型,示例如下

create type myout2 as (
road_num int,
freq bigint
);

create or replace function test(car text, time1 text, time2 text)
returns setof myout2 as $$

declare 
    array1 text[];
    array2 text[];
    len1 integer;
    len2 integer;
    x integer;
    y integer;
    road_str text;
    car_str text;
    sql text;
    i myout2;
    
begin
    -- vin 号拼接
    select regexp_split_to_array(car, ',') into array2;
    select array_length(array2, 1) into len2;
    car_str := '';
    y := 1;
    while y <= len2 loop
    car_str := car_str || quote_literal(array2[y]) || ',';
    y := y + 1;
    end loop;

    -- sql 拼接
    sql := 'select road_number, sum(frequency) from heat_map where date_key >= '''
    || time1
    || '-01'' and date_key <='''
    || time2
    || '-20'' and vin in ('
    || rtrim(car_str, ',') 
    || ')group by road_number;';
    --execute sql into out;
    for i in execute sql loop
    return next i;
    end loop;
    return;

end

$$ language plpgsql;

在执行时可能会报如下错误

ERROR:  set-valued function called in context that cannot accept a set

解决方法

select funcname(arg);
--改为
select * from funcname(arg);

2.  return query,无需 for 循环

CREATE OR REPLACE FUNCTION funcname ( in_id integer)
RETURNS SETOF RECORD as $$
DECLARE
    v_rec RECORD;
BEGIN
   return query  ( (select id , name  from test_result1  where id = in_id) union (select id , name  from test_result2  where id = in_id) );
   return;
END;
$$
LANGUAGE PLPGSQL;

3. 使用 out 输出参数

 CREATE OR REPLACE FUNCTION funcname ( in_id integer,out o_id integer,out o_name varchar)
 RETURNS SETOF RECORD as $$
DECLARE
    v_rec RECORD;
BEGIN
   for v_rec in  ( (select id , name  from test_result1  where id = in_id) union (select id , name  from test_result2  where id = in_id) )loop
    o_id   := v_rec.id;
    o_name := v_rec.name;
    RETURN NEXT ;
   end loop;
   return;
END;
$$
LANGUAGE PLPGSQL;

总结 - return next && return query 

我们可以看到上面无论是单列多行还是多列多行,都用到了 return next 和 return query 方法

在 plpgsql 中,如果存储过程返回 setof sometype,则返回值必须在 return next 或者 return query 中声明,然后有一个不带参数的 retrun 命令,告诉函数执行完毕;    【setof 就意味着 多行】

用法如下

RETURN NEXT expression;
RETURN QUERY query;
RETURN QUERY EXECUTE command-string [ USING expression [, ... ] ];

return next 可以用于标量和复合类型数据;

return query 命令将查询到的一条结果追加到函数的结果集中;

二者在单一集合返回函数中自由混合,在这种情况下,结果将被级联。【有待研究】

return query execute 是 return query 的变形,它指定 sql 将被动态执行;

return query select road_number, sum(frequency) from heat_map group by road_number; --这样可以

sql := 'select road_number, sum(frequency) from heat_map group by road_number';
return query sql;  
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Kubernetes上部署SonarQube的案例,可以按照以下步骤进行操作: 1. 创建一个Kubernetes集群:您可以使用自己喜欢的Kubernetes发行版,如Minikube、Docker Desktop或云提供商(如GKE、AKS、EKS等)提供的托管Kubernetes服务。 2. 部署数据库:SonarQube需要使用数据库存储数据。您可以选择使用MySQL或PostgreSQL等关系型数据库。在Kubernetes上,可以使用Helm来简化数据库的部署。例如,使用以下命令来安装PostgreSQL数据库: ```shell helm repo add bitnami https://charts.bitnami.com/bitnami helm install my-postgresql bitnami/postgresql ``` 3. 部署SonarQube:使用Helm来部署SonarQube。可以通过添加Helm存储库并安装SonarQube chart来完成。例如,使用以下命令来安装SonarQube: ```shell helm repo add oteemo https://oteemo.github.io/charts helm install my-sonarqube oteemo/sonarqube ``` 4. 配置Ingress:如果您希望通过外部访问SonarQube,则需要配置Ingress。具体配置方式取决于您所使用的Kubernetes集群和Ingress控制器。以下是一个示例: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: sonarqube-ingress spec: rules: - host: sonarqube.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-sonarqube-sonarqube port: number: 9000 ``` 您可以将`sonarqube.example.com`更改为您自己的域名,并将`my-sonarqube-sonarqube`更改为您在步骤3中安装的SonarQube服务的名称。 5. 访问SonarQube:完成上述步骤后,您可以通过浏览器访问SonarQube。如果已配置Ingress,则使用配置的域名进行访问。否则,您可以通过Kubernetes服务的IP和端口访问。 这里提供了一个基本的SonarQube部署案例,您可以根据自己的需求进行进一步的配置和定制化。请注意,这只是一个示例,具体的部署步骤可能因您的环境和需求而有所不同。建议您参考相关文档和官方指南以获取更详细的部署说明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhang.Voi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值