我刚接触PostgreSQL(目前在PostgreSQL13上),可能与我遇到的其他SQL(Microsoft SQL)有些混淆.
其目标是断言表列中没有会被截断的值,然后减小列长度并对相关函数的返回类型执行相同的操作
代码提供错误的示例,以便可以重现:
/*
CREATE TABLE test_table (id uuid, col_a varchar(100), col_b int);
INSERT INTO test_table VALUES (gen_random_uuid(), 'asdf', 1);
**/
DO $$
BEGIN
IF NOT EXISTS (SELECT * FROM test_table WHERE character_length(col_a) > 100) THEN
ALTER TABLE test_table ALTER COLUMN col_a TYPE varchar(100);
DROP FUNCTION IF EXISTS test_function(varchar(100));
CREATE OR REPLACE FUNCTION test_function(test_param varchar(100))
RETURNS TABLE (
id uuid,
col_a varchar(100),
col_b int
)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT test_table.id AS id, test_table.col_a AS col_a, test_table.col_b AS col_b
FROM test_table
WHERE test_table.col_a = test_param;
END;
$$;
ELSE
RAISE NOTICE 'Cannot Revert. Rows exist that would be truncated!';
END IF;
END $$
SELECT id, col_a, col_b FROM test_function ('asdf');
/* DROP TABLE test_table */
我得到的错误是:
Sql错误[42601]:错误:在"Begin"位置或其附近出现语法错误:400
我已经try 了动态代码,我已经自己运行了Function语句--正常运行的健全性判断;事实上,在没有IF
块的情况下,同时运行或单独运行每条语句也很好.
我的方法有什么问题,如何修复?