PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Npgsql / Postgresql:hàm không tồn tại thông báo lỗi khi có

Lưu ý rằng postgres cho phép quá tải hàm , do đó, không chỉ hàm NAME cần tồn tại mà các loại tham số hàm cũng sẽ được sử dụng để xác định quá tải nào sẽ sử dụng, ví dụ:

CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, varchar, boolean)   

Không cùng chức năng với

CREATE OR REPLACE FUNCTION public.get_user_by_username(varchar, boolean, varchar)

vv

Khi gọi các hàm này, tên tham số, loại và có thể cả thứ tự phải khớp, nếu không bạn sẽ nhận được

Một vấn đề khác khiến tôi đau đầu là các quy tắc phân biệt chữ hoa chữ thường của Postgressql khi xác định các hàm. Ví dụ:không có bất kỳ "" nào xung quanh dấu ngoặc kép, định nghĩa hàm sau (sử dụng cài đặt mặc định trong pgAdmin 3):

CREATE FUNCTION MySchema.MyFunction(Parameter1 VARCHAR(40), parameTer2 VARCHAR(20))

đăng ký chức năng bằng chữ ký:(sử dụng công cụ IDE để xác minh điều này)

myschema.myfunction(parameter1 VARCHAR(40), parameter2 VARCHAR(20))

Do đó, bất kỳ nỗ lực nào trong C # để liên kết với

command.Parameters.Add("Parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameTer2", NpgsqlDbType.Varchar, 20);

sẽ thất bại với lỗi. Thay vào đó, bạn sẽ cần phải liên kết với các tham số toàn chữ thường, tức là

command.Parameters.Add("parameter1", NpgsqlDbType.Varchar, 40);
command.Parameters.Add("parameter2", NpgsqlDbType.Varchar, 20);

Trừ khi bạn xác định Hàm bằng Dấu ngoặc kép:

CREATE FUNCTION "MySchema"."MyFunction"("Parameter1" VARCHAR(40), "parameTer2" VARCHAR(20))

Đó là lý do tại sao điều quan trọng là bạn phải đồng ý về quy ước cách viết hoa trong cơ sở dữ liệu / tổ chức của mình và sau đó tuân thủ nó ( tất cả chữ thường khá phổ biến)

Một giải pháp thay thế, mặc dù cũng dễ bị hỏng, là hoàn toàn không liên kết với các tham số được đặt tên, và thay vào đó, sử dụng vị trí thứ tự của tham số, để liên kết nó, ví dụ:

var myParameter = new NpgsqlParameter
{
    // Leave `ParameterName` out entirely,
    Direction = ParameterDirection.Input,
    IsNullable = false,
    NpgsqlDbType = NpgsqlDbType.Varchar,
    Size = 20,
    Value = "SomeValue"
};
command.Parameters.Add(myParameter);
// Same for other parameter(s)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. XÓA TỪ ... báo cáo lỗi cú pháp tại hoặc gần.

  2. Thực thi nhiều câu lệnh với Postgresql thông qua SQLAlchemy không tiếp tục thay đổi

  3. pg_upgrade trên Windows không thể ghi vào tệp nhật ký pg_upgrade_internal.log

  4. Cách trả lại danh sách các cụm từ có sẵn trong PostgreSQL

  5. Làm cách nào để đặt lại mật khẩu người dùng mặc định postgresql 9.2 (thường là 'postgres') trên mac os x 10.8.2?