在PL/pgSQL中模拟GOTO语句的实现

Postgresql 的 PL/pgsql不支持 GOTO 跳转,但某些时候 GOTO 确实能给我们带来便利,伪代码

i = 0;

label: goto_label
  i = i + 1
  if (i < 100)
    goto goto_label

这种情况我们可以这样模拟:

i = 0;
<<goto_label>>
LOOP
  i = i + 1;

  IF i < 100 THEN
    CONTINUE goto_label;
  END IF;

  EXIT goto_label;
END LOOP;

复杂状况,如果是嵌套式跳转,伪代码

i = 0;
k = 0;

label: goto_label_i
  i = i + 1

  label: goto_label_k
    k = k + 1
    if (k < i)
      goto goto_label_k

  if (i < 100)
    goto goto_label_i

如下:

i = 0;
k = 0;
<<goto_label_i>>
LOOP
  i = i + 1;

  <<goto_label_k>>
  LOOP
    k = k + 1;
    IF k < i THEN
      CONTINUE goto_label_k;
    END IF;

    EXIT goto_label_k;
  END LOOP goto_label_k;

  IF i < 100 THEN
    CONTINUE goto_label_i;
  END IF;

  EXIT goto_label_i;
END LOOP goto_label_i;

更复杂逻辑请自行想象,此方法并不能实现所有 GOTO 语句适用的场景。

随着跳转次数增加,这个方法极有可能会让读代码的人骂娘,慎用。

---------------------------------------------------------- 神州飞象(北京)数据科技有限公司 我们的力量源自最先进的开源数据库Postgresql zongliang.quan@postgresdata.com

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...