Обратите внимание, что существует дополнительное, недокументированное ограничение к INSERT INTO... Оператор EXEC: это не может быть вложено. Таким образом, сохраненный proc, который называет ДОЛЖНОСТНОЕ ЛИЦО (или любой, что он звонит в свою очередь) не может самостоятельно сделать INSERT INTO... ДОЛЖНОСТНОЕ ЛИЦО. Кажется, что существует единственная временная память для каждого процесса, которая накапливает результат, и если они будут вложены, то Вы получите ошибку, когда вызывающая сторона откроет это, и затем вызываемый пытается открыть его снова.
Matthieu, необходимо было бы поддержать отдельные временные таблицы для каждого "типа" результата. Кроме того, при казни того же многократно Вы, возможно, должны были бы добавить дополнительный столбец к тому результату указать, из какого вызова он следовал.
Вот пример класса, который, как мне кажется, выполняет то, что вы ищете. Удаление строк из 2D-массивов - непростое дело, потому что, как сказал @KalebBrasee, вы не можете действительно «удалить» их, а вместо этого вам нужно создать полностью новый 2D-массив. Надеюсь, это поможет!
import java.util.ArrayList;
import java.util.List;
public class Matrix
{
private double[][] data;
public Matrix(double[][] data)
{
int r= data.length;
int c= data[0].length;
this.data= new double[r][c];
for(int i = 0; i < r; i++) {
for(int j = 0; j < c; j++) {
this.data[i][j] = data[i][j];
}
}
}
/* convenience method for getting a
string representation of matrix */
public String toString()
{
StringBuilder sb = new StringBuilder(1024);
for(double[] row : this.data)
{
for(double val : row)
{
sb.append(val);
sb.append(" ");
}
sb.append("\n");
}
return(sb.toString());
}
public void removeRowsWithValue(final double value)
{
/* Use an array list to track of the rows we're going to want to
keep...arraylist makes it easy to grow dynamically so we don't
need to know up front how many rows we're keeping */
List<double[]> rowsToKeep = new ArrayList<double[]>(this.data.length);
for(double[] row : this.data)
{
/* If you download Apache Commons, it has built-in array search
methods so you don't have to write your own */
boolean found = false;
for(double testValue : row)
{
/* Using == to compares doubles is generally a bad idea
since they can be represented slightly off their actual
value in memory */
if(Double.compare(value,testValue) == 0)
{
found = true;
break;
}
}
/* if we didn't find our value in the current row,
that must mean its a row we keep */
if(!found)
{
rowsToKeep.add(row);
}
}
/* now that we know what rows we want to keep, make our
new 2D array with only those rows */
this.data = new double[rowsToKeep.size()][];
for(int i=0; i < rowsToKeep.size(); i++)
{
this.data[i] = rowsToKeep.get(i);
}
}
public static void main(String[] args)
{
double[][] test = { {1, 2, 3, 4, 5, 6, 7, 8, 9},
{6, 2, 7, 2, 9, 6, 8, 10, 5},
{2, 6, 4, 7, 8, 4, 3, 2, 5},
{9, 8, 7, 5, 9, 7, 4, 1, 10},
{5, 3, 6, 8, 2, 7, 3, 7, 2} };
//make the original array and print it out
Matrix m = new Matrix(test);
System.out.println(m);
//remove rows with the value "10" and then reprint the array
m.removeRowsWithValue(10);
System.out.println(m);
}
}
Вы не можете удалять элементы из структуры данных встроенного массива Java. Вам нужно будет создать новый массив, длина которого на единицу меньше, чем у первого массива, и скопировать все массивы в этот массив, ЗА ИСКЛЮЧЕНИЕМ того, который вы хотите удалить.
Использовать System.arraycopy
или используйте java.util.List
вместо массивов. ArrayList
имеет быстрый доступ к случайным элементам и медленный метод remove
, в отличие от LinkedList
. Вы должны выбирать сами.
В и вам нужно воссоздать массив и отбросить старый. Изменение размера существующего массива невозможно - если вам нужен этот тип структуры данных, вы должны построить матрицу на основе коллекций ( ArrayList
), там вы можете легко удалить строку .
Вернемся к массивам - идея состоит в том, чтобы собрать все строки (массивы double []), которые вы хотите сохранить, создать массив результатов с этими строками и заменить старый на новый в Matrix:
public void doSomethingWith(Matrix in) {
List<double[]> survivingRows = new ArrayList<double[]>();
for (double[] row:in.getRows()) {
if (isAGoodOne(row)) {
survivingRows.add(row);
}
}
double[][] result = new double[survivingRows][];
for (int i = 0; i < result.length; i++) {
result[i] = survivingRows.get(i);
}
in.setArray(result);
}
Мое мнение:
import java.util.Arrays;
public class RemoveArrayRow {
private static <T> T[] concat(T[] a, T[] b) {
final int alen = a.length;
final int blen = b.length;
if (alen == 0) {
return b;
}
if (blen == 0) {
return a;
}
final T[] result = (T[]) java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), alen + blen);
System.arraycopy(a, 0, result, 0, alen);
System.arraycopy(b, 0, result, alen, blen);
return result;
}
public static void main(String[] args) {
double[][] d = { {11, 2, 3, 4, 5, 6, 7, 8, 9, 0},
{12, 2, 3, 4, 5, 6, 7, 8, 9, 1},
{13, 2, 3, 4, 5, 6, 7, 8, 9, 2},
{14, 2, 3, 4, 5, 6, 7, 8, 9, 3},
{15, 2, 3, 4, 5, 6, 7, 8, 9, 4} };
//remove the fourth row:
// (1)
double[][] d1 = concat(Arrays.copyOf(d, 3), Arrays.copyOfRange(d, 4, 5));
// (2)
double[][] d2 = new double[d.length - 1][d[0].length];
System.arraycopy(d, 0, d2, 0, 3);
System.arraycopy(d, 4, d2, 3, 1);
System.out.print(d1.length);
System.out.print(d2.length);
}
}
(1)
Если исключить функцию concat ()
, используемую для объединения двух массивов, она будет выполнена в одной строке:
double [] [] d1 = concat (Arrays.copyOf (d, 3), Arrays.copyOfRange (d, 4, 5));
См. также этот вопрос . Отсюда код для функции concat ()
.
(2)
Этот метод быстрее и использует только уже доступные функции.
Мой синтаксис java немного ржавый, но следующий код, если он рассматривается как псевдокод, будет работать
public Matrix removeRows(Matrix input) {
int[][] output = new int[input.numRows][input.numColumns]();
int i = 0;
for (int[] row : input.rows()) { // Matrix.rows() is a method that returns an array of all the rows in the matrix
if (!row.contains(10)) {
output[i] = row;
}
}
return output