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

在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

推荐阅读