Tôi có một chức năng trong PostgreSQL 9.1 được gọi fun_test
. Nó có một kiểu tổng hợp làm tham số đầu vào và tôi liên tục gặp lỗi khi tôi gọi nó.
CREATE OR REPLACE FUNCTION netcen.fun_test(myobj netcen.testobj)
RETURNS boolean AS
$BODY$
DECLARE
tmp_code smallint;
cur_member refcursor;
BEGIN
-- Check if the member exists first
OPEN cur_member FOR
EXECUTE 'SELECT testkey FROM netcen.test WHERE testkey=' || myobj.testkey ;
FETCH cur_member INTO tmp_code;
CLOSE cur_member;
CASE tmp_code
WHEN COALESCE(tmp_code,0)=0 THEN
-- Record not found INSERT a new record
-- will skip user defined validation for now
insert into netcen.test values(myobj.testkey,
myobj.tes,
myobj.testname);
ELSE
-- Record found UPDATE the record
update netcen.test set
test=myobj.test,
testname=myobj.testname WHERE testkey=myobj.testkey;
END CASE;
END;$BODY$
LANGUAGE plpgsql;
Dưới đây là loại testobj
CREATE TYPE netcen.testobj AS
(testkey smallint,
tes text,
testname text);
Khi tôi gọi hàm:
SELECT netcen.fun_test('(3,khaendra@me.com,khaendra)':: netcen.testobj);
.. Tôi nhận được thông báo lỗi sau:
ERROR: operator does not exist: smallint = boolean
LINE 1: SELECT "__Case__Variable_8__" IN (COALESCE(tmp_code,0)=0)
^
HINT: No operator matches the given name and argument type(s).
You might need to add explicit type casts.
QUERY: SELECT "__Case__Variable_8__" IN (COALESCE(tmp_code,0)=0)
CONTEXT: PL/pgSQL function "fun_test" line 11 at CASE
Tôi nên đúc ở đâu?
Định nghĩa của bảng netcen.test
:
CREATE TABLE netcen.test (
testkey smallint NOT NULL DEFAULT 0,
tes netcen.dom_email_validation,
testname text,
CONSTRAINT key PRIMARY KEY (testkey)
)
@ Erwin, cảm ơn vì các liên kết. Tôi đã đọc và đã sửa đổi chức năng của mình thành điều này, xin vui lòng xem qua nó và cho tôi biết nếu nó có thể hoạt động tốt với một số khách hàng gọi cùng một chức năng không?
CREATE OR REPLACE FUNCTION netcen.fun_test_modified(myobj netcen.test)
RETURNS boolean AS
$BODY$
DECLARE
myoutput boolean :=false;
BEGIN
update netcen.test set
tes=myobj.tes,
testname=myobj.testname WHERE testkey=myobj.testkey;
IF FOUND THEN
myoutput:= TRUE;
RETURN myoutput;
END IF;
BEGIN
INSERT INTO netcen.test values(myobj.testkey,
myobj.tes,
myobj.testname);
myoutput:= TRUE;
EXCEPTION WHEN OTHERS THEN
update netcen.test set
tes=myobj.tes,
testname=myobj.testname WHERE testkey=myobj.testkey;
myoutput:= TRUE;
END;
RETURN myoutput;
END;
$BODY$ LANGUAGE plpgsql;
Tôi đã thực hiện bài kiểm tra loại và chỉ sử dụng bảng test
! Tôi không biết rằng có thể làm việc!