如何将表中的选定值分配给Pl / pgSQL中的特定变量?

时间:2014-02-24 11:56:27

标签: postgresql variable-assignment plpgsql dynamic-sql

例如,以下是我要完成的任务:

EXECUTE 'SELECT name, address INTO variable1, variable2
         FROM employee WHERE id=1';

3 个答案:

答案 0 :(得分:1)

EXECUTE 'SELECT name,address from employee where id=1'
   INTO variable1, variable2;

手册中的更多详细信息:http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

最好还使用参数而不是连接值(以防止SQL注入):

l_emp_id := 1;
EXECUTE 'SELECT name,address from employee where id=$1'
   INTO variable1, variable2
   USING l_emp_id;

答案 1 :(得分:1)

更好的选择

实际上,没有任何迹象表明需要动态SQL。所有标识符都稳定。假设您只想参数化id值,请简化为:

SELECT name,address from employee where id = $1
INTO   variable1, variable2

或者:

SELECT INTO variable1, variable2
            e.name,    e.address
FROM   employee e
WHERE  e.id = _my_variable;

手册中的相应章节:"Executing a Query with a Single-row Result"

使用参数化表或列名称时将显示动态SQL Here is a list of related question for dynamic SQL

导致即时问题的原因

原始代码无效的原因per documentation

  SELECT INTO目前不支持

EXECUTE;代替,   执行普通SELECT命令并指定INTO作为其中的一部分   EXECUTE本身。

@a_horse demonstrates valid syntax in his answer.

任一替代方案都依赖于查询来返回单个行。如果你的id被定义为唯一的,那就不会破坏。

答案 2 :(得分:0)

分配值,一般注释

(见this other question for assign value to variable at declaration section

语言PLpgSQL语法有很多方法可以说:

 Y := f(X);

EXECUTE子句仅用于“动态执行”(性能),

 EXECUTE 'f(X)' INTO Y;     

使用Y := f(X);SELECT执行静态声明,

 SELECT f(X) INTO Y;

在放弃结果时使用PERFORM声明或使用void返回:

 PERFORM f(X);