Вставьте значения с PL / SQL Таблицы и записи - PullRequest
1 голос
/ 11 февраля 2020

Я выполнил процедуру в пакете для ввода данных в таблицу с использованием таблицы PL / SQL.

Я поместил в код некоторые данные для выполнения из пакета и проверил, что процедура работает, но я не знаю, как выполнить его с рабочего листа с данными, которые я ввожу.

CREATE TABLE TB_CRUD_MAC
   (    "K_CODIGO" NUMBER(10,0), 
    "A_NUMNIT" VARCHAR2(11 BYTE), 
    "N_NOMBRE" VARCHAR2(11 BYTE), 
    "N_APELLI" VARCHAR2(11 BYTE), 
    "F_FECHA" DATE, 
    "I_ESTADO" VARCHAR2(1 BYTE), 
    "K_CLASIF" VARCHAR2(1 BYTE)
   )
create or replace PACKAGE PK_CRUD_MAC AS

   TYPE R_REGISTRO IS RECORD (
     codigo TB_CRUD_MAC.K_CODIGO%TYPE := K_CODIGO.nextval,
     numnit TB_CRUD_MAC.A_NUMNIT%TYPE,
     nombre TB_CRUD_MAC.N_NOMBRE%TYPE,
     apelli TB_CRUD_MAC.N_APELLI%TYPE,
     fecha TB_CRUD_MAC.F_FECHA%TYPE,
     estado TB_CRUD_MAC.I_ESTADO%TYPE,
     clasif TB_CRUD_MAC.K_CLASIF%TYPE
     );

   TYPE T_REGISTRO IS TABLE OF R_REGISTRO;

   PROCEDURE PR_INSERT_LISTA (PT_REGISTRO IN OUT T_REGISTRO);   
END;
create or replace PACKAGE BODY PK_CRUD_MAC AS

    PROCEDURE PR_INSERT_LISTA (PT_REGISTRO IN OUT T_REGISTRO)

    IS

      BEGIN

      PT_REGISTRO := T_REGISTRO();
      PT_REGISTRO.extend(3);
      PT_REGISTRO(1).nombre :=  'Andres';
      PT_REGISTRO(2).nombre :=  'Martinez';

      INSERT INTO TB_CRUD_MAC VALUES (K_CODIGO.nextval, '123', PT_REGISTRO(1).nombre, 'AAA', '28/03/00', '1', '1');
      INSERT INTO TB_CRUD_MAC VALUES (K_CODIGO.nextval, '123', PT_REGISTRO(2).nombre, 'AAA', '28/03/00', '1', '1');

      END;

END;

Редактировать: я пытаюсь, но не работает:

DECLARE
reg PK_CRUD_MAC.T_REGISTRO := PK_CRUD_MAC.T_REGISTRO();
BEGIN
reg().extend;
reg(1).nombre := 'AAA';
PK_CRUD_MAC.PR_INSERT_LISTA(reg);
END;

Ошибка: PLS-00355: использование таблицы pl / sql в этом контексте запрещено

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Хорошее выполнение вашей процедуры - это всего лишь вопрос объявления переменной и вызова процедуры, скажем, в анонимном блоке PL / SQL:

declare
  l_table pk_crud_mac.t_registro;
begin
   pk_crud_mac.pr_insert_lista(l_table);
end;
/

Однако это не дает нам очень далеко , Возможно, вы не хотите, чтобы эти значения были жестко запрограммированы в процедуре. Вместо этого вы должны заполнить значения в вызывающей программе и передать их в процедуру.

Oh, и значение по умолчанию R_REGISTRO.codigo для значения последовательности может показаться изящной идеей, но это может вызвать проблемы с инициализацией. Вероятно, лучше обрабатывать K_CODI GO .nextval во внутренних частях кода.

Итак, переписать ваш пакет следующим образом ...

create or replace package pk_crud_mac as

   type r_registro is record (
     codigo tb_crud_mac.k_codigo%type,
     numnit tb_crud_mac.a_numnit%type,
     nombre tb_crud_mac.n_nombre%type,
     apelli tb_crud_mac.n_apelli%type,
     fecha tb_crud_mac.f_fecha%type,
     estado tb_crud_mac.i_estado%type,
     clasif tb_crud_mac.k_clasif%type
     );

   type t_registro is table of r_registro;

   procedure pr_insert_lista (pt_registro in out t_registro);   

end;
/

create or replace package body pk_crud_mac as

    procedure pr_insert_lista (pt_registro in out t_registro)
    is
    begin

      for idx in pt_registro.first()..pt_registro.last loop
        pt_registro(idx).codigo := k_codigo.nextval;
      end loop;

      forall idx in pt_registro.first()..pt_registro.last
        insert into tb_crud_mac values pt_registro(idx);

      end;

end;
/

... означает, что мы Назовите это так:

declare
  l_record pk_crud_mac.r_registro;
  l_table  pk_crud_mac.t_registro := new  pk_crud_mac.t_registro();
begin

  l_record.nombre :=  'Andres';
  l_record.numnit := '123';
  l_record.apelli := 'AAA';
  l_record.fecha  := date '2000-03-28';
  l_record.estado := '1';
  l_record.clasif := '1'; 

  l_table.extend();
  l_table(l_table.count()) := l_record;

  l_record.nombre :=  'Martinez';

  l_table.extend();
  l_table(l_table.count()) := l_record;

  pk_crud_mac.pr_insert_lista(l_table);

  for idx in 1..l_table.count() loop
    dbms_output.put_line(l_table(idx).codigo ||':' || l_table(idx).nombre);
  end loop;

end;
/

Если вы включите SERVEROUTPUT, вызов dbms_output.put_line покажет вам, что значение последовательности было присвоено каждой записи.

0 голосов
/ 11 февраля 2020

курсор, как вы имели в виду, не работает. попробуйте это:

DECLARE

    reg PK_CRUD_MAC.T_REGISTRO := PK_CRUD_MAC.T_REGISTRO();
BEGIN
    reg.extend;
    reg(1).numnit := 'Aaa';
    reg(1).nombre := 'aaa';
    PK_CRUD_MAC.PR_INSERT_LISTA(reg);

END;
/
...