Postgresql数据库存储过程插入查询,我需要打印加注 注意输入值
CREATE OR REPLACE FUNCTION new(pk character varying, u character varying,ps character varying)
RETURNS SETOF record AS
$BODY$
BEGIN
RAISE NOTICE 'PK is %','--'pk;
RAISE NOTICE 'Username is %','--'u;
RAISE NOTICE 'Password is %','--'ps;
EXECUTE 'INSERT INTO table_sp("pk_id","username","password")VALUES ('''||pk||''' ,'''||u||''','''||ps||''')' ;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION new(character varying, character varying,character varying)
OWNER TO postgres;
UserManualInputs:
select new('2','admin','admin');
我通过select new('2','admin','admin')
提供了手动输入,我需要使用像(RAISE NOTICE 'PK is %','--'pk)
答案 0 :(得分:2)
Craig Ringer回复了你,但我必须附上一份通知。
在您的示例中使用动态SQL(EXECUTE语句)是非常错误的想法,并且执行也很糟糕。
BEGIN RAISE NOTICE '...'; INSERT INTO table_sp(pk_id, username, password) VALUES(pk, u, ps); END;
-- very old (but secure, and more readable) EXECUTE 'INSERT INTO table_sp (pk_id, username, password) VALUES (' quote_literal(pk) || ',' quote_literal(u) || ',' || quote_literal(ps) || ')'; -- little bit modern (8.4) - secure, readable, and fast EXECUTE 'INSERT INTO table_sp (pk_id, username, password) VALUES($1,$2,$3)' USING pk, u, ps -- or modern (but USING clause is better and faster for this use case) EXECUTE format('INSERT INTO table_sp(pk_id, username, password) VALUES(%L,%L,%L)', pk, u, ps)
你新手可以编写代码:
-- very very very bad code!!!!! EXECUTE 'some statement ''' || variable || ''' some other ';
抱歉为offtopic。
答案 1 :(得分:1)
假设“PostgreSQL控制台”是指psql
,请确保SET client_min_messages = 'notice'
或更高。
但是,您的语法可能无法达到预期效果。演示使用DO
代替完整函数来保持简洁和简单:
regress=> DO
$$
DECLARE
pk integer := 4;
BEGIN
RAISE NOTICE 'PK is %','--'pk;
END;
$$;
NOTICE: PK is --
DO
也许你想要:
regress=> DO
$$
DECLARE
pk integer := 4;
BEGIN
RAISE NOTICE 'PK is --%',pk;
END;
$$;
NOTICE: PK is --4
DO
?
请注意,此类消息也会记录到PostgreSQL系统日志文件中,因此您不应在生产应用程序中显示此类消息中的密码。
BTW,new
是函数的一个非常糟糕的名称选择;我建议在大多数语言including SQL中使用的不是关键字。