如何使用TYPE作为参数调用和执行Oracle存储过程

时间:2018-10-19 13:56:35

标签: oracle stored-procedures

这是包装规格:

PROCEDURE Save_Countries
    ( p_inst_id Number,
      p_CountryList  IN T_COUNTRY_TYPE
    )
AS
v_count number;
BEGIN
            for i in p_CountryList.first..p_CountryList.last loop

                  insert into countries (INST_ID, COUNTRY_NAME, COUNTRY_CODE)
                        values (p_inst_id, p_CountryList(i).COUNTRY_NAME, p_CountryList(i).COUNTRY_CODE);
            end loop;
      Commit;
end Save_Countries ;

这是类型规范:

create or replace TYPE OBJ_COUNTRY FORCE as OBJECT (
      COUNTRY_ID        NUMBER(10),
      COUNTRY_NAME      VARCHAR2(255),
      COUNTRY_CODE      VARCHAR2(6)
);
create or replace TYPE T_COUNTRY_TYPE as TABLE OF OBJ_COUNTRY;

到目前为止,我有这个:

DECLARE
  P_INST_ID NUMBER;
  P_COUNTRYLIST T_COUNTRY_TYPE;
BEGIN
  P_INST_ID := 255;

  PKG_TEST.SAVE_COUNTRIES(
    P_INST_ID => P_INST_ID,
    P_COUNTRYLIST => P_COUNTRYLIST
  );
END;

问题 我试图从我的Oracle SQL Developer调用存储过程。我如何初始化列表(TYPE),以便可以将其作为参数传递。我已经在Google周围搜索,但是找不到任何可以帮助您的东西。

1 个答案:

答案 0 :(得分:1)

对于嵌套表,必须初始化并将元素分配给集合。

DECLARE
  P_INST_ID NUMBER;
  P_COUNTRYLIST T_COUNTRY_TYPE := T_COUNTRY_TYPE(); --initialization
BEGIN
  P_INST_ID     := 255;
  P_COUNTRYLIST.extend(2); --allocate 2 null elements.
  P_COUNTRYLIST(1) :=  OBJ_COUNTRY(1,'INDIA','IND'); --set the values
  P_COUNTRYLIST(2) :=  OBJ_COUNTRY(2,'AUSTRALIA','AUS');
--To assign n more elements, use P_COUNTRYLIST.extend(n);



  PKG_TEST.SAVE_COUNTRIES(
    P_INST_ID => P_INST_ID,
    P_COUNTRYLIST => P_COUNTRYLIST
  );
END;
/

Demo