ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于文本引用的问题

关于文本引用的问题

原创 Linux操作系统 作者:LEE_CHAO 时间:2011-05-31 10:15:36 0 删除 编辑
客户在PSQL中使用绑定变量传递实参遇到如下问题
template1=# CREATE FUNCTION test(name varchar(100) )returns int AS $$
template1$# DECLARE
template1$#
template1$# BEGIN
template1$#   return 0;
template1$# END;
template1$# $$ LANGUAGE plpgsql;
CREATE FUNCTION
template1=#
template1=#
template1=# \set bookname program
template1=# \echo :bookname
program
template1=# select test(:bookname);
ERROR:  column "program" does not exist
LINE 1: select test(program);
                    ^
psql没有把绑定变量当做一个文本处理,而是认为他是一个列所以出现这样的错误,然后以为加上单引号可以解决问题。但是实际上问题依然存在,看下面的例子
template1=# \echo :name
happy
template1=#
template1=#
template1=#
template1=#
template1=# CREATE or replace FUNCTION test(name varchar) RETURNS integer AS $$
template1$# DECLARE
template1$#
template1$# BEGIN
template1$#   execute 'create table '||quote_ident(name)||' (id int) distributed by (id)';
template1$#   return 0;
template1$# END;
template1$# $$ LANGUAGE plpgsql;
CREATE FUNCTION
template1=#
template1=#
template1=#
template1=# select test('''||:name||''');
 test
------
    0
(1 row)
template1=# \d
                         List of relations
 Schema |      Name       | Type  |  Owner  |       Storage
--------+-----------------+-------+---------+----------------------
 public | '||:name||'     | table | gpadmin | heap
(1 rows)

在传递实参时,依然不可以正确处理引号。在设置绑定变量时,使用$$定义参数值,问题解决,如下

CREATE or replace FUNCTION test(v_name varchar) RETURNS integer AS $$
DECLARE
BEGIN
  execute 'create table '||v_name||' (id int) distributed by (id)';
  return 0;
END;
$$ LANGUAGE plpgsql;

sales_history=# \set name $$happy$$
sales_history=#  select test(:name);
 test
------
    0
(1 row)
sales_history=# \d
                           List of relations
    Schema     |     Name      | Type  |  Owner  |       Storage
---------------+---------------+-------+---------+----------------------
 sales_history | happy         | table | gpadmin | heap
(1 rows)


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25548387/viewspace-696740/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-03-18

  • 博文量
    70
  • 访问量
    384146