如何在plpgsql中使用脚本变量来阻止或在“正确的范围”中运行

时间:2017-06-21 14:39:43

标签: postgresql plpgsql

如何使用plpgsql语言方言在postgresql(版本9.4)脚本中使用本地脚本变量?我尝试从脚本中获取状态消息的结果,但是会遇到变量范围的问题。

这里有一些示例代码:

-- ------------------------------------------------------
-- Local variables conming  in 3 incarnations
-- ident, variable (single quotes, prefix VAR), 
-- quoted variable (quoted quotes, prefix QTL)
-- ------------------------------------------------------
-- Work schema 
-- ------------------------------------------------------
\set DB_SCHEMA           GT1
\set DB_VAR_SCHEMA       'GT1'
\set DB_QTL_SCHEMA       '\'':DB_VAR_SCHEMA'\''

-- ------------------------------------------------------
-- Selector for the choosen raster 
-- ------------------------------------------------------
\set RS_VAR_PROJECT      'GT1'
\set RS_QTL_PROJECT       '\'':RS_VAR_PROJECT'\''
\set RS_VAR_VERSION      '2016-2.0KM-V1.0'
\set RS_QTL_VERSION      '\'':RS_VAR_VERSION'\''
...    

-- =================================================================
-- Information about Settings
-- =================================================================
DO LANGUAGE plpgsql $INFO$
BEGIN
  RAISE NOTICE 'STATISTICS IMPORT SCHEMA:   %', :DB_QTL_SCHEMA;
  RAISE NOTICE 'STATISTICS RASTER PROJECT:  %', :RST_QTL_PROJECT;
  RAISE NOTICE 'STATISTICS RASTER VERSION:  %', :RST_QTL_VERSION;
END $INFO$;

-- =================================================================
-- Clean up the temporary database schema
-- =================================================================
DROP SCHEMA IF EXISTS :DB_SCHEMA CASCADE;
CREATE SCHEMA :DB_SCHEMA;
....

似乎变量在psql语言范围DO $$... END $$中不可见。所以我收到一个错误:

$ psql daisi_2017_06_06 < create-stats-schema.sql 
ERROR:  Syntax error at »:«
LINE 3: RAISE NOTICE 'DAISI STATISTIC IMPORT SCHEMA: %', :DB_QTL_SCH...
                                                         ^

操作系统:Linux DEBIAN 8; Postgresql 9.4

@Anuraag Veerapaneni:提供没有冒号的代码块和错误

DO LANGUAGE plpgsql $INFO$
BEGIN
  RAISE NOTICE 'STATISTICS IMPORT SCHEMA:   %', DB_QTL_SCHEMA;
  RAISE NOTICE 'STATISTICS RASTER PROJECT:  %', RST_QTL_PROJECT;
  RAISE NOTICE 'STATISTICS RASTER VERSION:  %', RST_QTL_VERSION;
END $INFO$;

德语原文错误:

$psql daisi_2017_06_06 < create-stats-schema.sql 
FEHLER:  Spalte »db_qtl_schema« existiert nicht
ZEILE 1: SELECT DB_QTL_SCHEMA

此致

2 个答案:

答案 0 :(得分:2)

直接的方法不起作用。有一种基于GUC的解决方法 - 全局用户配置。

ides_jmmaj=# \set xxx 'Hello'
ides_jmmaj=# set custom.xxx to :'xxx';
SET

ides_jmmaj=# do $$
ides_jmmaj$# begin
ides_jmmaj$#   raise notice '%', current_setting('custom.xxx');
ides_jmmaj$# end;
ides_jmmaj$# $$;
NOTICE:  Hello
DO

变量前缀如“custom”。是强制性的 - 但可以有任何文字。

答案 1 :(得分:0)

使用%引用变量,如下所示。你能否删除&#34;:&#34;并检查

RAISE NOTICE '%', variable_name;