PostgreSQL функция - връщане на параметър

2 отговора 340 прегледа
#1

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 = // тук трябва да взема резултата от функцията



Благидаря

Отговор
в отговор на Maнoл4o #2

Re: PostgreSQL функция - връщане на параметър

PostgreSQL няма аутпут параметри

2 варианта има

1. единият да ползваш стандартните функции за прихващане на грешките (за съжаление на клиентската платформа, която ползваш не знам конкретните функции ) pg_last_error или нещо такова
тогава функцията ще връща последното ID, вместо код за грешката
SELECT currval('company_id_sequence');

2. вариант ако ползваш 8-ма версия на PostgreSQL, може да ползваш exception-ите и savepoints и да прихващаш грешката и тогава да връща функцията не int, а record например (или да си дефинираш свой по-конкретен тип) и едното поле в този запис да бъде ID-то, а другото кода на грешката

аз лично бих ползвал първият вариант

Отговор
в отговор на phpGuru #3

Re: PostgreSQL функция - връщане на параметър

Благодаря за съвета, ще го пробвам.

Отговор