#sql #oracle #stored-procedures #plsql #parameters
#sql #Oracle #хранимые процедуры #plsql #параметры
Вопрос:
Я вызвал хранимую процедуру внутри пакета в pl / sql. Я хочу вставить таблицу с помощью этой процедуры, которую я вызвал. Анонимный блок, который я создаю, возвращает результат в sql developer, но не вставляет в таблицу, связанную с процедурой. Процедура, которую я написал, похожа на приведенную ниже (некоторые параметры являются параметрами out, поэтому я не помещал в раздел executions).
SET SERVEROUTPUT ON
DECLARE
p1 NUMBER;
p2 NUMBER;
p3 NUMBER;
p4 NUMBER;
p5 NUMBER;
p6 VARCHAR2(200);
p7 VARCHAR2(200);
p8 VARCHAR2(200);
p9 VARCHAR2(200);
p10 VARCHAR2(200);
p11 VARCHAR2(200);
p12 VARCHAR2(200);
p13 NUMBER;
p14 VARCHAR2(200);
p15 VARCHAR2(200) default 'UNRESOLVED';
p16 VARCHAR2(200) default null;
p17 NUMBER default 0;
p18 NUMBER default 0;
p19 VARCHAR2(200) default '_';
p20 VARCHAR2(200) default null;
p21 VARCHAR2(200) default 0;
p22 VARCHAR2(200) default '';
p23 VARCHAR2(200);
BEGIN
p3 := 0;
p4 := 1111111;
p6 := 'SCADA';
p7 := NULL;
p8 := NULL;
p9 := NULL;
p10 := NULL;
p11 := 0;
p12 := 'NORMAL';
p13 := NULL;
p14 := 'OMS';
p15 := 'UNRESOLVED';
p16 := NULL;
p17 := 0;
p18 := 0;
p19 := '_';
p20 := NULL;
p21 := 0;
p22 := '';
p23 := NULL;
PACKAGE.CREATE_RECORD_FOR_TABLE(
p1 => p1,
p2 => p2,
p3 => p3,
p4 => p4,
...
...
...
p22 => p22
p23 => p23
);
DBMS_OUTPUT.PUT_LINE('p5 = ' || p5);
DBMS_OUTPUT.PUT_LINE('p6 = ' || p6);
DBMS_OUTPUT.PUT_LINE('p4 = ' || p4);
END;
Должен ли я добавить оператор insert into в приведенную выше процедуру для вставки в таблицу? Заранее спасибо.
Комментарии:
1. Вы должны упростить это. Что мы должны делать с 23 параметрами? Достаточно было бы только одной, но — мы должны видеть таблицу, процедуру (которая вставляет строку в эту таблицу) и способ, которым вы вызываете эту процедуру. Итак: одна таблица с одним столбцом одна процедура только с одним параметром.
2. Скалярные переменные неявно равны нулю, когда вы их объявляете, поэтому нет смысла присваивать им значение null, например,
p16 varchar2(200) default null;
может быть упрощен доp16 varchar2(200);
иp16 := null;
ничего не делает (это уже null, потому что ему не было присвоено значение). Если весь смысл блока заключается в вызове одной процедуры, кажется, что задержка и передача 23 переменных могут усложнять ситуацию, если только процедура не используетout
параметры, поскольку им потребуется локальная переменная для хранения результата. Поэтому все зависит от того, как определена процедура.
Ответ №1:
Если ваш код создает запись для одной таблицы, это было бы намного проще в использовании ROWTYPE
. С помощью ROWTYPE
вам не придется определять одну переменную для каждого столбца или беспокоиться о том, чтобы типы ваших переменных соответствовали типу столбца. Это также будет полезно, если позже в определение таблицы будут внесены какие-либо изменения, вам не придется определять дополнительные переменные (или, возможно, параметры). Использование ROWTYPE
переменной также поддерживает параметры из процедуры, если это необходимо.
Настройка
Это примерная таблица, которую я создал, чтобы продемонстрировать приведенный ниже тестовый пример.
CREATE TABLE test_table
(
col1 NUMBER,
col2 NUMBER,
col3 VARCHAR2 (200),
col4 VARCHAR2 (200)
);
Пример
DECLARE
l_table test_table%ROWTYPE;
PROCEDURE create_record_with_rowtype (p_table IN OUT test_table%ROWTYPE)
IS
BEGIN
p_table.col4 := 'SOMEVALUE';
INSERT INTO test_table
VALUES p_table;
END;
PROCEDURE create_record_with_parameters (p_col1 IN test_table.col1%TYPE,
p_col2 IN test_table.col2%TYPE,
p_col3 IN test_table.col3%TYPE,
p_col4 IN OUT test_table.col4%TYPE)
IS
BEGIN
p_col4 := 'NEWVALUE';
INSERT INTO test_table (col1,
col2,
col3,
col4)
VALUES (p_col1,
p_col2,
p_col3,
p_col4);
END;
BEGIN
l_table.col1 := 0;
l_table.col2 := 1111111;
l_table.col3 := 'SCADA';
l_table.col4 := NULL;
create_record_with_rowtype (l_table);
create_record_with_parameters (p_col1 => l_table.col1,
p_col2 => l_table.col2,
p_col3 => l_table.col3,
p_col4 => l_table.col4);
END;
/