Sử dụng %ROWTYPE
trong trường hợp đó.
Chỉnh sửa - trường hợp đơn giản
Các thử nghiệm của A.H. và DavidEG đã cho thấy điều này sẽ không hoạt động. Vấn đề thú vị!
Bạn có thể thử một cách giải quyết khác . Miễn là định nghĩa của bạn giống như ví dụ, bạn có thể chỉ cần sử dụng
CREATE FUNCTION test(param1 comp_type)
RETURNS integer AS
$BODY$
DECLARE
myvar comp_type;
BEGIN
return 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Nhưng vấn đề thực sự của bạn có lẽ không đơn giản như vậy?
Chỉnh sửa 2 - vấn đề thực sự
Đúng như dự đoán, vấn đề thực sự phức tạp hơn: loại đầu vào đa hình .
Giải pháp thay thế đối với kịch bản đó khó hơn, nhưng sẽ hoạt động hoàn hảo:
CREATE FUNCTION test(param1 anyelement, OUT a integer, OUT myvar anyelement)
RETURNS record AS
$BODY$
BEGIN
myvar := $1; -- myvar has now the required type.
--- do stuff with myvar.
myvar := NULL; -- reset if you don't want to output ..
a := 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Gọi:
SELECT a FROM test('("foo")'::comp_type); -- just retrieve a, ignore myvar
Xem toàn bộ đầu ra:
SELECT * FROM test('("foo")'::comp_type);
Lưu ý cho PostgreSQL 9.0+
Đã có một bản cập nhật quan trọng trong v9.0. Tôi trích dẫn ghi chú phát hành :
Ergo, ngoài cách giải quyết của tôi, bạn có thể sử dụng trực tiếp các biến đầu vào.