Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
\EDB Postgresql中的set命令_Postgresql_Stored Procedures_Plpgsql - Fatal编程技术网

\EDB Postgresql中的set命令

\EDB Postgresql中的set命令,postgresql,stored-procedures,plpgsql,Postgresql,Stored Procedures,Plpgsql,在EDB Postgres中,\set命令用于设置变量,例如\set detpno 80,在插入时,我们可以使用:deptno设置实际值,例如 insert into dept values (:deptno, 'SALES', 'HYD'); 它工作得很好,但当我在过程中使用它或匿名阻止它的抛出错误时 简单匿名块 begin insert into dept values (:deptno, 'SALES', 'LONDON'); end; 当我执行这个块时,我得到的是低于错误值的值 错误

在EDB Postgres中,
\set
命令用于设置变量,例如
\set detpno 80
,在插入时,我们可以使用
:deptno
设置实际值,例如

insert into dept values (:deptno, 'SALES', 'HYD');
它工作得很好,但当我在过程中使用它或匿名阻止它的抛出错误时

简单匿名块

begin
insert into dept values (:deptno, 'SALES', 'LONDON');
end;
当我执行这个块时,我得到的是低于错误值的值

错误:语法错误位于或接近“:”
第2行:插入dept1值(:deptno,‘SALES’、‘BAN’)


请帮助我在过程或函数中使用\set变量。

将:varname替换为以前\set的内容是特定数据库客户端的一项功能,即“psql”(尽管可能其他客户端也模拟了此行为)。它不是数据库本身的一项功能。数据库没有看到:varname,它只看到它被替换的内容

当您使用匿名代码块时,您是通过传递客户端的替换行为来实现的


也许您应该创建一个函数,该函数以适当的方式声明它需要哪些参数,而不是使用类似shell的变量插值。

psql变量不能在服务器端代码匿名块中使用。这是不允许的-替换被阻止在字符串中。您可以使用变通方法

  • 设置自定义guc变量(自定义配置值)。请求前缀“xx”

    postgres=# \set myval AHOJ
    postgres=# select set_config('xx.myval', :'myval', false);
     ┌────────────┐
     │ set_config │
     ╞════════════╡
     │ AHOJ       │
     └────────────┘
    (1 row)
    
  • 现在,您可以通过服务器端的函数
    当前\u设置
    读取值

    postgres=# do $$
    begin
      raise notice '%', current_setting('xx.myval');
    end;
    $$;
    NOTICE:  AHOJ
    DO
    

  • 目前没有任何其他方法可以做到这一点。这是Postgres-但EDB在这种情况下非常类似。

    您好,欢迎来到StackOverFlow。您能为我们\d+表名吗?所以我们可以复制你的问题,这能回答你的问题吗?谢谢@Pavel Stehule