2013-07-17 79 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是的,我的答案格式的一個例子是不自然的 - 扭曲提到的用例。功能「格式」的設計完全符合您所描述的用途。 –