1

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;

ユーザーマニュアル入力:

select new('2','admin','admin');

手動で入力しましたが、次のselect new('2','admin','admin')ようなレイズ通知を使用してPostgreSQLコンソールの入力値を出力する必要があります(RAISE NOTICE 'PK is %','--'pk)

4

2 に答える 2

2

Craig Ringer から返信がありましたが、通知を添付する必要があります。

あなたの例で動的SQL(EXECUTEステートメント)を使用することは非常に間違った考えであり、実装も悪いです。

  • 単に SQL ステートメントのみを使用します。動的 SQL は必要な場合にのみ使用してください。
始める
  RAISE NOTICE '...';
  INSERT INTO table_sp(pk_id、ユーザー名、パスワード)
    値(pk、u、ps);
終わり;
  • アンチパターンを使用しました - あなたのコードは SQL インジェクションの脆弱性があります。使用する PostgreSQL のバージョンに応じて、より多くのパターンを使用して安全なコードを作成できます。
  -- 非常に古い (しかし安全で読みやすい)
  EXECUTE 'INSERT INTO table_sp (pk_id、ユーザー名、パスワード) VALUES ('
             quote_literal(pk) || ',' quote_literal(u) || ',' || quote_literal(ps) || ')';

  -- 少しモダン (8.4) - 安全で、読みやすく、高速
  EXECUTE 'INSERT INTO table_sp (pk_id、ユーザー名、パスワード) VALUES($1,$2,$3)'
    pk、u、ps の使用

  -- または最新 (ただし、このユースケースでは USING 句の方が優れていて高速です)
  EXECUTE format('INSERT INTO table_sp(pk_id, username, password) VALUES(%L,%L,%L)',
             pk、u、ps)

あなたは新しいコードを書くことができます:

-- 非常に非常に悪いコード!!!!!
EXECUTE '何らかのステートメント''' || 変数 || ''' 他の ';

オフトピックでごめんなさい。

于 2013-07-17T07:41:01.133 に答える
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関数の名前の選択は本当に悪いです。SQL を含むほとんどの言語でキーワードではないものを提案します。

于 2013-07-17T07:25:43.650 に答える