77

PostgreSQL で関数を使用してデータを保存しようとしています。作成スクリプトは次のとおりです。

-- Function: "saveUser"(integer, character varying, character varying, character varying, character varying, character varying)

-- DROP FUNCTION "saveUser"(integer, character varying, character varying, character varying, character varying, character varying);

CREATE OR REPLACE FUNCTION "saveUser"("pUserID" integer, "pName" character
varying, "pLastName" character varying, "pUserName" character varying, 
"pPassword" character varying, "peMail" character varying)
RETURNS boolean AS
$BODY$
BEGIN
SELECT 1
FROM "USERS"
WHERE "userID" = $1;

IF FOUND THEN
UPDATE "USERS" 
    SET     "name" = $2,
    "lastName" = $3,
    "userName" = $4,
    "password" = $5,
    "eMail" = $6
WHERE "userID" = $1;
ELSE
    INSERT INTO "USERS"
    ("name", "lastName", "userName", "password", "eMail")
    VALUES
        ($2, $3, $4, $5, $6);
END IF;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION "saveUser"(integer, character varying, character varying, character varying, character varying, character varying) OWNER TO postgres;

PostreSQL のドキュメントには、結果セットを返さない関数を呼び出すには、その名前とプロパティのみを記述するだけで十分であると記載されています。だから私はこのように関数を呼び出そうとします:

"saveUser"(3, 'asd','asd','asd','asd','asd');

しかし、私は以下のエラーが発生します:

ERROR:  syntax error at or near ""saveUser""
LINE 1: "saveUser"(3, 'asd','asd','asd','asd','asd')
     ^

********** Error **********

ERROR: syntax error at or near ""saveUser""
SQL state: 42601
Character: 1

結果セットを返す他の関数があります。私はSELECT * FROM "fnc"(...)それらを呼び出すために使用し、それは動作します。このエラーが発生するのはなぜですか?


編集:私は pgAdmin III クエリ ツールを使用しており、そこで SQL ステートメントを実行しようとしています。

4

6 に答える 6

104

関数呼び出しは引き続き有効な SQL ステートメントである必要があります。

SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
于 2009-12-23T15:21:35.553 に答える
33

Postgresql の場合はPERFORMを使用できます。PERFORM は PL/PgSQL 手続き言語内でのみ有効です。

DO $$ BEGIN
    PERFORM "saveUser"(3, 'asd','asd','asd','asd','asd');
END $$;

postgres チームからの提案:

ヒント: SELECT の結果を破棄したい場合は、代わりに PERFORM を使用してください。

于 2016-09-30T13:57:29.620 に答える
7

関数が何も返したくない場合は、「return void」と宣言してから、「perform functionName(parameter...);」のように呼び出すことができます。

于 2011-07-14T02:01:59.810 に答える
4

SELECTステートメントを使用してINSERTまたはUPDATEを実行する必要があるかどうかを決定する非常によく似た関数をテストしようとしているときに、同じ問題が発生しました。この関数は、T-SQL ストアド プロシージャを書き直したものです。
クエリ ウィンドウから関数をテストすると、「クエリには結果データの宛先がありません」というエラーが表示されました。関数内で SELECT ステートメントを使用したため、INTO ステートメントを使用して SELECT の結果をローカル変数に割り当てるまで、クエリ ウィンドウから関数をテストできなかったことが最終的にわかりました。これで問題は解決しました。

このスレッドの元の関数を次のように変更すると、クエリ ウィンドウから呼び出されたときに機能します。

$BODY$
DECLARE
   v_temp integer;
BEGIN
SELECT 1 INTO v_temp
FROM "USERS"
WHERE "userID" = $1;
于 2012-09-05T14:58:54.183 に答える