Arhn - архитектура программирования

Процедура MSSQL для вставки строк и возврата вставленной строки/возвращаемого значения вызывает исключение при вызове

В первую очередь я разработчик Java с некоторым опытом работы с Oracle DB. Мне приходится использовать MSSQL server 2008 R2 для одного проекта. Я прошел краткое руководство по серверу mssql на udemy и начал создавать функции и процедуры.

Проблема тройная,

а) мне нужно передать несколько значений процедуре или функции, вставить их в таблицу и вернуться.

я читал в Интернете, что функции нельзя использовать для вставки в существующие таблицы ... скорее, они вставляют только во временные таблицы ... это правда? вы не можете вставить в таблицу и вернуть строку, вставленную в функцию на сервере MSSQL? В любом случае я использовал описанную ниже процедуру.

USE [KingsBayY]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

alter PROCEDURE test_fn_transaction_insert_log @receipt varchar(25), @amount varchar(25), @stdt varchar(25), 
@enddt varchar(25)

AS

SET NOCOUNT ON

INSERT INTO [TransactionLog] ( TimeStamp, CashierID, Total,RecurringStartDate, 
RecurringStopDate, CustomerID, ReceiptNumber, Voided, Attendee, ItemLookupCode)
SELECT  CURRENT_TIMESTAMP AS [TimeStamp], tr.CashierID, @amount, @stdt,@enddt,c.ID,tr.ReceiptNumber,
tr.Voided,it.ItemLookupCode, tr.Comment
from [Transaction] tr, TransactionEntry trent, Item it, Customer c
     where trent.TransactionID = tr.ID
     and trent.ItemID = it.ID
     and c.ID=tr.CustomerID
     and tr.ReceiptNumber=@receipt
--condition to ensure no duplicates are entered  and [TransactionLog].ID not in (select ID from [TransactionLog] where [TransactionLog].ID=tr.ID)

GO

На данный момент, когда я пытаюсь вызвать эту процедуру на Java, как показано ниже, она выдает исключение

public String saveTr(String a, String b, String c, String d) {
    try
    {
        SqlServerConn conn = new SqlServerConn();
        connect=conn.getConnection();
        String SQL = String.format("Exec test_fn_transaction_insert_log ?,?,?,?");  
        pstmt = connect.prepareStatement(SQL);
        pstmt.setString(1, a);
        pstmt.setString(2, b);
        pstmt.setString(3, c);
        pstmt.setString(4, d);
        pstmt.executeQuery();
    }
    catch (Exception e2)
    {
        e2.printStackTrace();
        return "fail";
    }
    //ArrayList<Transactions> list=getrowFromResultSet2(rs);

    return "success";
}

я получаю это исключение:

com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.

б) в приведенной выше процедуре мне нужно вернуть только что вставленную строку. Как я могу это сделать? или хотя бы получить код возврата?

c) это даже лучший способ написать эту процедуру для требования? можно ли использовать функции?


Ответы:


1

а) Правильно, функции в том смысле, в каком их называет SQL, не могут использоваться для выполнения какой-либо модификации данных. Однако то, что вы ищете, - это хранимая процедура. В жаргоне Java/C# хранимая процедура по-прежнему в основном является функцией, просто в SQL она различается с точки зрения того, что ей разрешено или не разрешено выполнять.

б) Если вам нужно вернуть строку, у вас есть два варианта. Во-первых, поскольку вы используете SQL Server 2008 или более позднюю версию, вы можете использовать предложение OUTPUT. Вы можете прочитать об этом в MSDN, но идея заключается в том, что между вашей вставкой и выбором вы просто вставляете оператор OUTPUT, который берет материал, который вы вставляете в данный момент, и выбирает его. В качестве альтернативы, если вы не хотите использовать предложение вывода, вы можете после вставки просто сделать оператор выбора, который возвращает значения, связанные с только что вставленным первичным ключом (ключами).

в) см. а. Процедура - это путь.

РЕДАКТИРОВАТЬ: ссылка на документацию MSDN OUTPUT. В частности, посмотрите, как это работает со вставками.

https://msdn.microsoft.com/en-us/library/ms177564.aspx

Вот хорошая статья о сводке различий функций и процедур в SQL.

http://www.dotnet-tricks.com/Tutorial/sqlserver/7EDL150912-Difference-between-Stored-Procedure-and-Function-in-SQL-Server.html

05.02.2015
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..