[英]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.