如果我将这两个Postgres函数定义保存在两个单独的.sql文件中:
CREATE OR REPLACE FUNCTION column_exists(tablename text, colname text) RETURNS boolean AS
$BODY$
DECLARE
q text;
field_name text;
onerow record;
BEGIN
q = 'SELECT column_name FROM information_schema.columns WHERE table_name='''||tablename||''' AND table_schema =''public''';
FOR onerow IN EXECUTE q
LOOP
field_name := onerow.column_name;
IF ((field_name = colname)) then
RETURN true;
END IF;
END LOOP;
RETURN false;
END;
$BODY$
LANGUAGE plpgsql
CREATE OR REPLACE FUNCTION correct_col_names() RETURNS VOID AS
$BODY$
DECLARE
q boolean;
BEGIN
-- rename name column to Name
select column_exists('National_Parks', 'name') as q;
IF q = TRUE THEN
alter table "National_Parks"
rename column name to "Name";
END IF;
-- remance descriptio column to description
select column_exists('National_Parks', 'descriptio') as q;
IF q = TRUE THEN
alter table "Natioanl_Parks"
rename column descriptio to "Description";
END IF;
END
$BODY$
LANGUAGE plpgsql
我需要使用什么语法来调用顺序,比如在另一个脚本中?我试过了
select correct_col_names()
并返回以下错误:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function "correct_col_names" line 7 at SQL statement
********** Error **********
ERROR: query has no destination for result data
SQL state: 42601
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Context: PL/pgSQL function "correct_col_names" line 7 at SQL statement
TIA。
答案 0 :(得分:3)
问题是你有SELECT语句没有对数据做任何事情。你的
select column_exists('National_Parks', 'name') as q;
应该是
select column_exists('National_Parks', 'name') INTO q;
as
只是将结果别名为该查询的“q”,它实际上并没有将它放入q变量。
调用函数(select correct_col_names()
)的语法对于SQL是正确的。一旦你修复了该函数中的两个错误,它应该可以工作。
但是,如果您在另一个PL / PGSQL函数中尝试select correct_col_names()
,则会得到相同的错误,因为select语句实际上正在执行任何结果。 perform correct_col_names()
可以正常运行,因为PERFORM是PL / PGSQL语法,用于在您不想保存结果时调用某些内容。