PostgreSQL функция - връщане на параметър
2 отговора
340 прегледа
PostgreSQL функция - връщане на параметър
Здравейте,
Много ще съм благодарен ако някой може да ми помогне в моя проблем с PostgreSQL функция.
Искам функцията да ми връща последното ID като параметър и кода на поледната възникнала грешка на сервера като резултата от функцията. Тук търся еквивалентност с MSSQL-a понеже там съм го правил по този начин, но при Postgres-a не знам как става, а и не съм сигурен дали се прави по този начин.
Ето и малко код за онагледяване:
CREATE OR REPLACE FUNCTION sp_company_insert(
"varchar", -- името на компанията
int4, -- брои работници
int4) -- ID на новия запис Output параметър
RETURNS int4 -- кода на последната грешка на сервера
AS
$BODY$
INSERT INTO companies
(
name, employees
)
VALUES
(
$1, $2
);
select ... --"тук някъде може би трябва да се вземе кода на грешката"
... = curval(company_id_sequence) --"тук по някакъв начин да се установи третия параметър "
$BODY$
LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION sp_company_insert("varchar", int4, int4) OWNER TO postgres;
***************************************************
***************************************************
PgCommand cmdToExecute = new PgCommand();
cmdToExecute.CommandText = "sp_company_insert";
cmdToExecute.CommandType = CommandType.StoredProcedure;
cmdToExecute.Connection = _mainConnection;
PgParameter p = new PgParameter("@name", PgDbType.VarChar);
p.Value = "CompanyName";
p.Direction = ParameterDirection.Input;
cmdToExecute.Parameters.Add(p);
PgParameter p = new PgParameter("@employees", PgDbType.Int4);
p.Value = 50;
p.Direction = ParameterDirection.Input;
cmdToExecute.Parameters.Add(p);
PgParameter p = new PgParameter("@id", PgDbType.Int4);
p.Direction = ParameterDirection.Output;
cmdToExecute.Parameters.Add(p);
_mainConnection.Open();
_rowsAffected = cmdToExecute.ExecuteNonQuery();
_iD = cmdToExecute.Parameters["@id"].Value;
_errorCode = // тук трябва да взема резултата от функцията
Благидаря
Много ще съм благодарен ако някой може да ми помогне в моя проблем с PostgreSQL функция.
Искам функцията да ми връща последното ID като параметър и кода на поледната възникнала грешка на сервера като резултата от функцията. Тук търся еквивалентност с MSSQL-a понеже там съм го правил по този начин, но при Postgres-a не знам как става, а и не съм сигурен дали се прави по този начин.
Ето и малко код за онагледяване:
CREATE OR REPLACE FUNCTION sp_company_insert(
"varchar", -- името на компанията
int4, -- брои работници
int4) -- ID на новия запис Output параметър
RETURNS int4 -- кода на последната грешка на сервера
AS
$BODY$
INSERT INTO companies
(
name, employees
)
VALUES
(
$1, $2
);
select ... --"тук някъде може би трябва да се вземе кода на грешката"
... = curval(company_id_sequence) --"тук по някакъв начин да се установи третия параметър "
$BODY$
LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION sp_company_insert("varchar", int4, int4) OWNER TO postgres;
***************************************************
***************************************************
PgCommand cmdToExecute = new PgCommand();
cmdToExecute.CommandText = "sp_company_insert";
cmdToExecute.CommandType = CommandType.StoredProcedure;
cmdToExecute.Connection = _mainConnection;
PgParameter p = new PgParameter("@name", PgDbType.VarChar);
p.Value = "CompanyName";
p.Direction = ParameterDirection.Input;
cmdToExecute.Parameters.Add(p);
PgParameter p = new PgParameter("@employees", PgDbType.Int4);
p.Value = 50;
p.Direction = ParameterDirection.Input;
cmdToExecute.Parameters.Add(p);
PgParameter p = new PgParameter("@id", PgDbType.Int4);
p.Direction = ParameterDirection.Output;
cmdToExecute.Parameters.Add(p);
_mainConnection.Open();
_rowsAffected = cmdToExecute.ExecuteNonQuery();
_iD = cmdToExecute.Parameters["@id"].Value;
_errorCode = // тук трябва да взема резултата от функцията
Благидаря
Re: PostgreSQL функция - връщане на параметър
PostgreSQL няма аутпут параметри
2 варианта има
1. единият да ползваш стандартните функции за прихващане на грешките (за съжаление на клиентската платформа, която ползваш не знам конкретните функции
) pg_last_error или нещо такова
тогава функцията ще връща последното ID, вместо код за грешката
SELECT currval('company_id_sequence');
2. вариант ако ползваш 8-ма версия на PostgreSQL, може да ползваш exception-ите и savepoints и да прихващаш грешката и тогава да връща функцията не int, а record например (или да си дефинираш свой по-конкретен тип) и едното поле в този запис да бъде ID-то, а другото кода на грешката
аз лично бих ползвал първият вариант
2 варианта има
1. единият да ползваш стандартните функции за прихващане на грешките (за съжаление на клиентската платформа, която ползваш не знам конкретните функции
тогава функцията ще връща последното ID, вместо код за грешката
SELECT currval('company_id_sequence');
2. вариант ако ползваш 8-ма версия на PostgreSQL, може да ползваш exception-ите и savepoints и да прихващаш грешката и тогава да връща функцията не int, а record например (или да си дефинираш свой по-конкретен тип) и едното поле в този запис да бъде ID-то, а другото кода на грешката
аз лично бих ползвал първият вариант