Как вызвать процедуру с ЗАПИСЬЮ ТИПА? - PullRequest
1 голос
/ 10 февраля 2020

Я выполнил процедуру вставки данных в пакет, и я хочу использовать ее вместе с ТИПОМ ЗАПИСИ, но я не знаю, как это назвать.

Я хочу, по крайней мере, иметь возможность ввода ' codi go 'с другими значениями в 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) )
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);

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

Ответы [ 3 ]

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

Вы НЕ МОЖЕТЕ делать то, что вы пытаетесь, по крайней мере так, как вы пытаетесь. Вы определили свою процедуру как получение структуры записи в качестве входной переменной, но затем ее вызов с одним значением. Это ошибка неправильный тип . Однако вы можете перегрузить процедуру в пакете.

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;
0 голосов
/ 10 февраля 2020

Добавьте функцию в качестве конструктора, которая будет инициализировать вашу запись. Определите все параметры как необязательные. И позвони. Например

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;
/
0 голосов
/ 10 февраля 2020

Да, вы не можете этого сделать. Вы должны передать полную запись, например:

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