Задать вопрос
@romazver94

Как переписать функцию на SQL?

Добрый день, итак, сразу к делу.
Нужно переписать SQL функцию.

Что от неё требуется: она принимает параметр @in_CustomerID (CustomerID в таблице LoginID), он несёт в себе идентификатор пользователя до 32х цифр, в той же таблице LoginID есть поле GamePoints, по указателю CustomerID нужно найти баланс пользователя и вывести цифру в конечном итоге как GNABalance.

Ниже сбросил исходный вариант.

ALTER PROCEDURE [dbo].[WO_GNAGetBalance]
@in_CustomerID int
AS
BEGIN
SET NOCOUNT ON;

-- gna service id for warinc
declare @ServiceId bigint = 300005010000000000

get points for that customer
declare @CustomerID bigint
select @CustomerID=CustomerID from LoginID where CustomerID=@in_CustomerID
if (@@RowCount = 0) begin
select 6 as ResultCode, 'no CustomerID' as ResultMsg
return
end
declare @AuthId varchar(40)
set @AuthId = convert(varchar(32), @CustomerID)

-- get balance from gamenet
DECLARE @o_Balance money;
DECLARE @o_Error int;

SET @o_Balance = NULL;
SET @o_Error = NULL;
EXEC dblink_api.billing.dbo.usp_GetBalance
@i_ServiceId = @ServiceId,
@i_AuthType = 'user_id',
@i_AuthId = @AuthId,
@o_Balance = @o_Balance out,
@o_Error = @o_Error out;
if(@o_Error > 0) begin
select 6 as ResultCode, 'can not get balance' as ResultMsg
return
end


--convert NULL to 0
if(@o_Balance is NULL) set @o_Balance = 0

declare @Balance int = convert(int, @o_Balance)
select 0 as ResultCode
select @Balance as 'GNABalance'

END
  • Вопрос задан
  • 2519 просмотров
Подписаться 3 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 2
@romazver94 Автор вопроса
На стороне приложения приём запроса выглядит так:
int CClientUserProfile::ApiGNAGetBalance()
{
if(!RUS_CLIENT)
r3dError("ApiGNAUpdateBalance");

CWOBackendReq req(this, "api_GNAGetBalance.aspx");
if(!req.Issue())
{
r3dOutToLog("GNAUpdateBalance FAILED, code: %d\n", req.resultCode_);
return req.resultCode_;
}

int balance = 0;
int nargs = sscanf(req.bodyStr_, "%d" , &balance);
if(nargs != 1)
{
r3dError("wrong answer for GNAUpdateBalance");
return 9;
}

ProfileData.Stats.GamePoints = balance;
return 0;
}

Т.е в субд на вывод должна идти переменная @Balance с данными из GamePoints
Ответ написан
Комментировать
Я бы написал как-то так:
create procedure [dbo].[WO_GNAGetBalance]
  @in_CustomerID int
, @balance       money        output  
, @result_code   int          output
, @result_msg    varchar(255) output
as
begin
set nocount on

if not exists (select top 1 * from LoginID where CustomerID = @in_CustomerID)
begin
  select @result_code = 6
       , @result_msg = 'no CustomerID'
  return 6
end

select @balance = sum(isnull(GamePoints, 0)) as GNABalance from LoginID
  where CustomerID = @in_CustomerID;
  
if @@error != 0
begin
  select @result_code = 7
       , @result_msg = 'Error get balance'
  return 7
end

select @result_code = 0
     , @result_msg = 'Success!'

return 0
end
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы