Oracle 如何使用类型记录调用过程?

Oracle 如何使用类型记录调用过程?,oracle,plsql,Oracle,Plsql,我在一个包中执行了一个数据插入过程,我想将它与记录类型一起使用,但我不知道该怎么称呼它 我希望至少能够输入'codigo'和null中的其他值 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

我在一个包中执行了一个数据插入过程,我想将它与记录类型一起使用,但我不知道该怎么称呼它

我希望至少能够输入'codigo'和null中的其他值

    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) )

是的,你不能那样做。您必须传入完整的记录,例如:

declare
reg PK_CRUD_MAC.R_REGISTRO;
begin
   reg.codigo := 6;
   PK_CRUD_MAC.PR_INSERT_REGISTRO(reg);
end;
但是,如果您只想插入与表列定义类型相同的记录,则不需要创建自己的pl/sql记录。您可以执行以下操作:

create or replace PACKAGE PK_CRUD_MAC2 AS
PROCEDURE PR_INSERT_REGISTRO (P_R_REGISTRO TB_CRUD_MAC%ROWTYPE);
END;

create or replace PACKAGE BODY PK_CRUD_MAC2 AS
    PROCEDURE PR_INSERT_REGISTRO (P_R_REGISTRO TB_CRUD_MAC%ROWTYPE)
      IS   
      BEGIN
       INSERT INTO TB_CRUD_MAC VALUES P_R_REGISTRO;
      END;
END;

是的,你不能那样做。您必须传入完整的记录,例如:

declare
reg PK_CRUD_MAC.R_REGISTRO;
begin
   reg.codigo := 6;
   PK_CRUD_MAC.PR_INSERT_REGISTRO(reg);
end;
但是,如果您只想插入与表列定义类型相同的记录,则不需要创建自己的pl/sql记录。您可以执行以下操作:

create or replace PACKAGE PK_CRUD_MAC2 AS
PROCEDURE PR_INSERT_REGISTRO (P_R_REGISTRO TB_CRUD_MAC%ROWTYPE);
END;

create or replace PACKAGE BODY PK_CRUD_MAC2 AS
    PROCEDURE PR_INSERT_REGISTRO (P_R_REGISTRO TB_CRUD_MAC%ROWTYPE)
      IS   
      BEGIN
       INSERT INTO TB_CRUD_MAC VALUES P_R_REGISTRO;
      END;
END;

你不能做你正在尝试的事情,至少不能用你正在尝试的方式。您已经将过程定义为将记录结构作为输入变量,然后使用单个值调用它。这是您得到的错误类型错误
但是,您可以在包中重载该过程

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

procedure pr_insert_registro (p_r_registro r_registro);
procedure pr_insert_registro (codigo tb_crud_mac.k_codigo%type);
end;

create or replace package body pk_crud_mac as
    procedure pr_insert_registro (p_r_registro r_registro)
      is   
      begin
       insert into tb_crud_mac values p_r_registro;
      end;

    procedure pr_insert_registro (p_codigo tb_crud_mac.k_codigo%type)
      is   
      begin
       insert into tb_crud_mac values (p_codigo);
      end;    
end;

你不能做你正在尝试的事情,至少不能用你正在尝试的方式。您已经将过程定义为将记录结构作为输入变量,然后使用单个值调用它。这是您得到的错误类型错误
但是,您可以在包中重载该过程

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

procedure pr_insert_registro (p_r_registro r_registro);
procedure pr_insert_registro (codigo tb_crud_mac.k_codigo%type);
end;

create or replace package body pk_crud_mac as
    procedure pr_insert_registro (p_r_registro r_registro)
      is   
      begin
       insert into tb_crud_mac values p_r_registro;
      end;

    procedure pr_insert_registro (p_codigo tb_crud_mac.k_codigo%type)
      is   
      begin
       insert into tb_crud_mac values (p_codigo);
      end;    
end;

添加一个函数作为将初始化记录的构造函数。将所有参数定义为可选参数。然后打电话。比如说

create table TB_CRUD_MAC(
  K_CODIGO number(10) 
 ,A_NUMNIT varchar2(11)
 ,N_NOMBRE varchar2(11)
 ,N_APELLI varchar2(11)
 ,F_FECHA  date
 ,I_ESTADO varchar2(1)
 ,K_CLASIF varchar2(1) 
);

create or replace package PK_CRUD_MAC 
is
  subtype R_REGISTRO is TB_CRUD_MAC%rowtype;

  function New (pK_CODIGO  TB_CRUD_MAC.K_CODIGO%type := null
               ,pA_NUMNIT  TB_CRUD_MAC.A_NUMNIT%type := null
               ,pN_NOMBRE  TB_CRUD_MAC.N_NOMBRE%type := null
               ,pN_APELLI  TB_CRUD_MAC.N_APELLI%type := null
               ,pF_FECHA   TB_CRUD_MAC.F_FECHA%type  := null 
               ,pI_ESTADO  TB_CRUD_MAC.I_ESTADO%type := null
               ,pK_CLASIF  TB_CRUD_MAC.K_CLASIF%type := null) return R_REGISTRO;

  procedure PR_INSERT_REGISTRO (P_R_REGISTRO R_REGISTRO);

end;
/

create or replace package body PK_CRUD_MAC 
is
  function New (pK_CODIGO  TB_CRUD_MAC.K_CODIGO%type := null
               ,pA_NUMNIT  TB_CRUD_MAC.A_NUMNIT%type := null
               ,pN_NOMBRE  TB_CRUD_MAC.N_NOMBRE%type := null
               ,pN_APELLI  TB_CRUD_MAC.N_APELLI%type := null
               ,pF_FECHA   TB_CRUD_MAC.F_FECHA%type  := null 
               ,pI_ESTADO  TB_CRUD_MAC.I_ESTADO%type := null
               ,pK_CLASIF  TB_CRUD_MAC.K_CLASIF%type := null) return R_REGISTRO
  is
    vR_REGISTRO R_REGISTRO;
  begin
    vR_REGISTRO.K_CODIGO := pK_CODIGO;
    vR_REGISTRO.A_NUMNIT := pA_NUMNIT;
    vR_REGISTRO.N_NOMBRE := pN_NOMBRE;
    vR_REGISTRO.N_APELLI := pN_APELLI;
    vR_REGISTRO.F_FECHA  := pF_FECHA ;
    vR_REGISTRO.I_ESTADO := pI_ESTADO;
    vR_REGISTRO.K_CLASIF := pK_CLASIF;

    return vR_REGISTRO;
  end;

  procedure PR_INSERT_REGISTRO (P_R_REGISTRO R_REGISTRO)
  is   
  begin
   insert into TB_CRUD_MAC values P_R_REGISTRO;
  end;

end;
/


begin
    PK_CRUD_MAC.PR_INSERT_REGISTRO(PK_CRUD_MAC.New(pK_CODIGO => :K_CODIGO));
    -- commit;
end;
/

添加一个函数作为将初始化记录的构造函数。将所有参数定义为可选参数。然后打电话。比如说

create table TB_CRUD_MAC(
  K_CODIGO number(10) 
 ,A_NUMNIT varchar2(11)
 ,N_NOMBRE varchar2(11)
 ,N_APELLI varchar2(11)
 ,F_FECHA  date
 ,I_ESTADO varchar2(1)
 ,K_CLASIF varchar2(1) 
);

create or replace package PK_CRUD_MAC 
is
  subtype R_REGISTRO is TB_CRUD_MAC%rowtype;

  function New (pK_CODIGO  TB_CRUD_MAC.K_CODIGO%type := null
               ,pA_NUMNIT  TB_CRUD_MAC.A_NUMNIT%type := null
               ,pN_NOMBRE  TB_CRUD_MAC.N_NOMBRE%type := null
               ,pN_APELLI  TB_CRUD_MAC.N_APELLI%type := null
               ,pF_FECHA   TB_CRUD_MAC.F_FECHA%type  := null 
               ,pI_ESTADO  TB_CRUD_MAC.I_ESTADO%type := null
               ,pK_CLASIF  TB_CRUD_MAC.K_CLASIF%type := null) return R_REGISTRO;

  procedure PR_INSERT_REGISTRO (P_R_REGISTRO R_REGISTRO);

end;
/

create or replace package body PK_CRUD_MAC 
is
  function New (pK_CODIGO  TB_CRUD_MAC.K_CODIGO%type := null
               ,pA_NUMNIT  TB_CRUD_MAC.A_NUMNIT%type := null
               ,pN_NOMBRE  TB_CRUD_MAC.N_NOMBRE%type := null
               ,pN_APELLI  TB_CRUD_MAC.N_APELLI%type := null
               ,pF_FECHA   TB_CRUD_MAC.F_FECHA%type  := null 
               ,pI_ESTADO  TB_CRUD_MAC.I_ESTADO%type := null
               ,pK_CLASIF  TB_CRUD_MAC.K_CLASIF%type := null) return R_REGISTRO
  is
    vR_REGISTRO R_REGISTRO;
  begin
    vR_REGISTRO.K_CODIGO := pK_CODIGO;
    vR_REGISTRO.A_NUMNIT := pA_NUMNIT;
    vR_REGISTRO.N_NOMBRE := pN_NOMBRE;
    vR_REGISTRO.N_APELLI := pN_APELLI;
    vR_REGISTRO.F_FECHA  := pF_FECHA ;
    vR_REGISTRO.I_ESTADO := pI_ESTADO;
    vR_REGISTRO.K_CLASIF := pK_CLASIF;

    return vR_REGISTRO;
  end;

  procedure PR_INSERT_REGISTRO (P_R_REGISTRO R_REGISTRO)
  is   
  begin
   insert into TB_CRUD_MAC values P_R_REGISTRO;
  end;

end;
/


begin
    PK_CRUD_MAC.PR_INSERT_REGISTRO(PK_CRUD_MAC.New(pK_CODIGO => :K_CODIGO));
    -- commit;
end;
/

你有错误吗?如果是,请发布详细信息。请在包中显示TB_CRUD_mac表的定义。我没有错误,但我尝试执行只传递他“codigo”的过程,我有错误<代码>执行PK\U CRUD\U MAC.PR\U INSERT\U注册表(6)那么错误消息是什么呢?
创建表TB_CRUD_MAC”(“K_CODIGO”编号(10,0),“A_NUMNIT”VARCHAR2(11字节),“N_NOMBRE”VARCHAR2(11字节),“N_APELLI”VARCHAR2(11字节),“F_FECHA”日期,“I_ESTADO”VARCHAR2(1字节),“K_CLASIF”VARCHAR2(1字节))
您是否收到错误?如果是,请发布详细信息。请在包中显示表TB\u CRUD\u MAC的定义我没有错误,但我尝试执行只传递“codigo”的过程,但我有错误。
EXEC PK\u CRUD\u MAC.PR\u INSERT\u REGISTRO(6);
那么错误消息是什么,请?
创建表TB\u CRUD\u MAC”(“K_CODIGO”数字(10,0),“A_NUMNIT”VARCHAR2(11字节),“N_NOMBRE”VARCHAR2(11字节),“N_APELLI”VARCHAR2(11字节),“F_FECHA”日期,“I_ESTADO”VARCHAR2(1字节),“K_CLASIF”VARCHAR2(1字节))