2012-03-13 27 views
8

Tôi điên hay chỉ đơn giản câm?"chức năng không tồn tại", nhưng tôi thực sự nghĩ rằng nó

dev=# \df abuse_resolve 
List of functions 
-[ RECORD 1 ]-------+------------------------------------------------------------------------------------------------------------------------------------ 
Schema    | public 
Name    | abuse_resolve 
Result data type | record 
Argument data types | INOUT __abuse_id bigint, OUT __msg character varying 
Type    | normal 

dev=# select abuse_resolve('30'::bigint); 
ERROR: function abuse_resolve(bigint) does not exist 
LINE 1: select abuse_resolve('30'::bigint); 
      ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

Đây là CREATE FUNCTION, tôi đã bỏ qua thịt của mã này, nhưng điều đó sẽ không thích hợp:

CREATE OR REPLACE FUNCTION abuse_resolve(INOUT __abuse_id bigint, OUT __msg character varying) RETURNS record AS $_$ 
DECLARE 
    __abuse_status VARCHAR; 
BEGIN 
...snip... 
    UPDATE abuse SET abuse_status = __abuse_status, 
         edate = now(), 
         closed_on = now() 
       WHERE abuse_id  = __abuse_id; 
    __msg = 'SUCCESS'; 
END; 
$_$ LANGUAGE plpgsql SECURITY DEFINER; 

Và chỉ dành riêng cho tiếng cười khúc khích:

GRANT ALL ON FUNCTION abuse_resolve(INOUT __abuse_id, OUT __msg character varying) TO PUBLIC; 
GRANT ALL ON FUNCTION abuse_resolve(INOUT __abuse_id, OUT __msg character varying) TO myuser; 

chức năng đó có vẻ như nó có tồn tại. Tôi có thể bỏ lỡ điều gì?

Điều này được giải quyết, câu trả lời là: Tôi câm. Tôi đã xác định không chính xác các đối số ban đầu, nhưng mã của tôi đã sử dụng đúng đối số. Có thêm bigint không có doanh nghiệp ở đó.

+1

Bạn có thể gửi 'tạo tuyên bố function'? –

+0

Bạn đã thực hiện cả hai trong cùng một phiên? Cùng một người dùng? Cùng search_path? –

+0

Có, chỉ có một người dùng. search_path được đặt thành công khai, SHOW xác nhận điều này. Tôi sẽ chỉnh sửa với CREATE FUNCTION – echtish

Trả lời

2

Vâng, một cái gì đó là số lẻ. Tôi đã làm:

[email protected]@[local] =# create function abuse_resolve(inout __abuse_id bigint, 
           out __msg text) returns record language plpgsql as 
           $$ begin __msg = 'ok'; end; $$; 
CREATE FUNCTION 
[email protected]@[local] =# \df abuse_resolve 
List of functions 
-[ RECORD 1 ]-------+---------------------------------------- 
Schema    | so9679418 
Name    | abuse_resolve 
Result data type | record 
Argument data types | INOUT __abuse_id bigint, OUT __msg text 
Type    | normal 

[email protected]@[local] =# select abuse_resolve('30'::bigint); 
-[ RECORD 1 ]-+-------- 
abuse_resolve | (30,ok) 

Bạn có gặp bất kỳ vấn đề nào khác với cơ sở dữ liệu này không? Bạn có thể sao chép nó bằng cách đổ/khôi phục và thử trên bản sao mới không? Có đủ điều kiện rõ ràng tên chức năng với trợ giúp lược đồ "công khai" không? Bạn đang sử dụng phiên bản PostgreSQL nào?

update: chức năng sql Nó cũng làm việc tốt cho tôi sử dụng:

create function abuse_resolve(inout __abuse_id bigint, out __msg text) 
    language sql as $$ select $1, 'ok'::text $$; 
+0

Tôi đã có thể tái tạo @echtish tạo hàm như sql mà không có 'trả về record'. Sau đó, tôi thấy mẫu của bạn như là plpgsql và thả của riêng tôi và tạo ra của bạn và nó đã làm việc. Sau đó, thả của bạn và tôi bây giờ không thể tái tạo vấn đề nữa với chức năng tương tự mà tôi đã tái tạo vấn đề lúc đầu. Tôi đang sử dụng 9.1 trên Fedora 16 –

+0

Giải thích hợp lý duy nhất là 'search_path' không bao gồm lược đồ' public'. Tôi đặt cược rằng 'chọn public.abuse_resolve ('30 ':: bigint);' works. –

+0

@Clodoaldo: Tôi không thể tái tạo nó bằng cách sử dụng hàm SQL (9.1, Debian) – araqnid

1

Hãy thử cú pháp sau:

SELECT * FROM abuse_resolve('30'::bigint); 
+0

Cảm ơn, nhưng không có niềm vui. Tuy nhiên, 'ERROR: function abuse_resolve (bigint) không tồn tại' – echtish

+0

-1' select from' không cần thiết trong trường hợp này –

2

Nếu bạn có thể và nếu là vấn đề đó. Tôi khuyên bạn nên sử dụng

"set search_path = mainSchemaName, secondOnes" 

để thiết lập đúng schema nơi hàm được tạo hoặc ở một nơi mà bạn gọi nó là trực tiếp ghi rõ tên schema

select schemaName.abuse_resolve('30'::bigint); 
+0

Đây là nó. ngay chỗ này.Tôi quên để xác định tên lược đồ của tôi trước khi chức năng của tôi và điều đó đã khiến nó không hoạt động. Cảm ơn! –

Các vấn đề liên quan