Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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
PL/PgSQL在创建视图中将变量名视为列名_Sql_Postgresql - Fatal编程技术网

PL/PgSQL在创建视图中将变量名视为列名

PL/PgSQL在创建视图中将变量名视为列名,sql,postgresql,Sql,Postgresql,我有一个类似的功能: CREATE FUNCTION func(TEXT) RETURNS TEXT AS $$ DECLARE v_name1 ALIAS FOR $1; BEGIN SELECT * from table1 WHERE names_column = v_name1; RETURN v_name1; END; $$ LANGUAGE plpgsql; 如果我这样做 SELECT func('Alex'); 它应该运行: SELECT * from table1 WHE

我有一个类似的功能:

CREATE FUNCTION func(TEXT) RETURNS TEXT AS $$
DECLARE
v_name1 ALIAS FOR $1;

BEGIN

SELECT * from table1 WHERE names_column = v_name1;
RETURN v_name1;

END;
$$ LANGUAGE plpgsql;
如果我这样做

SELECT func('Alex');
它应该运行:

SELECT * from table1 WHERE names_column = 'Alex';
但是我得到了这个错误:

ERROR:  column "v_name1" does not exist
LINE 2: SELECT * FROM table1 WHERE names_column = v_name1;
我如何告诉Postgres获取要比较的变量中的文本

[EDIT]这是我目前为止使用的产生错误的函数:

CREATE OR REPLACE FUNCTION get_champ(end_date DATE, champ_name TEXT) RETURNS TEXT AS $$
DECLARE
new_champ_name TEXT;
id_of_new_champ INTEGER;
date_of_new_champ DATE;
BEGIN

CREATE OR REPLACE VIEW champ AS
SELECT * FROM basketball2 WHERE visitor = champ_name OR home = champ_name;

SELECT MIN(id) INTO id_of_new_champ FROM champ WHERE winner <> champ_name;
SELECT date INTO date_of_new_champ FROM basketball2 WHERE id = id_of_new_champ;
SELECT winner INTO new_champ_name FROM basketball2 WHERE id = id_of_new_champ;
RETURN new_champ_name;

END;
$$ LANGUAGE plpgsql;
CREATE或REPLACE函数get\u champ(end\u date,champ\u name TEXT)将文本返回为$$
声明
新的冠军名称文本;
新champ整数的id;
新冠军的日期;
开始
创建或替换视图champ作为
从basketball2中选择*,其中visitor=champ_name或home=champ_name;
从champ中选择MIN(id)进入新champ的id,其中冠军champ的名字;
从basketball2中选择date INTO date of_of_new_champ,其中id=id_of_new_champ;
从basketball2中选择胜利者成为新冠军,其中id=新冠军的id;
返回新的_champ_名称;
终止
$$语言plpgsql;

创建或替换视图
在PostgreSQL中不是可规划的语句,而是DDL

这意味着它不能接受查询参数。因此,PL/PgSQL无法将PL/PgSQL变量正常转换为查询参数。它按字面上写的方式接受查询

要获得所需的结果,必须将动态SQL与执行一起使用,例如

 EXECUTE format('CREATE OR REPLACE VIEW champ AS
 SELECT * FROM basketball2 WHERE visitor = %L OR home = %L', champ_name, champ_name);
。。。但在这种情况下,首先创建视图似乎是荒谬的。你为什么要那样做,这对你毫无益处。只要写下:

SELECT MIN(id) 
INTO id_of_new_champ 
FROM basketball2 
WHERE (visitor = champ_name OR home = champ_name)
  AND winner <> champ_name;
选择最小值(id)
进入新冠军的身份
来自篮球2
其中(访客=冠军姓名或家庭=冠军姓名)
冠军的名字;

另外,在没有明确说明您在问题中已经这样做的情况下,永远不要“简化”或“匿名化”您的代码,*测试简化后的代码是否仍然存在问题。否则,您就是在浪费您和其他人的时间。

创建或替换视图在PostgreSQL中不是可规划的语句,而是DDL

这意味着它不能接受查询参数。因此,PL/PgSQL无法将PL/PgSQL变量正常转换为查询参数。它按字面上写的方式接受查询

要获得所需的结果,必须将动态SQL与执行一起使用,例如

 EXECUTE format('CREATE OR REPLACE VIEW champ AS
 SELECT * FROM basketball2 WHERE visitor = %L OR home = %L', champ_name, champ_name);
。。。但在这种情况下,首先创建视图似乎是荒谬的。你为什么要那样做,这对你毫无益处。只要写下:

SELECT MIN(id) 
INTO id_of_new_champ 
FROM basketball2 
WHERE (visitor = champ_name OR home = champ_name)
  AND winner <> champ_name;
选择最小值(id)
进入新冠军的身份
来自篮球2
其中(访客=冠军姓名或家庭=冠军姓名)
冠军的名字;

另外,在没有明确说明您在问题中已经这样做的情况下,永远不要“简化”或“匿名化”您的代码,*测试简化后的代码是否仍然存在问题。否则你就是在浪费你和其他人的时间。

快速检查-如果你传递了一个命名参数,你会得到同样的问题吗?如果我显式地将“Alex”写入函数而不是变量,我不会得到错误。但是,这不是一个非常有用的函数,不是“Alex”。我的意思是,如果您将声明更改为
CREATE FUNCTION func(vname TEXT)
,而不只是传递数据类型。@shree.pat18哦,是的,同样的事情。同样的错误。@CraigRinger psql 9.1.12版,服务器9.2.4版快速检查-如果你传递了一个命名参数,你会遇到同样的问题吗?如果我显式地将“Alex”写入函数而不是变量,我不会得到错误。但是,这不是一个非常有用的函数,不是“Alex”。我的意思是,如果您将声明更改为
CREATE FUNCTION func(vname TEXT)
,而不只是传递数据类型。@shree.pat18哦,是的,同样的事情。同样的错误。@CraigRinger psql版本9.1.12,服务器版本9.2.4好的,将来我简化代码时一定记得告诉大家。还有,谢谢!你的解决方案有效!好的,当我将来简化代码时,我一定会记得告诉人们。还有,谢谢!你的解决方案有效!