Как вставить строку в любую таблицу с вызывающей процедурой внутри анонимного блока

#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;
/