簡體   English   中英

使用 PL/SQL 表和記錄插入值

[英]Insert values with PL/SQL Tables and Record

我在包中完成了一個過程,使用 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 表

像您想的那樣的游標不起作用。 嘗試這個:

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

運行您的過程只是聲明一個變量並調用該過程的問題,例如在匿名 PL/SQL 塊中:

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

然而,這並沒有讓我們走得很遠。 可能您不想在程序中對這些值進行硬編碼。 相反,您應該填充調用程序中的值並將它們傳遞給過程。

哦,默認R_REGISTRO.codigo為序列值似乎是一個R_REGISTRO.codigo主意,但它可能會導致初始化問題。 在代碼內部處理 K_CODIGO.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的調用將顯示序列值已分配給每條記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM