2013-07-17 26 views
1

PostgreSQL数据库存储过程插入查询,我需要打印加薪 通知输入值需要打印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')了人工输入和我需要打印在PostgreSQL控制台输入值使用通知像(RAISE NOTICE 'PK is %','--'pk)

+3

请务必在提问中提及您的PostgreSQL版本。 –

回答

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系统日志文件中,因此您不应该在生产应用程序中的这些消息中显示密码。

顺便说一句,new是一个非常糟糕的功能名称选择;我建议在大多数语言中不是关键字的东西including SQL

+0

确定这是手动打印4.但我需要打印(前端值或用户输入)传递参数在RAISE NOTICE'PK是 - %',pk; – Kannan

+0

@康南当然。我只是展示了“RAISE NOTICE”的语法;同样的事情将在你的功能。 'DO'是PL/PgSQL,就像'CREATE OR REPLACE FUNCTION'一样。 –

+0

好吧,我知道了,但它没有打印通过RAISE NOTICE中的前端值获取参数。 – Kannan

2

Craig Ringer回复您,但我必须附上通知。

在你的例子中使用动态SQL(EXECUTE语句)是一个非常错误的想法,也是很糟糕的实现。

  • 只使用简单的SQL语句。只有在需要时才使用动态SQL!
 
BEGIN 
    RAISE NOTICE '...'; 
    INSERT INTO table_sp(pk_id, username, password) 
    VALUES(pk, u, ps); 
END; 
  • 您使用的反模式 - 你的代码是SQL注入漏洞。取决于你使用,你可以使用更多的模式如何编写安全代码的PostgreSQL版本:
 
    -- 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。

+0

感谢您提及它。 SQL注入永远不会脱离主题。为了这个问题的目的,我把“RAISE”之后的所有内容都视为无关的噪音,并没有注意到后面的恐怖。顺便说一句,我通常使用'EXECUTE格式('插入%I(%I)值($ 1)',表名,colname)USING value';这样你就可以使用'format'的智能标识符格式,并且仍然可以通过'EXECUTE ... USING'提供参数化。 –

+0

@康南和这里的*为什么*帕维尔提出这样一个好点:http://bobby-tables.com –

+0

@CraigRinger是的,我的答案格式的一个例子是不自然的 - 扭曲提到的用例。功能“格式”的设计完全符合您所描述的用途。 –