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ステートメントを実行しようとしています。
関数呼び出しは依然として有効なSQLステートメントでなければなりません。
SELECT "saveUser"(3, 'asd','asd','asd','asd','asd');
Postgresqlでは、 [〜#〜] perform [〜#〜] を使用できます。 PERFORMは、PL/PgSQLプロシージャ言語内でのみ有効です。
DO $$ BEGIN
PERFORM "saveUser"(3, 'asd','asd','asd','asd','asd');
END $$;
Postgresチームからの提案:
ヒント:SELECTの結果を破棄する場合は、代わりにPERFORMを使用してください。
関数が何も返したくない場合は、「return void」と宣言する必要があります。次に、「perform functionName(parameter ...);」のように呼び出すことができます。
Postgre sqlデータベース用にpgadminで記述された関数を呼び出す2つの方法があります。
以下のように関数を定義したとします:
CREATE OR REPLACE FUNCTION helloWorld(name text) RETURNS void AS $helloWorld$
DECLARE
BEGIN
RAISE LOG 'Hello, %', name;
END;
$helloWorld$ LANGUAGE plpgsql;
次のいずれかの方法で関数helloworldを呼び出すことができます。
SELECT "helloworld"('myname');
SELECT public.helloworld('myname')
SELECTステートメントを使用してINSERTまたはUPDATEを実行するかどうかを決定する非常に類似した関数をテストしようとしたときに、同じ問題が発生しました。この関数は、T-SQLストアドプロシージャを書き直したものです。
クエリウィンドウから関数をテストしたときに、「クエリには結果データの宛先がありません」というエラーが表示されました。関数内でSELECTステートメントを使用したため、INTOステートメントを使用してSELECTの結果をローカル変数に割り当てるまでクエリウィンドウから関数をテストできなかったことが最終的にわかりました。これにより問題が修正されました。
このスレッドの元の関数が次のように変更された場合、クエリウィンドウから呼び出されたときに機能します。
$BODY$
DECLARE
v_temp integer;
BEGIN
SELECT 1 INTO v_temp
FROM "USERS"
WHERE "userID" = $1;